Kapitel 1. Numeriska metoder Detta är andra delen av kursen i vetenskapliga beräkningar, där vi till en början kommer att bekanta oss med endel numeriska metoder, som inte ingick i den första delen. Beräkningarna kommer som förut att utföras med Matlab. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 1
1.1. Beräkning av integraler I fysiken behöver man ofta beräkna integraler av funktioner numeriskt. För att beräkna integraler av elementära funktioner finns det standardmetoder som är kända från analysen, men i fysiken stöter man ofta på funktioner, som inte kan integreras med välkända metoder. Ett exempel härpå är Gauss felfunktion erf(x) = 2 π x 0 e t2 dt som är nära besläktad med den kumulativa normalfördelningen som används i statistiken. Denna integral kan dock inte beräknas med elementära metoder eftersom den primitiva funktionen till e t2 inte kan uttryckas med elementära funktioner. Naturligtvis kunde man kalla funktionen för erf, men hjälper oss inte att beräkna värden av den. För den skull behöver man numeriska metoder. Redan i antiken fanns det praktiskt behov av att beräkna ytor och volymer. Arkimedes uppfann en metod för sådana beräkningar som i hög grad påminner om beräkning av integraler. Den typ av integraler, som man normalt stöter på i fysiken, kallas i matematiken för en Riemann-integral. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 2
Riemann-integralen baserar sig på Jordanmåttet, och definieras som gränsvärdet av en Riemannsumma, som vi skall se nedan. Om vi för enkelhetens skull antar att vi önskar beräkna integralen över funktionen f(x) mellan gränserna x = a och x = b, så kan vi tänka oss detta intervall för enkelhetens skull delat i n lika stora delintervall av längden h = (b a)/n. Delningspunkterna kan då betecknas x k = a + kh, (k = 0, 1,..., n), dvs h = x k x k 1. En Riemannsumma kan då definieras som S = n f(c k )(x k x k 1 ), c k [x k 1, x k ] k=1 Varje term i denna summa är alltså ytan av en rektangel med höjden f(c k ) och bredden h, och summan kan uppfattas som en approximation till en yta som begränsas av x-axeln, funktionens ordinator i intervallets ändpunkter, och funktionskurvan mellan ordinatorna. En funktion sägs vara Riemannintegrerbar, ifall Riemannsumman konvergerar mot ett bestämt gränsvärde, då delningen tätnar. Ofta brukar man välja c k så, att det antingen är funktionens maximivärde (supremum) M k inom intervallet [x k, x k 1 ] eller minimivärde (infimum) m k inom detta intervall. Vi får då en övre Darbouxsumma U = n k=1 M k(x k x k 1 ), respektive en undre Darbouxsumma L = n k=1 m k(x k x k 1 ). Då delningen tätnar, kommer den övre summan att uppifrån närma sig ett gränsvärde, som kallas Darboux övre integral, och den undre summan närmar sig nedifrån ett gränsvärde, som kallas Darboux undre integral. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 3
Om båda integralerna sammanfaller, så kallas det gemensamma gränsvärdet Darboux integral, som då sammanfaller med Riemanns integral. Riemannsummor kan också använda för att numeriskt beräkna en integral. Som ett exempel skall vi ta 1 0 ex dx. Fördenskull delar vi upp intervallet [0, 1] på n delintervall av längden h = 1/n. Den undre Darbouxsumman blir då L = = 1 n n m k (x k x k 1 ) = k=1 n k=1 e (k 1)/n 1 n = 1 n n (e 1/n ) k 1 (e 1/n ) n 1 e 1/n 1 = (e 1) 1/n e 1/n 1, (1) eftersom funktionen är monotont växande och serien är geometrisk. Om delningen förtätas gränslöst, dvs man låter n, så blir Darbouxsummans gränsvärde e 1, vilket är integralens värde. k=1 Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 4
1.2. Kvadraturregler I allmänhet är det lättare att beräkna integraler numeriskt med hjälp av s.k. kvadraturregler än med Riemannsummor. I detta fall använder man en vägd summa av funktionsvärden (som kallas noder) inom det givna intervallet för att approximera integralen. Vikterna motsvarar då intervallängderna i Riemannsumman. En m punkters kvadraturregel Q för den bestämda integralen I = b a f(x)dx är en approximation, som har formen Q = (b a) m w k f(x k ), k=1 där x k kallas för abskissor och w k är vikterna. Regeln är definierad, då abskissor och vikter är angivna. Effektiviteten för en kvadraturregel mäts med antalet funktionsberäkningar som krävs. En sex-punkters formel är således dubbelt dyrare än en tre-punkters formel. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 5
Vi skall börja med att studera formler av Newton Cotes typ. De kännetecknas av att man integrerar en polynomisk interpolant p(x) för integranden f(x). Detta betyder, att av p(x) f(x) följer b a f(x)dx b a p(x)dx. Newton Cotes kvadraturregler får man genom att integrera polynom, som interpolerar integranden i punkter på lika avstånd från varandra. Newton Cotes m-punktsformel definieras av Q (m) NC = b a p m 1 (x)dx, där p m 1 (x) interpolerar f(x) i punkterna x i = a + i 1 (b a), i = 1 : m. m 1 Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 6
Om m = 2, får vi trapetsregeln Q (2) NC = b a [ f(a) + f(b) f(a) b a Om m = 3 och c = (a + b)/2, så får vi Simpsons regel: Q (3) NC = b a [ = b a 6 f(a) + [ f(a) + 4f ] (x a) dx = (b a) [ 1 2 f(a) + 1 2 f(b)]. (2) f(c) f(a) (x a) + c a ( ) a + b 2 f(b) f(c) b c f(c) f(a) c a (x a)(x c) b a ] dx ] + f(b). (3) Av dessa exempel framgår, att kvadraturformeln kan uttryckas som en lineärkombination av funktionsvärden på jämnt avstånd från varandra innanför integrationsintervallet. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 7
Ett enkelt sätt att finna vikterna i en dylik kvadraturformel får man genom att fordra, att den skall stämma exakt för x potenserna x i, i = 0 : m 1. Om vi t.ex. vill beräkna koefficienterna i fyrpunktsformeln: 1 0 f(x)dx af(0) + bf ( ) 1 3 + cf ( ) 2 3 + df(1), så ställer vi upp ekvationssystemet 1 0 1 0 1 0 1 0 dx = 1 = a + b + c + d xdx = 1 2 = 0 + b 3 + 2c 3 + d x 2 dx = 1 3 = 0 + b 9 + 4c 9 + d x 3 dx = 1 4 = 0 + b 27 + 8c 27 + d. (4) Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 8
Genom att lösa detta ekvationssystem finner man formeln 1 0 f(x)dx 1 8 [ f(0) + 3f ( ) 1 3 + 3f ( ) 2 3 ] + f(1). För enkelhetens skull kan vi skriva ett litet MATLAB program, som tabulerar de vanligaste Newton Cotes koefficienterna: function w=wnc(m); Invariabel: m heltal mellan 2 och 8 Utvariabel: w kolumnvektor med m element som innehåller vikterna för m-punktsregeln. if m==2 w = [1 1] /2; elseif m==3 w = [1 4 1] /6; elseif m==4 w = [1 3 3 1] /8; Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 9
elseif m==5 w = [7 32 12 32 7] /90; elseif m==6 w=[19 75 50 50 75 19] /288; elseif m==7 w=[41 216 27 272 27 216 41] /840; elseif m==8 w=[751 3577 1323 2989 2989 1323 3577 751] /17280; end Som vi ser, är viktsvektorerna symmetriska kring intervallets mittpunkt, så att w(1 : m) = w(m : 1 : 1). Den numeriska integrationen kan sedan utföras med hjälp av formeln Q (m) NC = (b a) m i=1 w i f i = (b a)[w 1 w m ] f(x 1 ). f(x m ) som visar att kvadraturformeln kan beräknas som skalärprodukten av viktsvektorn och en vektor innehållande funktionsvärden. En MATLAB-rutin, som beräknar en integral med hjälp av Newton Cotes kvadratur, kan alltså skrivas Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 10
function I = qnc(fname,a,b,m) Invariabler: fname : sträng som innehållet namnet på en funktion f(x) som är definierad över intervallet [a,b]. f ger till resultat en kolumnvektor, om x är en kolumnvektor. a,b : reella skalärer. m : ett heltal mellan 2 och 8. Utvariabel: I : en m-punkts Newton-Cotes approximation för integralen av f(x) mellan a och b. w = wnc(m); x = linspace(a,b,m) f = feval(fname,x); I = (b-a)*(w *f); Följande program kan användas för att testa funktionen: Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 11
Skriptfil: testqnc Testar Newton-Cotes-reglerna. while input ( Annat exempel? (1=ja, 0=nej). ) fname = input( Ange namnet på integranden mellan apostrofer: ); a = input( Ange vänstra ändpunkten: ); b = input( Ange högra ändpunkten: ); s = [ QNC( fname sprintf(,6.3f,6.3f,m),a,b)]; clc disp([ m s]) disp( ) for m=2:8 I = qnc(fname,a,b,m); end end disp(sprintf( 2.0f 20.16f,m,I)) Om programmet tillämpas på sinusfunktionen inom intervallet [0, π/2] fås Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 12
m QNC(sin, 0.000, 1.571,m ) 2 0.7853981633974483 3 1.0022798774922104 4 1.0010049233142790 5 0.9999915654729928 6 0.9999952613861668 7 1.0000000258372352 8 1.0000000158229038 Som vi ser, ökar noggrannheten med antalet punkter i formeln. Man kan visa, att felet i Simpsons regel (m = 3) bestäms ur formeln b a f(x)dx Q (3) NC (b a)5 2880 M 4, där M 4 betecknar övre gränsen av fjärde derivatan f (4) (x) inom intervallet [a, b]. I det allmänna fallet gäller formeln b ( ) b a d+2 f(x)dx = Q (m) NC + c mf (d+1) (θ), m 1 a Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 13
där c m är en liten konstant, θ [a, b] och d = { m 1, om m är jämnt m, om m är udda. Om vi känner till en övre gräns för derivatan, t.ex. att f (d+1) (x) M d+1 inom intervallet [a, b], så är b ( ) Q(m) NC b a d+2 f(x)dx a c m M d+1. m 1 Här är en MATLAB funktion som räknar ut kvadraturfelet då känner en uppskattning av felet i derivatan: function error = ncerr(a,b,m,derbound) Invariabler: a,b reella tal som satisfierar a<=b m heltal som satisfierar 2<=m<=8 och DerBound en övre gräns för den d:te derivatan av en funktion f(x) definierad på [a,b]. Talet d = m om m är udda, och m-1 om m är jämnt. Utvariabel: error en övre gräns för absoluta felet i en Newton- Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 14
Cotes m-punktsregel, då den tillämpas på integralen av f(x) från a till b. if m==2 d=1; c = -1/12; elseif m==3 d=3; c = -1/90; elseif m==4 d=3; c = -3/80; elseif m==5 d=5; c = -8/945; elseif m==6 d=5; c = -275/12096; elseif m==7 d=7; c = -9/1400; elseif m==8 d=7; c= -8183/518400; end; error = abs( c*derbound*((b-a)/(m-1))^(d+2) ); Rutinen visar, att en (m 1)-punktsregel vanligen är lika bra som motsvarande m-punktsregel. Vi ser detta tydligare genom att köra följande testprogram: Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 15
Skriptfil: shqncerr Program för att studera felet i en Newton-Cotes regel. clc disp( Enkelt fall: integralen från 0 till pi/2 av sin(x) ) disp( ) disp( Antag att DerBound = 1. ) disp( ) disp( m QNC(m) fel felgräns ) disp( ) for m=2:8 numi = qnc( sin,0,pi/2,m); err = abs(numi-1); errbound = errnc(0,pi/2,m,1); s = sprintf( 20.16f 10.3e 10.3e,numI,err,errBound); disp([ sprintf( 2.0f,m) s]) end Resultatet för integralen av sinus mellan 0 och π/2 ser ut så här: Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 16
m QNC(m) fel felgräns 2 0.7853981633974483 2.146e-001 3.230e-001 3 1.0022798774922104 2.280e-003 3.321e-003 4 1.0010049233142790 1.005e-003 1.476e-003 5 0.9999915654729928 8.435e-006 1.219e-005 6 0.9999952613861668 4.739e-006 6.867e-006 7 1.0000000258372352 2.584e-008 3.714e-008 8 1.0000000158229038 1.582e-008 2.277e-008 Felet i kvadraturegeln är beroende av längden på intervallet, som vi sett. Vi minskar därför på felet, om vi kan minska på intervallängden. Detta åstadkoms genom att dela intervallet [a, b] i delintervall. Om vi antar att a = z 1 < z 2 < < z n+1 = b, så kan integralen beräknas som en summa av integraler, tagna över delintervallen: b n zi+1 f(x)dx = f(x)dx. a i=1 z i Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 17
Om vi tillämpar Q (m) NC på var och en av delintegralerna, så får vi en sammansatt kvadraturregel. Om t.ex. i = z i+1 z i och z 1 i+ = (z i + z i+1 )/2, i = 1 : m, så gäller 2 Q = n i=1 i 6 ( ) f(z i ) + 4f(z 1 i+ ) + f(z i+1 ). 2 Om z är en MATLAB vektor, som innehåller delningspunkterna i [a, b], och fname är en sträng, som innehåller namnet på en funktion, så kommer MATLAB programfragmentet I = 0 for i=1:length(z)-1 I = I + qnc(fname,z(i),z(i+1),m); end att ge I värdet av en sammansatt m punkters Newton-Cotes approximation till integralen, som baserar sig på delningspunkterna i z. Man kan också välja delningspunkterna på ett mera automatiskt sätt. Detta utnyttjas vid adaptiv kvadratur, där delningspunkterna väljs tätare, då funktionen varierar snabbare, och glesare, då funktionen varierar långsammare (se t.ex. MATLAB procedurerna quad och quadl). Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 18
I Gauss kvadratur väljs abskissorna på ett sådant sätt, att regeln blir exakt för polynom av största möjliga gradtal. Som ett exempel skall vi bestämma vikterna och abskissorna så att formeln w 1 f(x 1 ) + w 2 f(x 2 ) = 1 1 f(x)dx är exakt för polynom av gradtalet 3 eller mindre. Genom att kräva att regeln skall stämma exakt för de fyra funktionerna 1, x, x 2, x 3 får vi fyra ekvationer med fyra obekanta (jfr vår beräkning av vikterna i en trepunkters Newton-Cotesregel): w 1 + w 2 = 2 w 1 x 1 + w 2 x 2 = 0 w 1 x 2 1 + w 2x 2 2 = 2 3 w 1 x 3 1 + w 2x 3 2 = 0. (5) Detta ekvationssystem kan lösas genom att man multiplicerar den andra ekvationen med x 2 1 och subtraherar den från den fjärde ekvationen. Vi får då w 2 x 2 (x 2 1 x2 2 ) = 0, varav följer x 2 = x 1. Av den andra ekvationen följer då w 1 = w 2, vilket i kombination med den första ekvationen leder till w 1 = w 2 = 1. Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 19
Den tredje ekvationen ger x 2 1 = 1/3, varav följer x 1 = 1/ 3 och x 2 = 1/ 3. Vi finner slutligen 1 1 vilket kallas tvåpunkters Gauss Legendre regeln. En m-punkters Gauss Legendre regel har formen f(x)dx f( 1/ 3) + f(1/ 3), Q (m) GL = w 1f(x 1 ) + + w m f(x m ), där vikterna och abskissorna valts så, att regeln är exakt för polynom av gradtalet 2m 1. Härnedan visas en MATLAB rutin, som ger vikter och abskissor för upptill 4 punkters Gauss Legendre regler: function [w,x] = wgl(m); Invariabel: m heltal som uppfyller villkoret 2 <= m <= 4 Utvariabler: w kolumnvektor med m element som innehåller vikterna för Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 20
en m-punkters Gauss-Legendre regel. x en kolumnvektor med m element som innehåller abskissorna för en m-punkters Gauss-Legendre regel. w = ones(m,1); x = ones(m,1); if m==2 w(1) = 1.000000000000000; w(2) = w(1); x(1) = -0.577350269189626; x(2) = -x(1); elseif m==3 w(1) = 0.555555555555558; w(3) = w(1); w(2) = 0.888888888888889; x(1) = -0.774596669241483; x(3) = -x(1); x(2) = 0.000000000000000; elseif m==4 w(1) = 0.347854845137454; w(4) = w(1); w(2) = 0.652145154862546; w(3) = w(2); x(1) = -0.861136311594053; x(4) = -x(1); x(2) = -0.339981043584856; x(3) = -x(2); end; Introduktion till vetenskapliga beräkningar II, Tom Sundius 2009 21