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