André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 60) Lektion 5 Ekvationslösning Problemformulering Förarbete Använd matematik Begränsa sökområdet Rita Skriv funktionsprogram Bearbetning MATLAB-metoder Newton-Raphsons metod Sekantmetoden Efterarbete Tillförlitlighetsbedömning Felskattning Presentation av resultat Problemformulering (allmän): Finn en rot x = α (ett antal rötter x = α 1,..., α k ) till ekvationen f(x) = 0. Som du har hört på Lektion 1 och sett i Datorlaboration 1, så finns i MATLAB dels roots (när nollställena till polynom ska bestämmas) dels en ekvationslösare fzero. nollst=roots(koeffvektor) rot=fzero( func,gissning) Metoderna får gärna användas när så är lämpligt. roots är pålitlitlig och ger resultat med full maskinnoggrannhet. Men långt ifrån alla funktioner är polynom, så fzero är i praktiken vad som erbjuds. Den har nackdelen att det är svårt att få veta något om noggrannheten påståendena i handböckerna stämmer inte alltid. För att komma till rätta med det bekymret ska vi se på två metoder som, rätt använda, ger full insyn. Newton-Raphsons metod (GNM 2:2A) Den grafiska tolkningen
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 61) Härledning med hjälp av den räta linjens ekvation (L1, GNM sid (1)14) Iteration (Grundidé, se även GNM 1:3E) Skriv hellre (förklaring följer snart) på formen EXEMPEL 1 (Problemformulering) Lös ekvationen x 2 4 cos x = 0. Förarbete GNM 2:1 nämner de förarbetande åtgärderna 2:1A Beakta problemets bakgrund; 2:1B Grafisk teknik; 2:1C Dela upp problemet; 2:1D Använd matematik; 2:1E Intervallhalvering; samt påpekar att de olika åtgärderna kan kombineras. I det här exemplet blir det förstås inte tal om att fundera på problemets bakgrund. Men använda matematik kan man göra på så vis att man redan från början begränsar det möjliga området för ekvationens rötter: Bestäm sökområde
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 62) Utan någon åtgärd som bevisar att alla rötter ligger inom sökintervallet, kan man inte anses vara säker på att ha hittat samtliga rötter. Ett bevis, även så löst formulerat som ovan, är någonting betydligt bättre än resonemang som hänvisar till att man inser dolda samband. Har man MATLAB som hjälpmedel, är grafisk teknik mycket användbar vid förarbetet, dvs man låter helt enkelt MATLAB rita. I det här fallet kan man exempelvis dela upp funktionen f(x) = x 2 4 cos x i två delar, x 2 respektive 4 cos x. Man ritar de två kurvorna över sökintervallet. Att de skär varandra betyder att i skärningspunkten är x 2 = 4 cos x, dvs att ekvationen x 2 4 cos x = 0 satisfieras. Genom att avläsa x-koordinaten för skärningspunkten (skärningspunkterna) så gott det går, har man funnit en hyfsad skattning till roten (rötterna). Kommandofil: x=0:0.05:2; f1=x.*x; f2=4*cos(x); plot(x,f1,x,f2, -- ), grid title( Söker nollställe till x^2-4cosx ) 4 Söker nollställe till x^2 4cosx 3 2 1 0 1 2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 Det är tydligt att x = 1.2 är en lämplig utgångspunkt för det fortsatta arbetet. Att programmera Newton-Raphsons metod i MATLAB är lätt. Eftersom både funktionen och derivatan behövs, skriver jag en funktionsfil, där båda dessa värden är utdata. Filen heter Ex1ekv.m och har utseendet: function [f,d] = Ex1ekv(x); f = x.*x-4*cos(x); d = 2*x+4*sin(x);
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 63) Jag bestämmer mig för att iterera tills två på varandra följande x-värden skiljer sig högst 5 10 11. Eftersom x n+1 = x n t n ska jag med andra ord upprepa newtonraphson-steget så länge som t n > 5 10 11. Konstruktionen upprepa kommandon så länge som ett villkor gäller skrivs i MATLAB: while villkor end kommandon Skillnaden mellan while villkor...end och if villkor...end är att while-slingan genomlöps gång på gång; if-satsen åstadkommer en förgrening i programflödet en enda gång. Bearbetning Kommandon för att genomföra ekvationslösningen blir x=1.2; t=1; % t måste till en början vara >5e-11 while abs(t) > 5e-11 [f,fprim] = Ex1ekv(x); t=f/fprim; x=x-t; end rotnr=x Vid körning får jag omgående svaret rotnr = 1.20153829934058 Efterarbete Efterarbetet innebär att göra en tillförlitlighetsbedömning och att presentera resultatet. Som jag har programmerat ovan, dvs inte skrivit ut något annat än slutresultatet, så har fördelarna med Newton-Raphsons metod inte alls framgått. Jag är lika ovetande om resultatets tillförlitlighet som om jag hade använt fzero. Det ser ut så här: >> rotfz=fzero( Ex1ekv,1.2) rotfz = 1.20153829934057 Nu har jag faktiskt utfört tillförlitlighetsbedömning med metodvariation. Men här finns det en VARNING att utfärda: Samtliga metoder kan under olyckliga omständigheter ge grovt felaktiga resultat. Tillförlitlighetsbedömningen kräver därför undersökning av regelbundenheten. Om resultaten är rejält olika, så vet man att något trasslar. Men om de är så pass lika som ovan, så upptäcker man inte en eventuell felaktighet (att det här inte är överdrivna farhågor, kan du intyga efter att ha gjort uppgift 2 på datorlaboration 2). Vad regelbundenhet hos metoder för differentialekvationer innebär har jag gått igenom (minns du?), liksom hur man kontrollerar den (repetera om du har glömt, för det är viktigt). För fzero kan ingen kontroll genomföras eftersom vi inte vet hur teorin ser ut
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 64) för den metoden. Konsekvensen är att man inte kan vara säker på att resultaten från fzero är korrekta. För Newton-Raphsons metod finns desto mer teori. Den i det här sammanhanget viktigaste detaljen är: Vad är det? Newton-Raphsons metod konvergerar kvadratiskt. Hur yttrar det sig? Vid regelbundenhet återspeglar metodens utdata dess trunkeringsfel. I Newton-Raphsons metod avtar iteratens trunkeringsfel kvadratiskt. Man undersöker alltså regelbundenheten genom att skriva ut varje K n = t n /t 2 n 1 och sedan bedöma om dessa K n kan anses vara konstanta ( K). Man gör vid behov undantag för första och sista K n -värdet (ty vid första iterationen, n = 1, kan det vara för tidigt att avgöra vad som gäller när n ; vid sista iterationen kan avrundningsfel störa regelbundenheten). Skattning av trunkeringsfelet Låt N vara sista n för vilket t n /t 2 n 1 K (dvs regelbundenheten upphör för n > N). Då accepteras x N+1 = x N t N, och trunkeringsfelet, x N+1 α skattas E trunk K t 2 N. Regelbundenheten (allmänna definitionen) garanterar att övriga fel i kalkylerna är försumbara jämfört med trunkeringsfelet. Eftersom redan t N < 5 10 11, så är, vid normalstort K, trunkeringsfelet försumbart jämfört med det presentationsfel som MAT- LAB gör vid utskriften med långt format, och är än mer försumbart om man själv gör en avrundning till måttligt antal siffror. Om man inte kan konstatera regelbundenhet, så är det något som är fel, även om man får ett resultat. Det kan vara programfel, det kan vara någon egenskap hos ekvationen som förstör den kvadratiska konvergensen. Resultatet ska då naturligtvis inte accepteras. Jag betonar detta eftersom det finns en benägenhet att acceptera resultat utan undersökningar; en benägenhet som jag med bestämdhet motarbetar.
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 65) Bättre fungerande program för Newton-Raphsons metod Jag hade skrivit programmet för Newton-Raphsons metod så här långt på sidan 65: x=1.2; t=1; % t måste till en början vara >5e-11 while abs(t) > 5e-11 [f,fprim] = Ex1ekv(x); t=f/fprim; x=x-t; end rotnr =x Min första åtgärd är att programmera Newton-Raphsons metod så att felskattningen kan göras direkt utan besvär. Det sker genom att jag låter skriva ut de kvoter som jag kallar K n ovan. Om roten är mycket liten (t ex mindre än 5 10 11 ) så avbryter while-villkoret för tidigt. Om roten är mycket stor (t ex större än 10 8 ), så kan man få en evighetsslinga. I satsen x=x-t; kommer nämligen ett t 10 9 att tappas bort bredvid ett x 10 8 (eftersom MATLAB inte klarar mer än 16 siffror). x-värdet ändras därför inte, så nästa t-värde blir samma som tidigare, dvs 10 9. Min andra åtgärd är därför att testa värdet på t relativt värdet på x, dvs att skriva while abs(t) > 5e-11*abs(x) Ett annat missöde som kan inträffa är att Newton-Raphsons metod överhuvudtaget inte konvergerar. Min tredje åtgärd är att räkna iterationerna, och avbryta om de blir för många (jag tycker att 10 iterationer är för många, Newton-Raphsons metod brukar ta sig fram mycket snabbt). Vid ett sådant avbrott bör varning utfärdas. Min fjärde åtgärd är att skriva hela programmet som en funktion, som kan anropas lika enkelt som fzero: rotnr=newrap( func,startx). Eftersom den funktion, som man söker nollstället till, ska vara parameter, säg F, måste man byta ut satsen [f,fprim]=ex1ekv(x); mot [f,fprim]=feval(f,x);. function [rot] = newrap(f, start) x=start; t=1; it=0; Ktest=[]; format short e, format compact disp( x f(x) df/dx t Ktest ) while abs(t) > 5e-11*abs(x) & it<10 [f,fprim] = feval(f,x); t=f/fprim; if it>0, Ktest=abs(t)/t2; end disp([x f fprim t Ktest]) x=x-t; it=it+1; t2=t*t; end if it==10, disp( Avbrott efter 10 iterationer ) else format long rot = x end Det här programmet ligger på kursens hemsida, tillåtet att knycka. Det är lika lätt att använda som MATLAB-s fzero. Så här kan det se ut vid en körning:
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 66) >> rotnr = newrap( Ex1ekv,1.2); x f(x) df/dx t Ktest 1.2000e+00-9.4310e-03 6.1282e+00-1.5390e-03 1.2015e+00 4.0826e-06 6.1335e+00 6.6562e-07 2.8104e-01 1.2015e+00 7.6317e-13 6.1335e+00 1.2443e-13 2.8084e-01 rot = 1.20153829934058 Nu kan äntligen en säker tillförlitlighetsbedömning göras. Med så få iterationer kan det vara omöjligt att verkligen konstatera regelbundenhet men den här gången var det möjligt. Trunkeringsfelet är 0.28 (1.2443 10 13 ) 2 4.3 10 27, som är försumbart jämfört med MATLAB-s presentationsfel ( 0.5 10 14 ) vid utskriften av rotnr. Om jag nu avrundar resultatet till exempelvis 9 decimaler ( α = 1.201538299) så blir uppenbarligen både trunkeringsfel och avrundningsfel försumbara jämfört med presentationsfelet e pres = 3.4 10 10. Detta är mindre än 0.5 10 9, så nu är jag säker på att ha fått roten med 9 korrekta decimaler. Efterbehandlingen avslutas med presentation av resultat. Eftersom alla har sett hela processen, räcker det i det här fallet med presentationen: Rötterna är, med 9 korrekta decimaler: α = 1.201538299 och α. Sekantmetoden (GNM 2:2B) Vi kommer snart att stöta på ekvationer där det är mer eller mindre omöjligt att derivera. Då är det inte tänkbart att använda Newton-Raphsons metod, medan däremot fzero skulle kunna fungera. Haken är fortfarande att man inte har någon säker teknik för tillförlitlighetsbedömningen i fzero. Till sådana ekvationer använder man lämpligen sekantmetoden, där man klarar sig utan att derivera och kan göra tillförlitlighetsbedömning. Grafisk tolkning Härledning med hjälp av den räta linjens ekvation (L2, GNM sid (1)14)
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 67) Iterationerna: Sekantmetodens konvergens är inte kvadratisk, utan subkvadratisk (dvs lite mindre än kvadratisk). Man kan visa att det gäller lim n t n+1 t n t n 1 = K 0. Regelbundenheten hos sekantmetoden kontrolleras därför med hjälp av denna kvot mellan t n -värden i varje iterationssteg. Om regelbundenhet kan konstateras fram till n = N, så skattas trunkeringsfelet i x N+1 = x N t N med E trunk = K t N t N 1 Jag programmerar sekantmetoden så likt newrap som möjligt. Den väsentliga skillnaden är att det behövs två startvärden och att värdena från steget n ska överföras till steget n + 1. function [rot] = sekant(f,start1,start2); x1=start1; x2=start2; it=1; f1=feval(f,x1); t=1; t2=1; Ktest=[]; format short e, format compact disp( x f(x) t Ktest ) while abs(t) > 5e-11*abs(x2) & it<10 f2 = feval(f,x2); t=(x2-x1)/(f2-f1)*f2; if it>2, Ktest=abs(t/(t1*t2)); end disp([x2 f2 t Ktest]) x1=x2; f1=f2; x2=x2-t; t1=t2; t2=t; it=it+1; end if it==10, disp( Avbrott efter 10 iterationer ) else format long rot = x2 end Även den här filen, sekant.m finns åtkomlig på kursens hemsida.
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 68) EXEMPEL 1, fortsättning Funktionen x 2 4 cos x är visserligen lätt att derivera, men jag behandlar ändå samma ekvation, för att demonstrera skillnader och likheter mellan metoderna. function f= Ex1sek(x) f=x.*x-4*cos(x); - - - - - - - - - - - - - - - - - - - - - >> rotsek=sekant( Ex1sek,1.1, 1.2); x f(x) t Ktest 1.2000e+00-9.4310e-03-1.5852e-03 1.2016e+00 2.8748e-04 4.6890e-05 1.2015e+00-1.2426e-07-2.0260e-08 2.7257e-01 1.2015e+00-1.6351e-12-2.6659e-13 2.8063e-01 rot = 1.20153829934058 Vi ser att vi får regelbundhet och att det blir samma K 0.28 som i Newton-Raphsons metod (K = 1 f (α) i båda metoderna). E 2 f (α) trunk 0.28 2, 67 10 13 2 10 8 1.5 10 21, så fortsättningen följer som i Newton-Raphsons metod. EXEMPEL 2 Bestäm rötterna till ekvationen e x + 1.05x sin(x 2 )/2 = 1. Förarbete Skriv funktionsprogrammet... function f = Ex2ekv(x) f = exp(-x)+1.05*x-sin(x.*x)/2-1;... och rita en graf. Jag chansar vilt med intervallgränserna: fplot( Ex2ekv,[-2,5]), grid 5 4 3 2 1 0 1 2 1 0 1 2 3 4 5 Med ledning av figuren kan jag bevisa att jag inte har några rötter utanför 2 x 2. Övning: Genomför detta bevis! Se till att det verkligen blir ett bevis.
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 69) När beviset är genomfört kan jag helt förlita mig på figuren och se att rötterna ligger mellan 0.8 och +1.2. För att se tydligare, ritar jag funktionen över detta intervall: 0.1 0.08 0.06 0.04 0.02 0 Bearbetning 0.02 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1 1.2 I figuren ser jag att x = 0 kan vara en rot. Sätter jag in 0 i funktionen finner jag att jag såg rätt. Övriga tre rötter tar jag fram med sekantmetoden. Startvärden skaffar jag med ginput (jag klickar alltså två gånger i närheten av var och en av rötterna). [xnoll, yslask]=ginput(6); for i=1:3 rot(i)=sekant( Ex2ekv,xnoll(2*i-1),xnoll(2*i)); end Körning ger: x f(x) t Ktest -4.7512e-01-2.5826e-03 2.2469e-02-4.9758e-01-2.5446e-04 2.4557e-03-5.0004e-01 2.3806e-05-2.1009e-04 3.8076e+00-4.9983e-01-1.8897e-07 1.6545e-06 3.2069e+00-4.9983e-01-1.3850e-10 1.2135e-09 3.4912e+00-4.9983e-01 6.6613e-16-5.8367e-15 2.9070e+00 rot = -0.49983107228662 x f(x) t Ktest 6.2166e-01 1.3388e-03-2.1738e-02 6.4340e-01-4.7787e-05 7.4919e-04 6.4265e-01 5.6262e-07-8.7180e-06 5.3530e-01 6.4266e-01 1.8722e-10-2.9019e-09 4.4430e-01 6.4266e-01-7.7716e-16 1.2046e-14 4.7615e-01 rot = 0.64265697995232 x f(x) t Ktest 1.0318e+00 2.4541e-03 1.7245e-02 1.0146e+00-6.2884e-04-3.5175e-03 1.0181e+00-4.0082e-05-2.3947e-04 3.9477e+00 1.0183e+00 7.3249e-07 4.2977e-06 5.1021e+00 1.0183e+00-8.2732e-10-4.8487e-09 4.7112e+00 1.0183e+00-1.7097e-14-1.0020e-13 4.8087e+00 rot = 1.01830472374639
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 70) Efterbehandling Alla tre fallen uppvisar regelbundenhet, så trunkeringsfelen skattas 3 6 10 15 1.2 10 9, 0.48 1.2 10 14 3 10 9 respektive 4.8 10 13 4.9 10 9, och är därför alla försumbara, när jag presenterar värdena med 10 decimaler. Svar: Rötterna är 0.4998310723, 0.6426569800 och 1.0183047237 med 10 korrekta decimaler samt 0 exakt. Tabellfel Hittills har jag, med hjälp av regelbundenheten, bara behövt titta på trunkeringsfelet, försumma beräkningsfelen och som totalfel ange presentationsfelet. Men i uppställningen av feltyper fanns också tabellfelet (lektionsanteckningar för lektion 2 sid 21). Detta kan vanligen skattas med hjälp av felfortplantningsformeln: E f f ( x) E x. Här förutsätts x vara behäftad med fel, och formeln ger då en skattning av det fel i f som därvid uppkommer. När man löser ekvationer, är förhållandet det omvända, dvs f = 0 beräknas med ett visst fel e f, sådant att e f E f och det felet ger ett fel, e x i x. Detta fel kan, åter med användande av felfortplantningsformeln, skattas: E x E f / f ( x) Tack vare MATLAB-s höga räknenoggrannhet har vi hittills inte behövt beakta tabellfelet, men nu är det dags för ett exempel där f(x) faktiskt inte kan beräknas med så stor noggrannhet att tabellfelet blir försumbart. EXEMPEL 3 Bestäm med 8 korrekta decimaler roten till ekvationen y(x) = 1, när y(x) satisfierar begynnelsevärdesproblemet y = 1 + x 2 y 2 ; y(0) = 0. Förarbete function yprim=ex3dif(x,y) xy=x*y; yprim=1+xy*xy; Jag tar först reda på om det överhuvudtaget finns möjligheter att lösa ekvationen. Det gör jag genom att rita lösningen till differentialekvationen ett stycke, och titta ifall, och i så fall var, y(x) > 1. Så långt duger grovskattningar, så jag använder ode45. >> [xgr,ygr]=ode45( Ex3dif,[0 2],0); Warning: Failure at t=1.454993e+00. Unable to meet integration tolerances without reducing the step size below the smallest value allowed (5.169173e-15) at time t. >> [xgr,ygr]=ode45( Ex3dif,[0 1],0); >> plot(xgr,ygr), grid
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 71) 1.4 1.2 1 0.8 0.6 0.4 0.2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Funktionen har ett mycket lugnt förlopp, åtminstone fram till den punkt vi söker, den då y(x) = 1. Varningen som dök upp då jag försökte nå x = 2, visar att funktionen inte är lika lätthanterlig bortom x = 1. Otrevligheter i närheten av det område som man arbetar i, kan störa, så det är bra att (tack vare varningen) känna till att risken finns. Då är det oförlåtligt att slarva med kontrollerna. Jag tycker att det är bättre att redan under förarbetet ta reda på om den begärda noggrannheten kan uppnås med måttliga ansträngningar bättre än att lösa problemet i förhoppning att allt ska gå bra, och göra undersökningen efteråt. Jag beräknar därför, med Runge-Kuttas metod, y(0.9) (eftersom ekvationens rot ligger nära till vänster om 0.9). Härvid använder jag steglängder 0.01, 0.005, 0.0025,..., (dvs antal steg = 90, 180, 360) och kontrollerar i första hand regelbundenheten, sedan vilken steglängd som behövs för att få 8 decimalers noggrannhet. OBS! Det är roten till ekvationen y(x) = 1, som ska bestämmas med 8 decimalers noggrannhet, men felskattningen i Runge-Kuttas metod avser y-värdet. För roten gäller, som vi nyss såg, E tab = E y / y. Derivatavärdet får man genom att sätta in x och y i differentialekvationens f(x, y). Allt detta ordnas nu enkelt på en kommandofil (jag håller fortfarande på med förarbetet): Körning: y09(1)=rkbegv( Ex3dif,0,0.9,0,90); y09(2)=rkbegv( Ex3dif,0,0.9,0,180); y09(3)=rkbegv( Ex3dif,0,0.9,0,360); format long, y09 format short, delta=diff(y09) kvot=delta(1)/delta(2) yprim=ex3dif(0.9,y09(1)) Extab=abs(delta/yprim)
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 72) y09 = 1.03826902705165 1.03826902688434 1.03826902687349 delta = 1.0e-09 * -0.1673-0.0108 kvot = 15.4227 yprim = 1.8732 Extab = 1.0e-10 * 0.8932 0.0579 Den sista utmatningen ovan visar att felet i det x-värde, som (framöver) räknas fram, blir mindre än 0.9 10 10 när Runge-Kuttas metod används med 180 steg,. Ty: den sökta roten är något mindre än 0.9. Då kommer steglängden h när man tar 180 steg fram till roten, att bli något mindre än den var ovan. Därför blir trunkeringsfelet, h 4, i Runge-Kuttas metod mindre än här ovan, och därför blir i sin tur felet i x-värdet mindre än 0.9 10 10. Beteckna felgränsen E x,tab = 0.9 10 10. Ställ i ordning den funktionsfil, Ex3ekv.m, som Newton-Raphsons metod behöver: function [f,fprim]=ex3ekv(x) yslut=rkbegv( Ex3dif,0,x,0,180); f=yslut-1; fprim=ex3dif(x,yslut); Bearbetning >> rot=newrap( Ex3ekv,0.9); x f(x) df/dx t Ktest 9.0000e-01 3.8269e-02 1.8732e+00 2.0430e-02 8.7957e-01 1.0208e-03 1.7752e+00 5.7501e-04 1.3776e+00 8.7900e-01 7.4512e-07 1.7726e+00 4.2035e-07 1.2713e+00 8.7899e-01 3.9635e-13 1.7726e+00 2.2359e-13 1.2654e+00 rot = 0.87899461755500 Efterarbete Ktest visar regelbundenhet. Trunkeringsfelet i Newton-Raphsons metod kan därför skattas 1.2654 (2.2359 10 13 ) 2, och är alltså helt försumbart. Avrunda resultatet till 8 decimaler, 0.87899462, så uppkommer presentationsfelet E pres = 2.445 10 9. Det dränker trunkeringsfelet. Totalfelet i skattningen är E x,tab + E pres = 2.535 10 9, som är < 0.5 10 8. Resultat: Roten är 0.87899462 med 8 korrekta decimaler.
André Jaun, HT-2005Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid lxxv) Fördjupning frivillig läsning Konvergensordning Som det står i GNM-sid (2)9 definieras konvergensordning p för en talföljd, sådan att lim x n = α av n x n+1 α lim n x n α p = K 0 Newton-Raphsons metod Som det också står på samma sida, och som det ofta kommer att sägas i den här kursen, så har Newton-Raphsons metod kvadratisk konvergens, dvs konvergensordningen p = 2. Jag bevisar detta: x = α är rot till ekvationen f(x) = 0. Från x n i närheten av α beräknas x n+1 som bekant med formeln x n+1 = x n f(x n )/f (x n ). Taylorutveckla f(α) kring x = x n : 0 = f(α) = f(x n ) + (α x n )f (x n ) + 1(α x 2 n) 2 f (x n ) + O(α x n ) 3. Dividera med f f(x n ) (x n ): f (x n ) + α x n + 1(α x 2 n) 2 f (x n ) f (x n ) + O(α x n) 3 = 0. De första tre termerna bildar α x n+1, varför vi får: x n+1 α = 1(α x 2 n) 2 f (x n ) f (x n ) + O(α x n) 3. Dividera med (α x n ) 2 som är detsamma som (x n α) 2 : x n+1 α (x n α) = 1 f (x n ) 2 2 f (x n ) + O(x n α). Gränsövergången n visar nu att Newton-Raphsons metod är kvadratisk konvergent. Högra ledet går mot 1 f (α), vilket blir K i definitionen den asymptotiska 2 f (α) felkonstanten. En intressant detalj är att de absolutbelopp som ingår i definitionen inte dyker upp i beviset, och därför inte behövs i detta fall. Att K kan skattas med (x n+1 x n )/(x n x n 1 ) 2 = t n /t 2 n 1 är grunden för regelbundenhetskontrollen, och inte helt självklart. Det kan man visa så här (jag kortar lite i beteckningar och serieutvecklingar): x n x n 1 = f n 1 /f n 1 (x n x n 1 )f n 1 = f n 1; f n = f n 1 + (x n x n 1 )f n 1 + 1 2 (x n x n 1 ) 2 f n 1 +... = = f n 1 f n 1 + 1 2 (x n x n 1 ) 2 f n 1 +... = 1 2 (x n x n 1 ) 2 f n 1 +... Så: x n+1 x n = f n /f n = 1 2 (x n x n 1 ) 2 f n 1/f n +... De tre punkterna betyder väsentligen O((x n x n 1 ) 3. Vi kan därför dividera med kvadraten och får: (x n+1 x n )/(x n x n 1 ) 2 = 1 2 f n 1 /f n + O(x n x n 1 ) K, v s b.
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid lxxvi) Sekantmetodens konvergens Sekantmetoden är inte en enpunkts iterationsmetod för bestämmandet av x n+1 krävs ju två tidigare värden, x n och x n 1. Det är därför lite besvärligare att visa att just kvoten t n /(t n 1 t n 2 ) KONSTANT upplyser om regelbundenhet och att bestämma konvergensordningen, dvs exponenten p i gränsvärdet lim n x n α p x n+1 α. Liksom när man bevisar motsvarande saker för Newton-Raphsons metod, använder man sig av taylorutveckling, den här gången två stycken: Dels f(x n 1 ) = f(x n ) + (x n 1 x n )f (x n ) + 1 2 (x n 1 x n ) 2 f (x n ) + O(x n 1 x n ) 3. Härur får man f (x n ) = f(x n) f(x n 1 ) x n x n 1 + 1 2 (x n x n 1 )f (x n ) + O(x n x n 1 ) 2. Dels 0 = f(α) = f(x n ) + (α x n )f (x n ) + 1 2 (α x n) 2 f (x n ) + O(α x n ) 3. I denna serie byts f (x n ) ut, enligt den första utvecklingen. Man får: 0 = f(x n ) + (α x n ) f n f n 1 + 1 x n x (α x 2 n)(x n x n 1 + α x n )f (x n ) +... n 1 Tredje termen plus (den med tre punkter antydda) fortsättningen kan förenklas till 1 (α x 2 n)(α x n 1 )f (ξ 1 ), där ξ 1 ligger i intervallet uppspänt av α, x n och x n 1. Nu divideras utvecklingen med f n f n 1, och när denna kvot hamnar i tredje x n x n 1 termen, ersätts den med f (ξ 2 ), där ξ 2 ligger mellan x n och x n 1. Dessa åtgärder resulterar i formuleringen 0 = x n x n 1 f n + α x n + 1 f n f (α x 2 n)(α x n 1 ) f (ξ 1 ) n 1 f (ξ 2 ). Här känner man igen sekantmetodens uttryck för x n+1, varför man får x n+1 α = 1 2 (x n α)(x n 1 α)f (ξ 1 )/f (ξ 2 ), varav följer lim n x n+1 α (x n α)(x n 1 α) = 1 f (α) 2 f (α) I gränsvärdet återser vi den asymptotiska felkonstanten i Newton-Raphsons metod. Vi betecknar den, som förut, med K. Vidare ska konvergensordningen p bestämmas. När n är tillräckligt stort gäller x n+1 α c x n α p och x n α c x n 1 α p, dvs x n 1 α ( x n α /c) 1/p. Vi får därför c x n α p x n α c 1/p x n α 1/p K eller c(1+1/p) x n α (p 1 1/p) K. Detta ska gälla oberoende av n (tillräckligt stort). Därför måste det gälla att p 1 1/p = 0, en ekvation med lösningarna p = 1(1 ± 5). För konvergens krävs 2 p > 1, så den negativa lösningen blir inte aktuell, utan konvergensordningen är p = 1(1 + 5) 1.618. 2 Som biprodukt erhålls resultatet c K 1/p. Det återstår att visa att teststorheten t n /(t n 1 t n 2 ) K. I beviset utelämnar jag O-termer genom att istället skriva, detta för att inte skymma väsentligheter.
André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid lxxvii) t n är definerat så att det gäller t n = (x n+1 x n ). Ur taylorutvecklingen av f(α) kring x = x n på förra sidan får vi x n α + f n /f n + 1 2 (x n α) 2 f n /f n. Alltså: t n = x n+1 x n x n+1 α f n /f n 1(x 2 n α) 2 f n /f n = ( xn+1 α = (x n α) x n α f n f(α) x n α 1 1 f (x n 2 n α) f n ) f n ( (xn+1 α) (x n α) p 1 (x n α) f n 1(x 2 n α)f n 1 (x n α) p f (x n 2 n α) f n ) = f n = (x n α) (c (x n α) p 1 1). Här används p och c i samma innebörd som på förra sidan. Det väsentliga är att exponenten p 1 > 0; den är 1 2 ( 5 1) 0.618. Vi har alltså kommit fram till t n (x n α) (1 c(x n α) p 1 ) Motsvarande utvecklingar erhålles för t n 1 och t n 2. Låt N vara det av det tre talen n, n 1 och n 2 för vilket x α är störst. Vi får t n t n 1 t n 2 x n α (x n 1 α)(x n 2 α) (1 + O(x N α) 0.618 ) K där approximationerna blir allt bättre ju större n är. Slut på fördupningstexten