4.1 Felanalys Vill man hårddra det hela, kan man påstå att det inte finns några tal i den tillämpade matematiken, bara intervall. Man anger till exempel inte ett uppmätt värde till 134.78 meter utan att beröra dess osäkerhet. Beroende på metoden att mäta skriver man 134.78 ± 0.05 meter eller 134.78±0.005 meter. Antingen är då intervallet [134.73, 134.83] eller [134.775, 134.785]. Ju bättre mätmetoder desto kortare intervall i vilket det sanna värdet ligger. Om vi säger att det exakta talet är a, som vi låter beskrivas av ett närmevärde a, så definierar vi det absoluta felet i närmevärdet a = a a Till exempel om a = 123.4 är det exakta värdet som vi egentligen aldrig kan ta reda på och det uppmätta närmevärdet är a = 123.2, så är det absoluta felet a = a a = 123.2 123.4 = 0.2. Observera att vi alltså aldrig kan bestämma a eftersom vi inte känner a. Det relativa felet skriver vi a a något som vi heller aldrig kan bestämma. Men eftersom ofta a << a så är det rimligt att tänka sig a a a a Om man skriver ett tal utan tillhörande fel och det heller inte framgår av sammanhanget att talet är exakt, förutsätts talet korrekt avrundat, det vill säga det absoluta felets belopp är högst 1 2 enhet i sista siffran. 56.78 56.78 ±0.005 5001 5001 ±0.5 58000 58000 ±0.5 5.8 10 4 58000 ±500 Den n:e signifikanta siffran i ett tal är den n siffran i talet bortsett från eventuella inledande nollor. Ett tal avrundas till n signifikanta siffror: Om siffrorna efter den n:e siffran bildar ett tal > 1 2 enhet i denna, höjd den. Om talet är = 1 2 avrundas den till jämn siffra annars bibehålls den. Den senare delen av regeln ovan efterlevs inte alltid, utan man höjer alltid då 1 2. Håkan Strömberg 1 KTH Syd
4.1. FELANALYS Om vi har en följd av tal 12.0, 14.5, 17.5, 19.0, 21.5, 22.5 som vi ska avrunda till heltal får vi med den första regeln ovan 12,14,18,19,22,22 höjer vi då 1 2 får vi 12,15,18,19,22,23 Just i det fall vi har heltal a + 0.5 som ska avrundas till heltal kan man tydligt se ett systematiskt fel i den enklare regeln. 4.1.1 Olika fel Låt f = f(x. Absoluta felet ges då av: f f (x x Låt f = f(x,y. Absoluta felet ges då av: f f x(x x + f y(x y Om x ǫ, där ǫ kallas felgräns får man maximalfeluppskattningen genom f f (x ǫ Eller för den andra formeln: f f x(x ǫ x + f y(x ǫ y Fel man kan göra något åt R B, beräkningsfel, som uppstår då numeriska beräkningar inte utförs exakt. R T, trunkeringsfel, som uppstår då en algoritm avbryts. Fel man inte kan göra något åt R X, som finns i givna indata. Begreppet full noggrannhet i de numeriska beräkningarna innebär att R B + R T 0.2 R X Exempel 1. Bestäm maximala felet hos f, då x = 2.000 ± 0.005, y = 3.000 ± 0.005 och z = 4.000 ± 0.005 f = 3x + y z Det största värdet f kan anta är då på samma sätt, det minsta värdet f max = 3 2.005 + 3.005 3.995 = 5.025 f min = 3 1.995 + 2.995 4.005 = 4.975 Håkan Strömberg 2 KTH Syd
Med hjälp av detta kan vi skriva f = 5.000 ± 0.025 Nu är det ofta jobbigt att bestämma dessa max och min. Istället inför man följande formler f = x + y f ǫ x + ǫ y f = x y f ǫ x + ǫ y f = x y f f ǫ xx ǫ + y y f = x f y f ǫ xx + ǫy y Med hjälp av dessa får vi där som ger f 3 x + y + z x 0.5 10 2 y 0.5 10 2 y 0.5 10 2 R X 5 0.5 10 2 = 2.5 10 2 f = 3 2.000 + 3.000 4.000 = 5.000 R B = 0 R T = 0 som ger samma resultat f = 5.000 ± 0.025. Nu är det inte alltid så Exempel 2. Beräkna med full noggrannhet där de tre talen är korrekt avrundade Vi har ett uttryck av typen Formlerna ovan ger nu f f ǫ xx ǫ + y y + ǫ zz R X ( f 1 2.4897 1.980 16.387 x y z x = 2.4897 x 0.5 10 4 y = 1.980, y 0.5 10 3 z = 16.387, z 0.5 10 3 2.4897 + 10 2.98 + 10 16.387 f = 2.4897 1.980 16.387 0.31 R X 0.31 31 10 4 < 10 4 Då vi vet att R x < 10 4 och känner formeln R B + R T 0.2 R X R B 0.2 10 4 0.5 10 4 < 3.1 10 4 eftersom det inte finns några trunkeringsfel. Det räcker alltså att utföra alla beräkningar med en noggrannhet som är 10 5 < 0.2 10 4 för att sedan avrunda svaret till 4 decimaler. Först utför vi 2.4897 1.980 = 4.9296060 som kan avrunda till 4.92961. Sedan 4.92961/16.387 0.3008244340 som vi kan avrunda till 0.30082. Vi kan nu avrunda detta resultat till 0.3008 och är därmed säkra att uttryckets värde kan skrivas 0.3008 ± 0.00005. Håkan Strömberg 3 KTH Syd
4.1. FELANALYS I skolan lärde vi oss regeln att räkna med fler decimaler än vi behövde i svaret. Om vi i våra program tar till double så är det ofta tillräckligt. Men inte alltid! Exempel 3. Bestäm den minsta roten till ekvationen x 2 20x + 1 = 0 genom att utför de nödvändiga beräkningarna med två signifikanta siffror. Vi får x = 10 100 1 Vi får då 99 9.9 och den minsta roten till x 1 0.1. Med större noggrannhet får vi roten till x 1 0.050126. Då 10 99 = (10 99(10 + 99 10 + 99 = 100 99 10 + 99 1 10 + 9.9 0.050 Vi har gjort denna beräkning med samma noggrannhet som i första försöket och fått ett resultat som ligger betydligt närmare sanningen. Detta exempel vill visa hur riskabelt det är att subtrahera två tal, där ett eller båda är behäftade med fel och ungefär lika stora. Observera att vi genom att förlänga med konjugatet har att utföra en addition istället. Exempel 4. Låt oss summera 1 + 2 +... + 100 För varje rot tar vi bara med de korrekt avrundade decimaler. Vi får 1 + 1.41 + 1.73 +... + 10 671.48. Hur bra är detta resultat? Genom Maple får vi att summan är 671.46294710314775393. Det skiljer sig ju knappt två enheter i andra decimalen! Hur kan det komma sig? Det största tänkbara felet är ǫ = 100 0.005 = 0.5. Vårt resultat är betydligt bättre än så. Om vi avrundar till en decimal för varje rot får vi summan 671.0. Här skulle felet ha kunnat varit ǫ = 100 0.05 = 5 men är bra en tiondel av detta. Exempel 5. Man vill bestämma S = 1 1 2 + 1 3... 1 2000 med 3 korrekta decimaler. Frågan är nu hur noggranna vi behöver vara vid beräknandet av varje term. Antal decimaler 1 2 3 4 5 6 7 8 Summa 3.9 6.16 8.499 8.1764 8.1783 8.178373 8.1783686 8.17836793 Med 20 korrekta decimaler är resultatet S = 8.1783681036102824096. Av tabellen att döma behöver vi använda 5 korrekta decimaler för varje term. Håkan Strömberg 4 KTH Syd
Exempel 6. Antag att x 1 och x 2 är approximationer av X 1 och X 2 med ett felen ǫ 1 och ǫ 2, så att X 1 = x 1 + ǫ 1 och X 2 = x 2 + ǫ 2. Vi vill bestämma X 1 X 2 genom att beräkna x 1 x 2 X 1 X 2 x 1 x 2 X 1 X 2 är då det relativa felet. Detta fel är ungefär lika med ǫ 1 X 1 + ǫ 2 X 2 ǫ 1 x 1 + ǫ 2 x 2 Vi har X 1 X 2 = (x 1 + ǫ 1 (x 2 + ǫ 2 X 1 X 2 = x 1 x 2 + x 1 ǫ 2 + x 2 ǫ 1 + ǫ 1 ǫ 2 X 1 X 2 x 1 x 2 x 1 ǫ 2 + x 2 ǫ 1 X 1 X 2 x 1 x 2 X 1 X 2 x 1ǫ 2 +x 2 ǫ 1 X 1 X 2 X 1 X 2 x 1 x 2 X 1 X 2 ǫ 2 X 2 + ǫ 1 X 1 I ord: Då man multiplicerar två tal med givna felgränser blir det relativa felet hos produkten ungefär summan av de relativa felen hos de två talen. 4.1.2 Multiplikation av polynom När man med hjälp av en dator vill utföra multiplikationen av de två polynomen (x 3 + 4x 2 3x + 4(2x 2 3x + 1 kan det till att börja med vara lämpligt att lagra koefficienterna i två arrayer int a[]={4,-3,4,1}; int b[]={1,-3,2} int gta=3; gtb=2; samt aktuella gradtal. 4.1.3 Polynomdivision Polynomdivision kan dyka upp i samband med ekvationslösning. Antag att vi har ekvationen x 3 2x 2 2x 3 = 0 och känner till att en rot är x 1 = 3. Genom att utföra divisionen x 3 2x 2 2x 3 x 3 Håkan Strömberg 5 KTH Syd
4.1. FELANALYS får vi ett x 2 -uttryck. Då vi låser motsvarande andragradsekvation får vi så de återstående två rötterna. Så här går polynomdivisionen till: x 3 2x 2 2x 3 : x 3 = x 2 + x + 1 x 3 3x 2 x 2 2x x 2 3x x 3 x 3 0 När vi sedan löser ekvationen x 2 + x + 1 = 0 får vi rötterna x 2,3 = 1 2 (1 ± i 3 4.1.4 Minsta kvadratmetoden Givet ett antal punkter i första kvadranten. (1,8.3,(3,13.7,(7,25.1, (10,36.0,(12,42.1,(19, 60.8 Plottar vi dessa får vi Det ser nästan ut som om punkterna ligger på en linje. Teoretiskt är 60 50 40 30 20 10 2.5 5 7.5 10 12.5 15 17.5 20 Figur 4.1: det också tänkt att de ska göra det, men eftersom vissa mätfel har gjorts då punkterna har bestämts stämmer det inte riktigt. Trots det är man intresserad av ekvationen för den linje som teoretiskt ligger bakom. Om vi antar att ekvationen är y = ax + b, så är det alltså a och b som ska bestämmas. Hade mästserien bestått av endast två punkter (x 1,y 1 och (x 2,y 2 hade man alltid hittat en ekvation vars linje går genom dessa punkter genom att lösa ut a och b i ekvationssystemet { y1 = ax 1 + b y 2 = ax 2 + b Men i detta fall har vi inte mindre än 6 ekvationer och endast 2 obekanta. 8.3 = a + b 13.7 = 3a + b 25.1 = 7a + b 36.0 = 10a + b 42.1 = 12a + b 60.8 = 19a + b Håkan Strömberg 6 KTH Syd
Detta kallas ett överbestämt ekvationssystem, som matematiskt har en lösning endast då 4 ekvationer är identiska med de två övriga. Så är inte det fallet här och vi vill hitta den linje som ur minsta kvadratmetodens mening anpassar bäst till de givna punkterna. Om vi skriver om ekvationssystemet med de matrisbeteckningar vi använt tidigare får vi Med tidigare kända beteckningar 1 1 2 1 7 1 10 1 12 1 19 1 ( a b Ax = b Med minsta kvadratmetoden som definieras som = A t Ax = A t b 8.3 13.7 25.1 36.0 42.1 60.8 Får vi med vårt exempel ( 1 2 7 10 12 19 1 1 1 1 1 1 som ger 1 1 2 1 7 1 10 1 12 1 19 1 ( 664 52 52 6 ( a b ( a b = = ( 1 2 7 10 12 19 1 1 1 1 1 1 ( 2245.5 186 8.3 13.7 25.1 36.0 42.1 60.8 Ger oss lösningen a = 5.264 och b = 2.970. Plottar vi linjen tillsammans med punkterna får vi 60 50 40 30 20 10 2.5 5 7.5 10 12.5 15 17.5 20 Figur 4.2: Resultatet ser bra ut Håkan Strömberg 7 KTH Syd
4.1. FELANALYS Det hela hade vi kunnat ordna i Maple genom Fit(a*x+b,[1,3,7,10,12,19],[8.3,13.7,25.1,36.0,42.1,60.8],x; 2.96953125 x + 5.2640625 Problem 1. Avrunda till 3 signifikanta siffror Problem 2. a 1.2345 b 1.2365 c 1.2350 d 1.245 e 0.9945 d 0.9955 a Skriv en sats i C som avrundar talet float a till 3 korrekta decimaler efter den enklare regeln ovan b Skriv en rutin i C som avrundar talet float a till 3 korrekta decimaler efter den mer komplicerade regeln ovan. Problem 3. Bestäm max och min för f då f = a b c då a = 4.0 ± 0.1, b = 4.2 ± 0.1 och a = 3.9 ± 0.1 Problem 4. Skriv ett program i C som utför multiplikation av två polynom. Problem 5. Skriv ett program i C, som utför polynomdivision Problem 6. Använd texten på sid 6 7 i lektion 3 för att skriva ett program som bestämmer determinanten till en given matris. Testkör ditt program med filerna det1.txt och det2.txt. Filerna inleds med ett tal som anger matrisens ordning n. Därefter följer n rader med n rader på varje. Svar 1. Svar 2. a a 1.23 b 1.24 c 1.24 d 1.24 e 0.994 d 0.996 float a=2.34567; a=(int(a*1000+0.5/1000.0; printf("%.5f\n",a; skriver ut 2.35000. Håkan Strömberg 8 KTH Syd
b Den komplicerade regeln är svår att få till i ett program. Detta försök fungerar men är trots allt osäkert double a=2.3455,a1,a2; a1=(double(int(a*1000; a2=a*1000; printf("a1=%.12f a2=%.12f a2-a1=%.12f\n",a1,a2,a2-a1; if(a2-a1==0.5 && (inta1%2==0 a=(int(a*1000/1000.0; else a=(int(a*1000+0.5/1000.0; printf("%.5f\n",a; Utskriften från första printf-satsen blir a1=2346.000000000000 a=2346.500000000000 a-a1=0.500000000000 Det hela fungerar därför att a2 a1 = 0.5. Det är inte alls givet! Normalt ska man aldrig använda == i kombination med float eller double. Svar 3. f max = f min = 4.1 4.1 4.0 = 41 3.9 4.3 3.8 = 7.8 Dessa indata tillsammans med formeln skapar stor osäkerhet. Svar 4. Testa ditt program med (x 3 + x + 2(x 4 + 3x 2 + x = x 7 + 4x 5 + 3x 4 + 3x 3 + 7x 2 + 2x Svar 5. Testa ditt program med x 3 37x + 84 x 3 = x 2 + 3x 28 Svar 6. det1.txt innehåller en matris vars determinant har värdet 3. det2.txt innehåller en matris vars determinant har värdet 2366. Håkan Strömberg 9 KTH Syd