Differentialekvationer begynnelsevärdesproblem

Relevanta dokument
Denna föreläsning. DN1212 Numeriska metoder och grundläggande programmering FN Differentialekvationer. Repetition av FN5 (GNM kap 6.

LAB 4. ORDINÄRA DIFFERENTIALEKVATIONER. 1 Inledning. 2 Eulers metod och Runge-Kuttas metod

Föreläsning 8, Numme i2,

f(x + h) f(x) h f(x) f(x h) h

Ordinära differentialekvationer,

Laboration 3. Funktioner, vektorer, integraler och felskattning

Sammanfattning (Nummedelen)

Laboration 3. Funktioner, vektorer, integraler och felskattning

a = a a a a a a ± ± ± ±500

Föreläsningen ger en introduktion till differentialekvationer och behandlar stoff från delkapitel 18.1, 18.3 och 7.9 i Adams. 18.

LAB 1. FELANALYS. 1 Inledning. 2 Flyttal. 1.1 Innehåll. 2.1 Avrundningsenheten, µ, och maskinepsilon, ε M

Numeriska metoder för ODE: Teori

Fel- och störningsanalys

4 Numerisk integration och av differentialekvationer

Numeriska metoder för ODE: Teori

Numeriska metoder för ODE: Teori

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 93) Trapetsregeln Adaptiva metoder ODE-metod Förbehandlande metoder

TENTAMEN I GRUNDKURS I NUMERISKA METODER - DEL 20

Fel- och störningsanalys

Laboration 4. Numerisk behandling av integraler och begynnelsevärdesproblem

Laboration 2 Ordinära differentialekvationer

Ordinära differentialekvationer,

LAB 3. INTERPOLATION. 1 Inledning. 2 Interpolation med polynom. 3 Splineinterpolation. 1.1 Innehåll. 3.1 Problembeskrivning

Denna föreläsning. DN1212 Numeriska metoder och grundläggande programmering FN Runge-Kuttas metoder. Repetition av FN6 (GNM kap 6.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 60) Problemformulering. Använd matematik

Laboration 6. Ordinära differentialekvationer och glesa system

Interpolation Modellfunktioner som satisfierar givna punkter

AUTONOMA DIFFERENTIALEKVATIONER

Laboration 4. Numerisk behandling av integraler och begynnelsevärdesproblem

TANA19 NUMERISKA METODER

DN1212 för M: Projektrapport. Krimskramsbollen. av Ninni Carlsund

Repetitionsfrågor: 5DV154 Tema 4: Förbränningsstrategier för raketer modellerade som begynnelsevärdesproblem

Del I: Lösningsförslag till Numerisk analys,

Teorifrågor. 6. Beräkna konditionstalet för en diagonalmatris med diagonalelementen 2/k, k = 1,2,...,20.

TATA42: Föreläsning 7 Differentialekvationer av första ordningen och integralekvationer

LABORATION 2. Trapetsregeln, MATLAB-funktioner, ekvationer, numerisk derivering

Föreläsning 1. Numeriska metoder grundkurs II, DN1240. Carina Edlund Mottagningstid i rum 4516: onsdagar kl.

Tentamen del 1 SF1546, , , Numeriska metoder, grundkurs

Tentamen i Teknisk-Vetenskapliga Beräkningar

LABORATION cos (3x 2 ) dx I =

6 Derivata och grafer

KTH 2D1240 OPEN vt 06 p. 1 (5) J.Oppelstrup

Tentamen, del 2 DN1240 Numeriska metoder gk II för F

Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson Plot och rekursion

Konvergens för iterativa metoder

Numerisk lösning till den tidsberoende Schrödingerekvationen.

OH till Föreläsning 15, Numme K2, God programmeringsteknik

Kan du det här? o o. o o o o. Derivera potensfunktioner, exponentialfunktioner och summor av funktioner. Använda dig av derivatan i problemlösning.

Newtons metod och arsenik på lekplatser

4 Fler deriveringsregler

Matlab övningsuppgifter

y y 1 = k(x x 1 ) f(x) = 3 x

Lösningsanvisningar till de icke obligatoriska workoutuppgifterna

Tentamen i Beräkningsvetenskap II, 5.0 hp,

Läsanvisningar till kapitel 6 i Naturlig matematik. Avsnitt 6.6 ingår inte.

Tentamen i Beräkningsvetenskap I/KF, 5.0 hp,

MAA7 Derivatan. 2. Funktionens egenskaper. 2.1 Repetition av grundbegerepp

SF1669 Matematisk och numerisk analys II Lösningsförslag till tentamen DEL A

Labb 3: Ekvationslösning med Matlab (v2)

Uppgift 1 R-S. Uppgift 2 R-M. Namn:...

Funktionsstudier med derivata

DERIVATA. = lim. x n 2 h h n. 2

Lösningar till Tentamen i Beräkningsvetenskap II, 5.0 hp, Del A. 1. (a) ODE-systemet kan skrivas på formen

Fixpunktsiteration. Kapitel Fixpunktsekvation. 1. f(x) = x = g(x).

TANA19 NUMERISKA METODER

Institutionen för matematik KTH. Tentamensskrivning, , kl B1210 och 5B1230 Matematik IV, för B, M, och I.

