NUMPROG, D för M, vt 008 Föreläsning N: Numerisk derivering och integrering Inledning: numerisk lösning av analytiska problem Skillnader mellan matematisk analys och numeriska metoder. Grundläggande begrepp i numeriska metoder. Approximationsprinciper för analytiska problem. Krav på en numerisk metod: noggrann, effektiv och stabil. Algoritmbegreppet i numeriska metoder. Programmering av numeriska metoder. Numerisk beräkning av derivator Numerisk derivering handlar om hur man approximerar derivator med hjälp av differensformler. I läroboken beskrivs hur detta görs för förstaderivator för 3 olika metoder, Eulers framåtdifferens, Eulers bakåtdifferens och centraldifferens, se läroboken exempel.0, sid 50. Eulers framåtdifferens Eulers bakåtdifferens Centraldifferens f (x) = f (x) = f(x + h) f(x) h f(x) f(x h) h + O(h) + O(h) f f(x + h) f(x h) (x) = + O(h ) h Eulers metoder är av första ordningen, vilket innebär att felet är i stort sett proportionellt mot steget h, medan centraldifferensen är av andra ordningen, dvs felet är proportionellt mot h. För andraderivator finns följande andra ordningens differensformel f f(x + h) f(x) + f(x h) (x) = + O(h ) h Ovanstående approximationer kommer till användning i de föreläsningar som tar upp differentialekvationer, se föreläsning 3-6.
Numeriskt experiment som illustrerar numerisk derivering och felskattning. Vi följer Ex.0 (sid 50-5) i PP s lärobok, men studerar felet som funktion av steglängden h Utgå från programmet sid 50, men ändra så att centraldifferensapproximationen beräknas för fler steglängder och skriv ut felet i stället för differenser och kvoter. En loglog-graf över felets absolutbelopp som funktion av h blir: 0 totalfelet i derivatan som funktion av h 0 0 0 0 0 3 0 4 0 5 0 6 0 7 0 8 0 0 0 0 8 0 6 0 4 0 0 0 För att förklara felkurvans utseende behövs några begrepp ur felkalkylen Antag att f är ett exakt värde och f motsvarande approximativa värde. Absolutfelet e f = f f Relativfelet r f = e f /f Oftast vet man bara övre gränser för e f och r f, dvs e f E f r f R f Ex. Om E f = 0.5 0 6 är f avrundat till 6 korrekta decimaler. Ex. I Matlab gäller att R f = 0 6, dvs tal avrundas till 6 korrekta siffror. Felet i ovanstående derivataapproximation D(h) = (f(x+h) f(x h))/h består av två delar: Approximationsfel (trunkeringsfel) e t = D(h) f (x), där E t = C h Avrundningsfel e a = D(h) D(h), där E a = C /h
Felet e tot, totalfelet, är summan av dessa två fel, dvs e tot = e t + e a och kan ges som en felgräns: E tot = E t + E a = C h + C /h. I grafens högra halva är felkurvan en rät linje. Det beror på att för h > 0 4 är avrundningsfelet försumbart, dvs E tot E t = C h. Tag logaritmen för detta samband så erhålles log(e t ) = log(c ) + log(h), dvs i ett loglog-diagram en rät linje med lutningen. Vi ser alltså att ju mindre h är desto sämre blir approximationen på grund av avrundningsfelens inverkan, vilket strider mot den matematiska definitionen, där h 0 och h kan bli hur nära noll som helst! Numeriskt är det bättre att välja ett måttligt litet värde på h. Numerisk approximation av derivator används mest vid lösning av differentialekvationer, men används också i olika situationer just för att beräkna derivatan av en funktion f(x) approximativt. ) då f(x) given genom en tabell ) då f(x) är krånglig att derivera analytiskt 3) då f(x) bara kan beräknas numeriskt för ett givet x 4) då f(x) är vektorvärd och samtliga derivator f i / x j (jacobianen) ska beräknas i ett program. Numerisk derivering blir då mycket enklare att programmera än att först derivera analytiskt och sedan stoppa in formlerna för derivatorna i koden Numerisk integration, kap 5 i läroboken En bestämd integral b I = f(x)dx a kan inte alltid beräknas analytiskt, eftersom det sällan går att ange den primitiva funktionen F (x) till f(x). Numeriskt beräknas en bestämd integral approximativt med hjälp av en kvadraturformel: I I appr = n ω k f(x k ) k=0 3
där koefficienterna ω k kallas vikter och punkterna x k kallas noder. I de metoder för numerisk integration som ingår i denna kurs, trapetsregeln och Simpsons formel, gäller att noderna ligger ekvidistant inom intervallet [a, b], dvs x k = a + kh, k = 0,,,..., n, där h är steglängden, given av h = (b a)/n. Förutom metoderna ska vi titta på approximationsfelet (trunkeringsfelet), definierat av e t = I appr I Det visar sig med hjälp av enkla numeriska experiment, att övre gränsen för detta fel, E t, beror av steglängden h enligt E t = ch p där p-värdet beror på vilken metod som anänds. Heltalet p kallas metodens noggrannhetsordning. Jämför med det numeriska experimentet för derivataberäkningen! Om log(e t ) plottas som funktion av log(h) så erhålles en rät linje med lutningen p. Trapetsregeln bygger på den geometriska tolkningen av en bestämd integral, nämligen att I är ytan av den figur som begränsas av x-axeln, funktionen y = f(x) samt de vertikala linjerna x = a och x = b.. Trapetsregeln. f n 0.9 f f n 0.7 0.5 f... T n f 0 T 0.3 T 0. 0 0...4.6 x 0 x x x n x n 4
Intervallet [a, b] delas in i n delintervall [x 0, x ], [x, x ],..., [x n, x n ] alla med längden h. I varje delintervall [x k, x k+ ] approximeras den krökta kurva som grafen av f(x) utgör, med en rät linje mellan (x k, f(x k )) och (x k+, f(x k+ )). Genom att summera ytorna för de n parallelltrapets som uppstår erhålles en approximation till den yta som I motsvarar: I appr = n k= T k = h f(x 0) + f(x ) som också kan skrivas I appr = T (h) = h( f(x 0) +h f(x ) + f(x ) +...+h f(x n ) + f(x n ) + f(x ) +... + f(x n ) + f(x n) ) där T (h) är trapetsvärdet svarande mot steglängden h. Exempel Beräkna approximativt 0 e x dx. 0. y=exp( x*x) 0. 0 0 0.5.5 0 0 0.5.5 0. 0 0 0.5.5 0. 0 0 0.5.5 En grov uppskattning av integralens värde erhålles för h =, dvs hela den krökta kurvan på intervallet [0, ] approximeras med en rät linje. T () = ( + e 4 ).083 5
Om intervallet [0, ] delas in i två delintervall, summeras ytan av två trapets: T () = ( + e + e 4 ) 770 Ett första Matlabprogram som beräknar ett trapetsvärde: a=0;b=; n=; h=(b-a)/n; x=[a:h:b]; y=exp(-x.*x); t=h*(sum(y)-(y()+y(end))/) Programmet utökas enkelt till beräkning av trapetsvärden för flera steglängder samt en tabell över trapetsvärden samt felen e t = T (h) I, där I har beräknats med en annan (noggrannare) metod till I = 8 (med fyra korrekta decimaler) a=0;b=; res=[]; for n=[,4,8] end h=(b-a)/n; x=[a:h:b]; y=exp(-x.*x); t=h*(sum(y)-(y()+y(end))/) fel=t-8; res=[res;[n,h,t,fel]] disp( n steg T(h) fel i T(h) ) 6
res Resultatet blir följande tabell n steg T(h) fel i T(h).00 770-0.005 4 0.50 806-0.005 8 0.5 87-0.0004 Ur tabellen framgår att felet approximativt minskar med en faktor 4 då steget minskar med en faktor, dvs e t ch. Man kan fråga sig om avrundningsfelen ger något bidrag till felet i tabellen. Precis som vid derivataberäkningen gäller E tot = E a + E t. Svaret är att avrundningsfelet vid numerisk integration är helt försumbart då Matlab används. Anledningen är att detta fel ges av (se läroboken) E a = (b a)e f. Eftersom E f /f = R f och R f = 0 6 i Matlab erhålles E a = (b a)f 0 6. Om man däremot räknar ut f-värdena för hand med säg 4 korrekta decimaler blir bidraget från avrundningsfelen E a = 0.5 (b a) 0 4 och är då ej försumbart. Trapetsregeln med feltermskorrektion (Richardsonextrapolation), även kallad Simpsons formel, bygger på formeln (se läroboken) ˆT (h) = T (h) + T (h) T (h) 3 Formeln för Simpsons metod blir (härledning utelämnas): I S(h) = h 6 (f(x 0)+4f(x )+f(x )+...+f(x n )+4f(x n )+f(x n )) Denna metod har noggrannhetsordningen 4, dvs e t = S(h) I ch 4. Matlab-funktioner för numerisk integration Den viktigaste funktionen att känna till är quad, som använder Simpsons metod med adaptiv anpassning av steglängden h. Det innebär att 7
steget h inte är konstant på intervallet [a, b] utan varieras med hänsyn till funktionen f(x) beteende över intervallet. Om f(x) varierar lite tas stora steg, om f(x) varierar mycket tas små steg. Anropet av quad (alt quadl) ser ut på följande sätt för den integral som behandlades i exemplet tidigare: int=quad( fun,a,b) där fun är namnet på den funktionsfil som definierar den funktion som ska integreras, och a,b är intervallgränserna. Om inget sägs om noggrannheten, beräknar quad integralen med sex decimalers noggrannhet. Vill man ha annan noggrannhet (tolerans), kan den anges som fjärde parameter i anropet, t ex int=quad( fun,a,b,e-8). Funktionen som ska integreras anges i en användardefinierad funktion, i detta exempel filen fun.m function fx=fun(x); fx=exp(-x.*x); Funktionen kan även definieras som inlinefunktion, dvs fun=inline( exp(-x.*x) ); 8