Kapitel 1. Numeriska metoder
Detta ¨ar andra delen av kursen i vetenskapliga ber¨akningar, d¨ar vi till en b¨orjan kommer att bekanta oss med endel numeriska metoder, som inte ingick i den f¨orsta delen. Ber¨akningarna kommer som f¨orut att utf¨oras med Matlab.
1.1. Ber¨ akning av integraler
I fysiken beh¨over man ofta ber¨akna integraler av funktioner numeriskt. F¨or att ber¨akna integraler av element¨ara funktioner finns det standardmetoder som ¨ar k¨anda fr˚an analysen, men i fysiken st¨oter man ofta p˚a funktioner, som inte kan integreras med v¨alk¨anda metoder.
Ett exempel h¨arp˚a ¨ar Gauss’ felfunktion
erf(x) = 2
√π Z x
0
e−t2dt
som ¨ar n¨ara besl¨aktad med den kumulativa normalf¨ordelningen som anv¨ands i statistiken. Denna integral kan dock inte ber¨aknas med element¨ara metoder eftersom den primitiva funktionen till e−t2 inte kan uttryckas med element¨ara funktioner. Naturligtvis kunde man kalla funktionen f¨or erf, men hj¨alper oss inte att ber¨akna v¨arden av den. F¨or den skull beh¨over man numeriska metoder. Redan i antiken fanns det praktiskt behov av att ber¨akna ytor och volymer. Arkimedes uppfann en metod f¨or s˚adana ber¨akningar som i h¨og grad p˚aminner om ber¨akning av integraler.
Den typ av integraler, som man normalt st¨oter p˚a i fysiken, kallas i matematiken f¨or en Riemann-integral.
Riemann-integralen baserar sig p˚a Jordanm˚attet, och definieras som gr¨ansv¨ardet av en Riemannsumma, som vi skall se nedan.
Om vi f¨or enkelhetens skull antar att vi ¨onskar ber¨akna integralen ¨over funktionen f (x) mellan gr¨anserna x = a och x = b, s˚a kan vi t¨anka oss detta intervall f¨or enkelhetens skull delat i n lika stora delintervall av l¨angden h = (b − a)/n. Delningspunkterna kan d˚a betecknas xk = a + kh, (k = 0, 1, . . . , n), dvs h = xk − xk−1. En Riemannsumma kan d˚a definieras som
S =
n
X
k=1
f (ck)(xk − xk−1), ck ∈ [xk−1, xk]
Varje term i denna summa ¨ar allts˚a ytan av en rektangel med h¨ojden f (ck) och bredden h, och summan kan uppfattas som en approximation till en yta som begr¨ansas av x-axeln, funktionens ordinator i interval- lets ¨andpunkter, och funktionskurvan mellan ordinatorna. En funktion s¨ags vara Riemannintegrerbar, ifall Riemannsumman konvergerar mot ett best¨amt gr¨ansv¨arde, d˚a delningen t¨atnar.
Ofta brukar man v¨alja ck s˚a, att det antingen ¨ar funktionens maximiv¨arde (supremum) Mk inom intervallet [xk, xk−1] eller minimiv¨arde (infimum) mk inom detta intervall. Vi f˚ar d˚a en ¨ovre Darbouxsumma U = Pn
k=1Mk(xk−xk−1), respektive en undre Darbouxsumma L = Pn
k=1mk(xk−xk−1). D˚a delningen t¨atnar, kommer den ¨ovre summan att uppifr˚an n¨arma sig ett gr¨ansv¨arde, som kallas Darboux’ ¨ovre integral, och den undre summan n¨armar sig nedifr˚an ett gr¨ansv¨arde, som kallas Darboux’ undre integral.
Om b˚ada integralerna sammanfaller, s˚a kallas det gemensamma gr¨ansv¨ardet Darboux’ integral, som d˚a sammanfaller med Riemanns integral.
Riemannsummor kan ocks˚a anv¨anda f¨or att numeriskt ber¨akna en integral. Som ett exempel skall vi ta R 1
0 exdx. F¨ordenskull delar vi upp intervallet [0, 1] p˚a n delintervall av l¨angden h = 1/n. Den undre Darbouxsumman blir d˚a
L =
n
X
k=1
mk(xk − xk−1) =
n
X
k=1
e(k−1)/n1
n = 1 n
n
X
k=1
(e1/n)k−1
=1 n
(e1/n)n − 1
e1/n − 1 = (e − 1) 1/n
e1/n − 1, (1)
eftersom funktionen ¨ar monotont v¨axande och serien ¨ar geometrisk. Om delningen f¨ort¨atas gr¨ansl¨ost, dvs man l˚ater n → ∞, s˚a blir Darbouxsummans gr¨ansv¨arde e − 1, vilket ¨ar integralens v¨arde.
1.2. Kvadraturregler
I allm¨anhet ¨ar det l¨attare att ber¨akna integraler numeriskt med hj¨alp av s.k. kvadraturregler ¨an med Riemannsummor. I detta fall anv¨ander man en v¨agd summa av funktionsv¨arden (som kallas noder) inom det givna intervallet f¨or att approximera integralen. Vikterna motsvarar d˚a intervall¨angderna i Riemannsumman.
En m punkters kvadraturregel Q f¨or den best¨amda integralen I =
Z b a
f (x)dx
¨ar en approximation, som har formen
Q = (b − a)
m
X
k=1
wkf (xk),
d¨ar xk kallas f¨or abskissor och wk ¨ar vikterna. Regeln ¨ar definierad, d˚a abskissor och vikter ¨ar angivna.
Effektiviteten f¨or en kvadraturregel m¨ats med antalet funktionsber¨akningar som kr¨avs. En sex-punkters formel ¨ar s˚aledes dubbelt dyrare ¨an en tre-punkters formel.
Vi skall b¨orja med att studera formler av Newton–Cotes typ. De k¨annetecknas av att man integrerar en polynomisk interpolant p(x) f¨or integranden f (x). Detta betyder, att av p(x) ≈ f (x) f¨oljer
Z b a
f (x)dx ≈ Z b
a
p(x)dx.
Newton–Cotes kvadraturregler f˚ar man genom att integrera polynom, som interpolerar integranden i punkter p˚a lika avst˚and fr˚an varandra. Newton–Cotes m-punktsformel definieras av
Q(m)N C = Z b
a
pm−1(x)dx,
d¨ar pm−1(x) interpolerar f (x) i punkterna
xi = a + i − 1
m − 1(b − a), i = 1 : m.
Om m = 2, f˚ar vi trapetsregeln Q(2)N C =
Z b a
f (a) + f (b) − f (a)
b − a (x − a)
dx
= (b − a)1
2f (a) + 12f (b) . (2)
Om m = 3 och c = (a + b)/2, s˚a f˚ar vi Simpsons regel:
Q(3)N C = Z b
a
"
f (a) + f (c) − f (a)
c − a (x − a) +
f (b)−f (c)
b−c − f (c)−f (a) c−a
b − a (x − a)(x − c)
# dx
= b − a 6
f (a) + 4f a + b 2
+ f (b)
. (3)
Av dessa exempel framg˚ar, att kvadraturformeln kan uttryckas som en line¨arkombination av funktionsv¨arden p˚a j¨amnt avst˚and fr˚an varandra innanf¨or integrationsintervallet.
Ett enkelt s¨att att finna vikterna i en dylik kvadraturformel f˚ar man genom att fordra, att den skall st¨amma exakt f¨or x–potenserna xi, i = 0 : m − 1. Om vi t.ex. vill ber¨akna koefficienterna i fyrpunktsformeln:
Z 1 0
f (x)dx ≈ af (0) + bf 1 3
+ cf 2 3
+ df (1),
s˚a st¨aller vi upp ekvationssystemet
Z 1 0
dx = 1 = a + b + c + d Z 1
0
xdx = 1
2 = 0 + b
3 + 2c
3 + d Z 1
0
x2dx = 1
3 = 0 + b
9 + 4c
9 + d Z 1
0
x3dx = 1
4 = 0 + b
27 + 8c
27 + d. (4)
Genom att l¨osa detta ekvationssystem finner man formeln Z 1
0
f (x)dx ≈ 1 8
f (0) + 3f 1 3
+ 3f 2 3
+ f (1)
.
F¨or 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˚aller vikterna
% f¨or 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;
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, ¨ar viktsvektorerna symmetriska kring intervallets mittpunkt, s˚a att w(1 : m) = w(m : −1 : 1). Den numeriska integrationen kan sedan utf¨oras med hj¨alp av formeln
Q(m)N C = (b − a)
m
X
i=1
wifi = (b − a)[w1 · · · wm]
f (x1) ...
f (xm)
som visar att kvadraturformeln kan ber¨aknas som skal¨arprodukten av viktsvektorn och en vektor inneh˚al- lande funktionsv¨arden. En MATLAB-rutin, som ber¨aknar en integral med hj¨alp av Newton–Cotes kvadratur, kan allts˚a skrivas
function I = qnc(fname,a,b,m)
%
% Invariabler:
% fname : str¨ang som inneh˚allet namnet p˚a en funktion f(x) som ¨ar
% definierad ¨over intervallet [a,b]. f ger till resultat
% en kolumnvektor, om x ¨ar en kolumnvektor.
% a,b : reella skal¨arer.
% m : ett heltal mellan 2 och 8.
% Utvariabel:
% I : en m-punkts Newton-Cotes approximation f¨or 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¨oljande program kan anv¨andas f¨or att testa funktionen:
% Skriptfil: testqnc
%
% Testar Newton-Cotes-reglerna.
while input (’Annat exempel? (1=ja, 0=nej). ’)
fname = input(’Ange namnet p˚a integranden mellan apostrofer:’);
a = input(’Ange v¨anstra ¨andpunkten: ’);
b = input(’Ange h¨ogra ¨andpunkten: ’);
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);
disp(sprintf(’ %2.0f %20.16f’,m,I)) end
end
Om programmet till¨ampas p˚a sinusfunktionen inom intervallet [0, π/2] f˚as
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, ¨okar noggrannheten med antalet punkter i formeln. Man kan visa, att felet i Simpsons regel (m = 3) best¨ams ur formeln
Z b a
f (x)dx − Q(3)N C
≤ (b − a)5
2880 M4,
d¨ar M4 betecknar ¨ovre gr¨ansen av fj¨arde derivatan |f(4)(x)| inom intervallet [a, b]. I det allm¨anna fallet g¨aller formeln
Z b a
f (x)dx = Q(m)N C + cmf(d+1)(θ) b − a m − 1
d+2 ,
d¨ar cm ¨ar en liten konstant, θ ∈ [a, b] och
d =
(m − 1 , om m ¨ar j¨amnt m , om m ¨ar udda.
Om vi k¨anner till en ¨ovre gr¨ans f¨or derivatan, t.ex. att |f(d+1)(x)| ≤ Md+1 inom intervallet [a, b], s˚a
¨ar
Q(m)N C − Z b
a
f (x)dx
≤ |cm|Md+1 b − a m − 1
d+2 .
H¨ar ¨ar en MATLAB–funktion som r¨aknar ut kvadraturfelet d˚a k¨anner 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 ¨ovre gr¨ans f¨or den d:te derivatan av
% en funktion f(x) definierad p˚a [a,b]. Talet
% d = m om m ¨ar udda, och m-1 om m ¨ar j¨amnt.
%
% Utvariabel:
% error en ¨ovre gr¨ans f¨or absoluta felet i en Newton-
% Cotes m-punktsregel, d˚a den till¨ampas p˚a
% integralen av f(x) fr˚an 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 ¨ar lika bra som motsvarande m-punktsregel. Vi ser detta tydligare genom att k¨ora f¨oljande testprogram:
% Skriptfil: shqncerr
%
% Program f¨or att studera felet i en Newton-Cotes regel.
clc
disp(’Enkelt fall: integralen fr˚an 0 till pi/2 av sin(x)’) disp(’ ’)
disp(’Antag att DerBound = 1.’) disp(’ ’)
disp(’ m QNC(m) fel felgr¨ans’)
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¨or integralen av sinus mellan 0 och π/2 ser ut s˚a h¨ar:
m QNC(m) fel felgr¨ans 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 ¨ar beroende av l¨angden p˚a intervallet, som vi sett. Vi minskar d¨arf¨or p˚a felet, om vi kan minska p˚a intervall¨angden. Detta ˚astadkoms genom att dela intervallet [a, b] i delintervall. Om vi antar att a = z1 < z2 < · · · < zn+1 = b, s˚a kan integralen ber¨aknas som en summa av integraler, tagna ¨over delintervallen:
Z b a
f (x)dx =
n
X
i=1
Z zi+1
zi
f (x)dx.
Om vi till¨ampar Q(m)N C p˚a var och en av delintegralerna, s˚a f˚ar vi en sammansatt kvadraturregel. Om t.ex.
∆i = zi+1 − zi och z
i+1 2
= (zi + zi+1)/2, i = 1 : m, s˚a g¨aller
Q =
n
X
i=1
∆i 6
f (zi) + 4f (z
i+1 2
) + f (zi+1)
.
Om z ¨ar en MATLAB–vektor, som inneh˚aller delningspunkterna i [a, b], och fname ¨ar en str¨ang, som inneh˚aller namnet p˚a en funktion, s˚a 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¨ardet av en sammansatt m–punkters Newton-Cotes approximation till integralen, som baserar sig p˚a delningspunkterna i z. Man kan ocks˚a v¨alja delningspunkterna p˚a ett mera automatiskt s¨att. Detta utnyttjas vid adaptiv kvadratur, d¨ar delningspunkterna v¨aljs t¨atare, d˚a funktionen varierar snabbare, och glesare, d˚a funktionen varierar l˚angsammare (se t.ex. MATLAB–procedurerna quad och quadl).
I Gauss kvadratur v¨aljs abskissorna p˚a ett s˚adant s¨att, att regeln blir exakt f¨or polynom av st¨orsta m¨ojliga gradtal. Som ett exempel skall vi best¨amma vikterna och abskissorna s˚a att formeln
w1f (x1) + w2f (x2) = Z 1
−1
f (x)dx
¨ar exakt f¨or polynom av gradtalet 3 eller mindre. Genom att kr¨ava att regeln skall st¨amma exakt f¨or de fyra funktionerna 1, x, x2, x3 f˚ar vi fyra ekvationer med fyra obekanta (jfr v˚ar ber¨akning av vikterna i en trepunkters Newton-Cotesregel):
w1 + w2 = 2 w1x1 + w2x2 = 0 w1x21 + w2x22 = 2 3
w1x31 + w2x32 = 0. (5)
Detta ekvationssystem kan l¨osas genom att man multiplicerar den andra ekvationen medx21 och subtraherar den fr˚an den fj¨arde ekvationen. Vi f˚ar d˚a w2x2(x12 − x22) = 0, varav f¨oljer x2 = −x1. Av den andra ekvationen f¨oljer d˚a w1 = w2, vilket i kombination med den f¨orsta ekvationen leder till w1 = w2 = 1.
Den tredje ekvationen ger x21 = 1/3, varav f¨oljer x1 = −1/√
3 och x2 = 1/√
3. Vi finner slutligen Z 1
−1
f (x)dx ≈ f (−1/√
3) + f (1/√ 3), vilket kallas tv˚apunkters Gauss–Legendre regeln.
En m-punkters Gauss–Legendre regel har formen
Q(m)GL = w1f (x1) + · · · + wmf (xm),
d¨ar vikterna och abskissorna valts s˚a, att regeln ¨ar exakt f¨or polynom av gradtalet 2m − 1.
H¨arnedan visas en MATLAB–rutin, som ger vikter och abskissor f¨or 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˚aller vikterna f¨or
% en m-punkters Gauss-Legendre regel.
% x en kolumnvektor med m element som inneh˚aller abskissorna
% f¨or 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;