Tentamen, del 2 Lösningar DN1240 Numeriska metoder gk II F och CL

Tentamen i Beräkningsvetenskap II, 5.0 hp,

d dx xy ( ) = y 2 x, som uppfyller villkoret y(1) = 1. x, 0 x<1, y(0) = 0. Bestäm även y( 2)., y(0) = 0 har entydig lösning.

Kurs DN1215, Laboration 3 (Del 1): Randvärdesproblem för ordinära differentialekvationer

Icke-linjära ekvationer

(a) Skriv en matlabsekvens som genererar en liknande figur som den ovan.

Laboration: Grunderna i Matlab

Omtentamen i DV & TDV

0.31 = f(x 2 ) = b 1 + b 2 (x 3 x 1 ) + b 3 (x 3 x 1 )(x 3 x 2 ) = ( ) + b 3 ( )(

Ickelinjära ekvationer

Tentamen i Beräkningsvetenskap I och KF, 5.0 hp,

TENTAMEN I GRUNDKURS I NUMERISKA METODER - DEL 2

LÖSNINGSFÖRSLAG TILL TENTAMEN 2 SF1664

TAIU07 Matematiska beräkningar med Matlab

Tentamen i Beräkningsvetenskap II, 5.0 hp,

Linjära system av differentialekvationer

Tentamen i Beräkningsvetenskap II, 5.0 hp,

Block 5: Ickelineära. ekvationer? Läroboken. Löpsedel: Icke-lineära. ekvationer. Vad visade laborationen? Vad visade laborationen?

GeoGebra i matematikundervisningen - Inspirationsdagar för gymnasielärare. Karlstads universitet april

Mälardalens högskola Akademin för utbildning, kultur och kommunikation

Sidor i boken f(x) = a x 2 +b x+c

Linjärisering och Newtons metod

Ordinära differentialekvationer (ODE) 1 1

Datoraritmetik. Från labben. Från labben. Några exempel

SF1625 Envariabelanalys Lösningsförslag till tentamen

OH till Föreläsning 14, Numme I2, God programmeringsteknik

Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x

Sammanfattning av föreläsning 11. Modellbygge & Simulering, TSRT62. Föreläsning 12. Simulering. Föreläsning 12. Numeriska metoder och Simulering

Sekant och tangent Om man drar en rät linje genom två punkter på en kurva får man en sekant. (Den gröna linjen i figuren).

Matematisk analys för ingenjörer Matlabövning 2 Numerisk ekvationslösning och integration

FÖRSÄTTSBLAD TILL TENTAMEN. ELLER (fyll bara i om du saknar tentamenskod): Datum: 16 januari Bordsnummer:

MMA127 Differential och integralkalkyl II

Introduktion till MATLAB

Partiella differentialekvationer av första ordningen

Transkript:

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 33) Lektion 3, 4 och 5 Differentialekvationer begynnelsevärdesproblem Standardform och definitioner Eulers metod Runge-Kuttas metod Adaptiva metoder Stabilitet Standardform och definitioner (GNM 7:1A B) Standardformen för begynnelsevärdesproblem ser ut så här: dy dx = f(x, y) ; y(a) = c. Exempelvis differentialekvationen y xy x 2 = 0, y(0) = 1 skrivs på standardform: y = x 2 + xy; y(0) = 1. Denna differentialekvation är av första ordningen, dvs Den är ordinär, dvs... och linjär, dvs... Numeriska metoder för begynnelsevärdesproblem Grundstenen i de så kallade diskretiseringsmetoderna är att steg för steg skaffa sig en approximativ lösning till differentialekvationen. Steg för steg betyder att x-axeln delas in i delar detta är diskretiseringen, dvs att övergå från den kontinuerliga beskrivningen till den punktvisa (diskreta). I de metoder vi ska studera är delarna lika långa, och har längden h, metodens steglängd: x i = a + i h, i = 0, 1, 2...

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 34) y = f(x, y); y(a) = c. Man har därmed några olika lösningar till begynnelsevärdesproblemet att hålla reda på. Man håller isär dem med hjälp av olika beteckningar (se GNM 7:2A): Värdet av den sanna lösningen för x = x i : Värdet av den approximativa lösningen för x = x i som den använda numeriska metoden ger: Värdet av den approximativa lösningen, med även avrundningsfel beaktade beteckningar som dock bara används när man har behov av extra tydlighet: I metoderna som vi ska titta på, ersätts derivata (kontinuerlig beskrivning) med differenskvot (diskret beskrivning), dvs för x = x i byts y (x i ) ut mot (y i+1 y i )/h. Redan därmed har man infört ett fel, trunkeringsfelet i derivataskattningen. Snabbrepetera: Vad är trunkeringsfel? I fortsättningen gäller därför inte den diskretiserade ekvationen exakt. Den sanna ekvationen var y = f(x, y). Den diskretiserade blir (y i+1 y i )/h f(x i, y i ) (= f i ). Med de närmevärdesbeteckningar som infördes förra gången kan vi skriva den på formen y i+1 = y i + h f i De olika metoderna skiljer sig i fråga om vad man gör med f i för att få god noggrannhet. Noggrannheten mäts med noggrannhetsordningen, ett begrepp som har två definitioner, den första lite vag men fullt tillräcklig, den andra strikt matematisk:

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 35) Noggrannhetsordningen p definieras via trunkeringsfelet: 1. e trunk = y(x; h) y(x) c h p. 2. y(x; h) y(x) lim = c 0. h 0 h p Hög noggrannhetsordning, dvs stort värde på p, eftersträvas. Eulers metod (GNM 7:2B). Detta är den enklaste metoden, den där f i helt enkelt sätts lika med f(x i, y i ). Den diskretiserade lösningen får då det förlopp som jag visade i översta rutan på förra sidan Eulers metod innebär rekursion enligt formeln: EXEMPEL 1 Demonstration av Eulers metod för differentialekvationen y = xy; y(0) = 1. Differentialekvationen har lösningen y = e x2 /2. Jag beräknar den numeriska lösningen (med Eulers metod) med steglängden h = 0.1 och jämför resultaten med den sanna lösningen i intervallet 0 x 1. x=0; y=1; X=x; Y=y; h=0.1; for n=1:10 y=y+h*(x*y); Y=[Y y]; x=x+h; X=[X x]; xgr=[0:100]/100; ygr=exp(xgr.^2/2); plot (X,Y, o,x,y,xgr,ygr), grid, title( Eulers metod ) 1.8 Eulers metod 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 36) Som synes får man ett rätt stort fel. Eulers metod har noggrannhetsordning 1, dvs trunkeringsfelet är c h. Det krävs därför en mycket liten steglängd för att åstadkomma god noggrannhet: EXEMPEL 2 Bestäm y(1) med ett fel mindre än 2 10 7, när y = x 2 + xy; y(0) = 1. Eftersom noggrannhetsordningen är 1 kommer jag att behöva en steglängd h kanske 10 6, 10 7. För att få en uppfattning om felet, vill jag beräkna y(1; h) för en följd h- värden. Vid regelbundenhet ska differenserna mellan dessa y-värden bilda kvoter Q 1, där Q är kvoten mellan successiva h-värden. (Detta enligt genomgången på Lektion 2.) Jag väljer Q = 10, och skriver ett program som bara lämnar det nödvändigaste materialet till utskrift. N=10000; h=1/n; for k=1:4 x=0; y=1; for n=1:n y=y+h*x*(x+y); x=x+h; H(k)=h; yett(k)=y; N=10*N; h=h/10; deltay=diff(yett); M=length(deltay); kvot=deltay(1:m-1)./deltay(2:m); disp( h y(1;h) delta-y kvoter ) format long disp([h yett [0, deltay] [0, 0, kvot] ]) Körningen tog rejäl tid i anspråk, men resultaten kom: h y(1;h) delta-y kvoter 0.00010000000000 2.05920842089767 0 0 0.00001000000000 2.05938750521620 0.00017908431853 0 0.00000100000000 2.05940541531299 0.00001791009679 9.99907039288239 0.00000010000000 2.05940720612135 0.00000179080836 10.0011241785299 Kvoterna är mycket nära 10, så jag skattar trunkeringsfelet med y/9, dvs 1.7908 10 6 /9 1.99 10 7 = E trunk. Minns du: Varför division med just 9? Övriga fel är försumbara (enligt definitionen av regelbundenhet). Avrunda det sista y(1; 10 7 ) till åtta decimaler E pres = 6.12135 10 9 ; E total = 2.06 10 7 som är lite för stort. Av skäl som jag strax ska förklara struntar jag i detta övertramp och svarar: y(1) = 2.05940720 ± 2.1 10 7. Det är ett bra resultat, och slutsatsen kan lätt bli att Eulers metod är användbar. Här på lektionen är det kanske ingen som märker misstaget i den slutsatsen, eftersom ingen var med när jag körde programmet. Men... Med h = 10 7 krävs tio miljoner steg för att gå från x = 0 till x = 1. Vi ser att i den inre for-slingan utförs två multiplikationer och tre additioner per varv. Det är

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 37) fem operationer, dvs 50 miljoner innan x = 1 nås. Körningen med h = 10 6 kräver tiondelen, dvs 5 miljoner operationer, h = 10 5 kräver 0.5 miljoner osv. Körningen av hela programmet tog 15 min 33 sek i anspråk, vilket är förfärligt mycket för ett så litet program. Av detta ägnas andelen 50/55.55 (vilket blir 14 minuter) åt den del där h = 10 7. Skulle jag ha önskat ännu bättre noggrannhet och kört med h = 10 8 så skulle datorn ha jobbat ytterligare 10 gånger 14 min = 2 tim 20 min! Det var därför jag avstod från detta, när jag upptäckte att felet blev lite för stort. Eftersom datorns tid för en aritmetisk operation är på nivån mikrosekunder, bryr man sig numera inte så mycket om att putsa på detaljer i sina algoritmer. Men det är skillnad mellan detaljer och detaljer. Man bör se noga upp med hur man skriver programmets mest genomlöpta satser. Jag har skrivit x*(x+y) istället för x^2+x*y i programmet. Användningen av uppåtpilen åstadkommer anrop av logaritmfunktionen och exponentialfunktionen, vilka evaluerar värdet x 2 med cirka 200 aritmetiska operationer! Det betyder att den körning som tog mig 15 min 33 sek skulle ha tagit 40 gånger längre tid, 10 timmar och 22 minuter, om jag inte hade gjort denna putsning. Eulers metod är alltså inte en metod för praktisk användning, annat än för grova överslagskalkyler. Däremot lämpar den sig till teoretiska resonemang eftersom det är så lätt att förstå hur den arbetar. Med den förståelsen kan du sedan med större säkerhet arbeta med de mer komplicerade och för praktiskt bruk bättre metoderna. Runge-Kuttas metod (GNM 7:2C) Det finns en hel skara metoder som kallas rungekuttametoder. De utgår alla från grundformeln y i+1 = y i +h f i. Man konstruerar olika f i i syfte att få hög noggrannhetsordning. Den metod som i GNM-7:2C kallas Runge-Kuttas metod är den vanligaste varianten av de många befintliga. Den har noggrannhetsordning 4, dvs trunkeringsfelet är c h 4. Formlerna för Runge-Kuttas metod ser kanske avskräckande ut (se även GNM 7:2C), men det är ju bara datorn som ska handskas med dem, och det är inte meningen att du ska lära dig dem utantill. Utgåe från (x i, y i ) beräknas: k 1 = h f(x i, y i ) ; k 2 = h f(x i + 1h, y 2 i + 1k 2 1) ; k 3 = h f(x i + 1h, y 2 i + 1k 2 2) ; k 4 = h f(x i + h, y i + k 3 ) ; y i+1 = y i + (k 1 + 2k 2 + 2k 3 + k 4 )/6 ; x i+1 = x i + h. k1=h*f(x,y); k2=h*f(x+h/2,y+k1/2); k3=h*f(x+h/2,y+k2/2); k4=h*f(x+h,y+k3); y = y+(k1+2*k2+2*k3+k4)/6; x = x+h;

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 38) EXEMPEL 2, fortsättning Bestäm y(1) med ett fel mindre än 2 10 7, när y = x 2 + xy; y(0) = 1. Nu ska det göras med Runge-Kuttas metod. Med tanke på att funktionen ska beräknas 4 gånger i varje steg som metoden tar, så är det mycket lämpligt att skriva ett funktionsprogram för differentialekvationen. function yprim=ex2f(x,y) yprim=x*(x+y); Nu gör jag som förut, med skillnaden att jag kan arbeta med mycket större steglängder. Jag försöker med h = 0.1, 0.05 och 0.025: N=10; h=1/n; for k=1:3 x=0; y=1; for n=1:n k1=h*ex2f(x,y); k2=h*ex2f(x+h/2,y+k1/2); k3=h*ex2f(x+h/2,y+k2/2); k4=h*ex2f(x+h,y+k3); y = y+(k1+2*k2+2*k3+k4)/6; x = x+h; H(k)=h; yett(k)=y; N=2*N; h=h/2; deltay=diff(yett); M=length(deltay); kvot=deltay(1:m-1)./deltay(2:m); disp( h y(1;h) delta-y kvot ) format long disp([h yett [0, deltay] [0, 0, kvot] ]) Körningen resulterar i utskrifterna: h y(1;h) delta-y kvot 0.10000000000000 2.05940650352732 0 0 0.05000000000000 2.05940735064542 0.00000084711810 0 0.02500000000000 2.05940740198607 0.00000005134064 16.49995131428045 Kvoten är tillräckligt nära 16 för att indikera regelbundenhet. Trunkeringsfelet skattas med hela differensen 5.134 10 8, eftersom kvoten inte ligger mycket nära 16. Repetera snabbt: Varför 16? Varför hela differensen? Vad annars? Avrunda y(1; 0.025) till 8 decimaler, E pres = 1.99 10 9 ; E trunk +E pres = 5.333 10 8 < 6 10 8 = E total. Svar: y(1) = 2.05940740 ± 6 10 8. Vid den här sortens övningar ska man förstås kontrollera om resultaten, som man fick med de olika metoderna, stämmer överens. Är inte alla siffror lika, så ska åtminstone

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 39) felområdena ha någon liten snittmängd gemensamt. Annars är det något som inte stämmer; metod och/eller felskattning. Det är bara slutsiffrorna som skiljer i de två svaren. De blir (20 ± 21) 10 8 i Eulers metod, dvs det resultatet kan nå upp till 41 10 8, och ligger därmed inuti felområdet (40 ± 6) 10 8 för resultatet i Runge-Kuttas metod. Den här metoden, att göra tillförlitlighetsbedömning genom att jämföra olika metoder, kallas metodvariation (se GNM 8:3D). Vi såg att det blev bättre noggrannhet med Runge-Kuttas metod än med Eulers. Detta är ganska självklart; betydligt viktigare är den stora tidsvinsten: I varje rungekuttasteg beräknas funktionen f(x, y) = x (x + y) fyra gånger, vilket kräver 4 multiplikationer och 4 additioner. Uträkningen av k 1, k 2, k 3 och k 4 sker med 4 multiplikationer (med h) och 6 additioner (division med 2 administreras i binär aritmetik på försvinnande kort tid, jämfört med tiden för en aritmetisk operation). Nytt y-värde tas fram med 4 additioner och 1 division (även multiplikation med 2 tar försumbar tid); nytt x- värde med 1 addition. Ett rungekuttasteg kräver alltså (4+4)+(4+6)+(4+1)+1=24 aritmetiska operationer. Med h = 0.1 tas 10 steg, sedan blir det 20 respektive 40 steg, när h halveras. Sammanlagt 70 steg, totalt 70 24 = 1680 aritmetiska operationer. Jag har granskat kalkylen så här noga, för att klargöra, att vid jämförbar noggrannhet kräver Runge-Kuttas metod försumbar tid jämfört med Eulers metod. Funktionsprogram som parameter Det känns onödigt att för varje ny differentialekvation skriva ett nytt program, som varje gång blir i stil med det i Exempel 2. MATLAB bjuder på möjligheten att skriva funktionsprogram som har funktionsprogram som parameter. Ett funktionsprogram som behandlar ett begynnelsevärdesproblem u = f(x, u), med Runge-Kuttas metod, kan utformas så här: function [uslut] =RKbegv(F,xstart,xslut,ustart,Nsteg); h=(xslut-xstart)/nsteg; x=xstart; u=ustart; for n=1:nsteg k1=h*feval(f,x,u); k2=h*feval(f,x+h/2,u+k1/2); k3=h*feval(f,x+h/2,u+k2/2); k4=h*feval(f,x+h,u+k3); x = x+h; u = u+(k1+2*k2+2*k3+k4)/6; uslut=u; Nyheten feval(f,x,u) (funktionsevaluering) ger precis samma resultat som F(x,u). Skillnaden är att i feval sätts det funktionsnamn in som man använder vid anropet av RKbegv.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 40) På så vis kan körningen av Exempel 2, fortsättning, med steglängden lika med ett av de tre h-värdena, genomföras med anropet yett(k)=rkbegv( Ex2f, 0, 1, 1, N) förutsatt att N har ett värde (= antal steg). Nu byts F överallt i RKbegv ut mot Ex2f. Så förvandlas t ex k1=h*feval(f,x,u); till k1=h*feval( Ex2f,x,u);. Detta betyder precis detsamma som k1=h*ex2f(x,u); men skulle man skriva det, så skulle RKbegv kunna användas ast för just Ex2f. Som RKbegv är skriven nu, kan programmet utan några ändringar användas till vilket begynnelsevärdesproblem som helst. EXEMPEL 2, fortsättning Jag löser precis samma uppgift med RKbegv: Nsteg=10; for k=1:3 yett(k)=rkbegv( Ex2f,0, 1, 1, Nsteg); Nsteg=2*Nsteg; deltay=diff(yett); M=length(deltay); kvot=deltay(1:m-1)./deltay(2:m); disp( h y(1;h) delta-y kvot ) H=1./[10 20 40]; format long disp([h yett [0, deltay] [0, 0, kvot] ]) Vid körning får jag exakt samma utmatning som förut. Det är vanligt att man önskar lösningen till differentialekvationen tabellerad eller ritad. Båda dessa presentationer kräver att lösningen beräknas i ett flertal punkter, inte bara i en slutpunkt. Med några enkla ändringar i RKbegv får jag ett rungekuttaprogram RKtab som levererar en tabell över lösningen från xstart till xslut: function [utab] =RKtab(F,xstart,xslut,ustart,Nsteg); x=xstart; u=ustart(:); utab=u ; h=(xslut-xstart)/nsteg; for n=1:nsteg k1=h*feval(f,x,u); k2=h*feval(f,x+h/2,u+k1/2); k3=h*feval(f,x+h/2,u+k2/2); k4=h*feval(f,x+h,u+k3); x = x+h; u = u+(k1+2*k2+2*k3+k4)/6; utab = [utab; u ]; EXEMPEL 2, fortsättning Gör en tabell över lösningen till differentialekvationen (samma som hittills) med 6 korrekta decimaler, för x = 0, 0.1, 0.2,..., 1.0, samt rita lösningen över intervallet 0 x 1.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 41) Erfarenheten från den föregåe behandlingen säger mig att att jag med h = 1/40 får lösningen till det här problemet med trunkeringsfel betryggande mycket mindre än 0.5 10 6. Jag bryr mig i det här fallet därför inte om att skatta trunkeringsfelet i varje tabellpunkt, eftersom det felet ändå dränks av presentationsfelet, vid avrundning till 6 decimaler. Y=RKtab( Ex2f,0, 1, 1, 40); xtabell=[0:10]/10 ; xgraf=[0:40]/40; ytabell=y(1:4:41); ytabell=round(1e6*ytabell)/1e6; format long, disp( x y ) disp([xtabell ytabell]) plot(xgraf,y), grid title( dy/dx = x(x+y) ) Körning av denna kommandofil ger tabell och graf: x y 0 1.00000000000000 0.10000000000000 1.00534700000000 0.20000000000000 1.02288900000000 0.30000000000000 1.05519200000000 0.40000000000000 1.10531900000000 0.50000000000000 1.17697500000000 0.60000000000000 1.27467900000000 0.70000000000000 1.40398800000000 0.80000000000000 1.57178800000000 0.90000000000000 1.78666600000000 1.00000000000000 2.05940700000000 dy/dx = x(x+y) 2 1.5 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 När man presenterar (redovisar) ett resultat, begärt i tabellform ska man (förstås) inte skriva tabellen som ovan. Med ordbehandlare ser man till att tabellen får vettigt utsee, och redovisar den i den här stilen:

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 42) x y(x) 0 1 0.1 1.005347 0.2 1.022889 0.3 1.055192 0.4 1.105319 0.5 1.176975 0.6 1.274679 0.7 1.403988 0.8 1.571788 0.9 1.786666 1.0 2.059407 (6 korrekta decimaler i tabellvärdena.) Filerna RKbegv.m och RKtab.m finns åtkomliga från hemsidan för kursen. Det är helt i sin ordning att knycka dem och använda dem. Har du dem blir sedan arbetet med mer sammansatta problem, innehållande behandling av begynnelsevärdesproblem, näst intill lustfyllt. Adaptiva metoder En metod för behandling av begynnelsevärdesproblem kan behöva anpassa steglängden till hur snabbt lösningen varierar. Den anpassningen ska helst göras automatiskt, dvs av programmet. Naturligt är då att grovskatta trunkeringsfelet när en viss steglängd har använts, och vid behov justera steglängden. (x i, y i ) / Ett steg med steglängd h y / E = y y Två steg med steglängd h 2 y Om E är mycket litet, så kan man kosta på sig att öka steglängden, säg till 2h. Om E är för stort, är steglängden för stor. Då går man tillbaka till x i och minskar steglängden, exempelvis till h/2. Om ingetdera av dessa inträffar, går man vidare från x i + h = x i+1 med y i+1 = y. MATLAB bjuder på......allehanda godis. Funktionerna ode23 och ode45 är adaptiva differentialekvationslösare. De bygger på kombinationer av olika rungekuttametoder. Jag har mest förtroe för ode45. Anrop sker i stil med [X,Y] = ode45( diffekv,[xstart,xslut],ystart)

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 43) Utdata X blir en kolumnvektor med de genererade x-koordinaterna mellan (och inklusive) x = xstart och xslut, och Y blir motsvarande y-koordinater. EXEMPEL 2, fortsättning Vi behandlar åter begynnelsevärdesproblemet y = x 2 + xy; y(0) = 1, nu med ode45. [X,Y]=ode45( Ex2f,[0:10]/10, 1); Y=round(1e6*Y)/1e6; disp( x y(x) ) format long, disp([x Y]) - - - - - - - - - - - - - - - - - - - - - - - - x y(x) 0 1.00000000000000 0.10000000000000 1.00534700000000 0.20000000000000 1.02288900000000 0.30000000000000 1.05519200000000 0.40000000000000 1.10531900000000 0.50000000000000 1.17697500000000 0.60000000000000 1.27467900000000 0.70000000000000 1.40398800000000 0.80000000000000 1.57178800000000 0.90000000000000 1.78666600000000 1.00000000000000 2.05940700000000 Detta är onekligen behändigt och dessutom i detalj samma resultat som med Runge- Kuttas metod. Men i det fördolda går behandlingen till på helt annat sätt. ode45 mellanlandar troligen i betydligt fler punkter än de som kommer med i tabellen. Om jag istället hade anropat ode45 med [X,Y] = ode45( Ex2f,[0 1], 1), så hade jag i utdatavektorerna fått med alla punkterna. Däremot är det inte säkert att metoden då hade hamnat i just 0.1, 0.2, 0.3..., eftersom steglängden kan variera. När man istället för bara startpunkt och slutpunkt ger mellanlandningspunkter, interpolerar MATLAB sig fram till de önskade punkterna från de värden som ode45 erhåller. Interpolationen kan resultera i sämre noggrannhet än de ursprungliga värdena har. I det här fallet ser vi (genom att jämföra med tidigare resultat) att vi har fått 6 korrekta decimaler. Lösningen ska, enligt manualen, få absoluta felet 10 6, men detta är inte att lita på. Det är just denna opålitlighet hos de annars så behändiga MATLAB-metoderna, som gör det nödvändigt att hålla sig med metoder som gör felskattning möjlig. Det finns två noggrannhetsparametrar att bolla med: RelTol, som ger relativa noggrannheten (och är 10 3 om man inte begär något annat) och AbsTol, som ger absoluta noggrannheten (10 6 som standard). Man sätter sina egna värden på parametrarna med hjälp av programmet odeset på det sätt som jag visar i exemplet här nedan. Det finns en rekommation för tillförlitlighetsbedömning, nämligen att ändra noggrannhetsparametrarna så att man får successivt noggrannare värden. Tanken är att man kan lita på de siffror som inte ändras när man ökar noggrannheten. I åtskilliga, för att inte säga de flesta, fall är denna tanke riktig. Därför är det så mycket viktigare att veta att den kan leda helt fel.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 44) EXEMPEL 3 Differentialekvationen y = 6y/x; y(x 0 ) = x 6 0 ; har lösningen y(x) = x6. Vi önskar med ode45 beräkna y(2). Eftersom vi vet att det riktiga värdet är 2 6 dvs 64, så kan vi se hur ode45 sköter sig. Jag varierar både RelTol och AbsTol mellan 10 3 och 10 11, och matar ut värdet för y(2). function yprim=x6dif(x,y) yprim=6*y/x; - - - - - - - - - - - - - - - - - - - - - x0=0.001; y0=x0^6; xslut=2; tol=0.01; disp( tolerans y(2) ) for k=3:11 tol=tol/10; noggrannhet=odeset( AbsTol,tol, RelTol,tol); [X,Y]=ode45( x6dif,[x0 xslut],y0,noggrannhet); M=length(Y); disp([tol Y(M)]) - - - - - - - - - - - - - - - - - - - - - - - tolerans y(2) 1.0000e-03 5.2112e-07 1.0000e-04 5.2112e-07 1.0000e-05 5.2112e-07 1.0000e-06 5.2112e-07 1.0000e-07 5.2112e-07 1.0000e-08 5.2112e-07 1.0000e-09 5.2112e-07 1.0000e-10 5.2112e-07 1.0000e-11 5.2112e-07 Om jag litar på de siffror som inte ändras när toleransen ändras, kan jag väl, efter denna överdrivet hårda kontroll, inte annat än tro att y(2) = 5.2112 10 7, korrekt intill sista siffran. Men, som sagt, rätta värdet är 64. Jag ska inte utan vidare påstå att Runge-Kuttas metod ger bättre resultat, men däremot får jag, med kontrollen av regelbundenhet, veta huruvida jag kan lita på resultaten. EXEMPEL 3, fortsättning Först Runge-Kuttas metod med normal steg- Samma begynnelsevärdesproblem. längd: h = 0.01, 0.01/2, 0.01/4. x0=0.001; y0=x0^6; xslut=2; Nsteg=100; for k=1:3 Nsteg=Nsteg*2; y2(k)=rkbegv( x6dif,x0,xslut,y0,nsteg) y2, deltay=diff(y2), kvot=deltay(1)/deltay(2) - - - - - - - - - - - - - - - - - - - - - - - - - - - y2 = 0.0416 0.6274 5.5242

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 45) deltay = 0.5859 4.8967 kvot = 0.1196 Kvotkontrollen upplyser om att resultaten är helt åt skogen. Om jag tror på att problemet överhuvudtaget har någon lösning, så får jag här också upplysningen att steglängden måste väljas mycket mindre. Jag undersöker den möjligheten genom att på andra raden sätta Nsteg=10000. Körningen tar rejäl tid i anspråk. Utskriften blir: y2 = 63.9303 63.9947 63.9996 deltay = 0.0644 0.0049 kvot = 13.0421 Kvoten är något sånär i närheten av 16, så jag kan i det tredje värdet skatta E trunk = 0.0049. Om jag presenterar resultatet avrundat till 3 decimaler, y(2) = 64.000 så har jag tillfört E pres = 4 10 4. Totalfelet, summan av dessa två fel, blir lite större än 0.5 10 2, så slutsvaret får bli y(2) = 64.000 ± 6 10 3. Det är tveksamt att acceptera kvoten 13 som 16. Med ytterligare steghalveringar skulle jag få en säkrare kvotkontroll (och en bättre felgräns). Stabilitet och instabilitet Lösningen till en första ordningens differentialekvation, y = f(x, y) är en hel skara kurvor. Entydighet får man först när man har gett ett villkor som fastlägger genom vilken punkt kurvan ska gå, dvs vilken av kurvorna i skaran man ska välja. Rent allmänt menar man med stabilitet att lösningen till ett problem inte är känslig för små störningar i indata. Omvänt innebär instabilitet att lösningen är överkänslig för små störningar i indata. Om det problem som den här utsagan syftar på, är begynnelsevärdesproblemet, så är indata begynnelsevillkoret. Om problemet är den numeriska behandlingen, så kan till indata räknas även steglängd. Eftersom det finns dessa två grundtyper av instabilitet är det lämpligt att hålla isär begreppen: (in-)stabilitet hos det matematiska problemet respektive (in-)stabilitet hos den numeriska metoden. Vi börjar med ett exempel på instabilitet hos en välkänd numerisk metod: EXEMPEL 4 Bestäm y(3) när y satisfierar begynnelsevärdesproblemet y = 100(y sin x), y(0) = 0. Jag använder Runge-Kuttas metod, med steglängder h = 0.015, 0.020, 0.025 och 0.030.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 46) function f=fex4(x,y) f=100*(sin(x)-y); - - - - - - - - - - - - - - - - - - - - - - - - for h=0.001*[15:5:30], N=round(3/h); h, y=rkbegv( fex4,0,3,0,n) disp( ********** ), - - - - - - - - - - - - - - - - - - - - - - - - h = 0.0150 y = 0.1510 ********** h = 0.0200 y = 0.1510 ********** h = 0.0250 y = 0.1509 ********** h = 0.0300 y = 6.7289e+11 ********** Uppenbarligen är det sista värdet helt fel. Vi måste omedelbart skaffa oss ett redskap som förklarar så underliga resultat: Undersökning med hjälp av testekvationen Man kommer häpnadsväckande många intressanta saker på spåren med hjälp av en mycket enkel differentialekvation, den så kallade testekvationen: y = qy; y(0) = 1. Med negativt värde på q är den sanna lösningen, y = e qx, avtagande. För en metod för behandling av differentialekvationer, y n+1 = y n + h F(x n, y n ) kan man genomföra den enkla undersökningen: För vilka värden på h q är den numeriska lösningen till testekvationen avtagande? Det kan låta som ett minimalt krav: att metoden ger avtagande lösning som approximation till en avtagande funktion. Trots det leder kravet ganska långt.

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 47) För vilka värden på h q ger Eulers metod avtagande lösning till ekvationen? ÖVNING Gör motsvarande undersökning för Runge-Kuttas metod. Jag ska varna för att övningen är betydligt besvärligare än undersökningen av Eulers metod. Resultatet är att hq ska ligga i intervallet 2.79 < hq < 0. Ett noggrannare värde på vänstra gränsen är 2.78529356340528. Man säger att den numeriska metoden är stabil för de värden på hq som ger avtagande lösning, och instabil för övriga hq. När man istället ägnar sig åt problemet y = f(x, y); y(a) = c så kommer derivatan f att spela den roll som q har i testekvationen. y I Exempel 4 är f y = 100. Runge Kuttas metod är därför stabil om 2.79 < 100h < 0, dvs om h < 0.0279. Vi kan konstatera att gränsen för stabiliteten är kritisk: med h bara aningen större än 0.0279 exploderar den numeriska lösningen. Lägg märke till att instabiliteten inte uppkommer av att många små fel går samman och översvämmar den riktiga lösningen. Instabiliteten beror enbart på att värdena i talföljden y n växer, en egenskap som inte har någonting med felen att göra. Men om dessutom fel uppkommer under beräkningsstegen, så multipliceras även dessa med en faktor större än 1 i varje steg. Så ska vi studera begreppet (in-)stabilitet hos det matematiska problemet. Då menar man den sanna lösningens känslighet för små störningar i indata. Betrakta de kurvskaror som löser följande två, ytligt sett likartade, differentialekvationer: (D1): y = x + y (D2): y = x y Kurv-skaran får man genom att variera begynnelsevillkoret,

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 48) säg y( 2) = 2 k 0.1, k = 0, 1, 2,..., 10. Jag genomför detta med MATLAB, och använder härvid ode45. Programmeringsdetaljerna är knappast intressanta. 60 y =x+y 2 y =x y 50 1.5 40 1 30 0.5 20 0 10 0 0.5 10 2 1.5 1 0.5 0 0.5 1 1.5 2 1 2 1.5 1 0.5 0 0.5 1 1.5 2 Som synes avlägsnar sig lösningskurvorna från varandra i D1, när de utgår från närbelägna startpunkter. Men i D2 närmar sig lösningskurvorna varandra. Om man nu tolkar varierandet av begynnelsevillkoret som störning av indata, ser vi att D1 är känsligt för störningar (lösningskurvorna avlägsnar sig från varandra), dvs problemet D1 är instabilt. Problemet D2 är inte känsligt för störningar i begynnelsevillkoret, dvs det är stabilt. Denna typ av (in-)stabilitet ligger alltså hos det matematiska problemet, och har därför ingenting med den numeriska metodens egenskaper att göra. Trots detta är det samma storhet som ska undersökas, om man vill veta något om stabiliteten hos det matematiska problemet y = f(x, y), nämligen f y : Avgörande för stabilitet (lösningskurvor närmar sig varandra) är att f y < 0. Det kan därför vara lämpligt att före den numeriska behandlingen av en differentialekvation undersöka om den har stabila lösningar. Undersökningen är lätt avklarad om det går att bestämma tecknet på f. Men om inte detta är lätt, så finns det en grafisk y teknik att utan att lösa differentialekvationen få en allmän bild av lösningsskaran. Riktningsfältet I det område av x-y-planet som man intresserar sig för, beräknar man f(x, y) i ett (stort) antal punkter. Dessa värden upplyser om riktningen hos den lösningskurva som passerar genom den punkten. Den riktningen kan man markera med en liten pil. Den figur som då uppkommer kallas riktningsfältet till differentialekvationen. (GNM 7:1D) Så här ser det ut för D1 och D2:

