Beräkningsvetenskap I Mars 2008 Laboration: Om fel Inledning Datorer är ändliga maskiner medan matematiska funktioner och reella tal vanligen är oändliga till sin natur. En kontinuerlig matematisk funktion f(x) består av oändligt många punkter. När funktioner och tal ska behandlas i en dator måste de på något överföras till ett ändligt minnesutrymme, och detta medför att talen vanligen avrundas, vilket innebär att man inför ett fel. Här ska vi titta på vilka typer av fel det är fråga om och hur man mäter storleken på felet. Kort introduktion I princip har man två typer av fel vid datorberäkningar • diskretiseringsfel • avrundningsfel Diskretiseringsfelet uppstår när man lagrar något oändligt, t ex en matematisk funktion, som något ändligt i en dator. Förutom detta fel så avrundar datorn alla reella tal som lagras eftersom lagringsutrymmet är begränsat. Att göra sedan du läst introduktionen ovan 1. Diskretiseringsfel När man ska hantera och lagra matematiska funktioner är man tvungen att lagra dessa i form av ett ändligt antal punkter. Det enklaste exemplet på detta är vid plottning av funktioner. Kopiera filen diskretisering.m. Det är en kommandofil som alltså körs genom att ge kommandot diskretisering i MATLABs kommandofönster. a) Kör kommandofilen och följ instruktionen. Ge olika heltalsvärden (> 0), men börja med litet tal och gå uppåt. Titta på hur grafen ser ut och jämför med den korrekta. Det fel, den skillnad som finns mellan den korrekta och den uppritade, kallas för diskretiseringsfel. Var uppmärksam på: > Hur diskretiseringsfelet ändras när man ökar antalet punkter > Fundera på om det finns någon anledning att inte alltid använda ett väldigt stort antal punkter, t ex 1 miljon punkter. Beräkningsvetenskap I Mars 2008 2. Hur mäter man storleken på fel? När man utför datorberäkningar och inte får exakta lösningar utan approximationer är det viktigt att veta hur stort felet är. Man måste alltså kunna mäta felet. Man antingen mäta det absoluta felet eller det relativa felet. Dessa definieras genom Absolut fel: xkorrekt − x fel Relativt fel xkorrekt − x fel xkorrekt Det relativa felet är ”enhetslöst”, dvs inte beroende av vilken enhet man arbetar i. Genom att multiplicera med 100 får man fram felet i procent. Det absoluta felet å andra sidan beror av storleken på de tal man arbetar med, t ex på vilken enhet som används. Ladda ner MATLAB-filen absrelfel.m från kurshemsidan. Denna innehåller ett kort program där du kan testa det relativa och absoluta felet för olika fall. a) Antag att du köper en varm korv på stan. Den kostar 15 kr, men du lämnar 20 kr och glömmer ta emot växeln. Hur mycket har du förlorat i absoluta respektive relativa termer, dvs vilket är absolut respektive relativt fel. Kör absrelfel och mata in siffrorna ovan. b) Antag att du köper ett nytt hus för 1975000 kr. Du betalar 1980000 kr (men får då lite gamla skräpmöbler som råkar finnas kvar). Hur mycket har du förlorat i absoluta respektive relativa termer, dvs vilket är absolut respektive relativt fel. Kör absrelfel och mata in siffrorna ovan. c) När Matlab utför beräkningar kommer successiva lösningar i beräkningarna hela tiden avrundas. Det innebär att man får successiva avrundningsfel. Testa vilken storleksordning felet ligger på genom att utföra beräkningen A-1 A för någon matris. Den exakta lösningen blir enhetsmatrisen. Använd t ex en slumpmatris. Koden kan t ex se ut på följande sätt (det som står efter procenttecken (%) är enbart förklarande kommentarer och ska inte skrivas in i Matlab): >> A = rand(10); % Skapar en 10*10-matris med slumptal >> I_ber = inv(A)*A; % Beräknar inversen av A multiplicerat med A >> I_exakt = eye(10); % Skapar en 10*10 enhetsmatris, dvs exakt lösning >> absrelfel; Mata sedan in det exakta respektive det beräknade värdet och undersök storleksordningen på det relativa felet. Testa gärna att ändra på storlekarna på matrisen eller att generera slumpmatrisen flera gånger. Var uppmärksam på: > Storleksordningen på det relativa felet när beräkningar utförs i Matlab