André Jaun, HT-2005 Anteckningar från lektioner i Numeriska Metoder fys-åk2. (Sid 49) y =x+y y =x y 1 1 0.8 0.8 0.6 0.4 0.6 0.4 0.2 0.2 0 0 0.2 0.2 0.4 0.6 0.8 1 1 0.5 0 0.5 1 0.4 0.6 0.8 1 1 0.5 0 0.5 1 Givetvis har MATLAB en inbyggd funktion för att rita riktningsfält. Den heter quiver och anropas enklast med fyra parametrar: quiver(xkoord, ykoord, pilx, pily). Här är xkoord x-koordinaterna till punkterna där pilarna ska ritas och ykoord är punkternas y-koordinater. Pilen ses som en liten vektor i x-y-planet, med x-komponent pilx och y-komponent pily. Den enklaste konstruktionen är x-komponenten = c 1 och y-komponententen = c f(x, y), där konstanten c väljs så att figuren blir snygg. Då får pilen riktningskoefficienten f(x, y). Parametrarna pilx och pily innehåller komponenterna för samtliga punkter som pilarna ska ritas i. Programmet för att rita de två figurerna ovan är mycket enkelt: xdat=-1:0.1:1; ydat= -1:0.1:1; [xg,yg]=meshgrid(xdat,ydat); px=ones(length(xdat)); fd1=xg+yg; fd2=xg-yg; figure(1), quiver(xg,yg,px,fd1), title( y =x+y ) figure(2), quiver(xg,yg,px,fd2), title( y =x-y )