BYFE/EMFE 1000, 2012/2013 Numerikkoppgaver veke 14 Løysingsforslag Oppgave 1 Samanlikning med analytisk løysing y = 3 2 x y, y(0) = 1. a) Dierensiallikninga er separabel: dy dx = 3 x y 2 dy = 3 x dx y 2 1 y dy = ln y = 3 2 3 2 x1/2 dx 1 1/2 + 1 x1/2+1 + C 1 = x 3/2 + C 1 y = ±e x3/2 +C 1 = Ce x3/2 (C = ±e C 1 ) Konstanten C bestemmer vi ved initialkravet: y(0) = 1 Ce 0 = C = 1, slik at y(x) = e x3/2 (q. e. d.). Plottet kan lagast slik i Octave: > x=0:1e-2:2; > y=exp(x.^(3/2)); > plot(x,y,'k','linewidth',2) > set(gca,'fontsize',15) > xlabel('x'); ylabel('y') Resultatet er vist i gur 1. 1
Figur 1: Svaret i deloppgåve 1a). Figuren viser eit plott av funksjonen y(x) = exp(x 3/2 ). b) Vi veit at P 1 (x) = y(a) + y (a)(x a). Dierensiallikninga fortel oss at y (a) = 3 2 a y(a), slik at P 1 (x) = y(a) + 3 2 a y(a) (x a). Om vi set inn a = x n og x = x n + h, får vi P 1 (x n +h) = y(x n )+ 3 xn y(x n ) (x n +h x n ) = y(x n )+ 3 xn y(x n ) h. 2 2 c) y 0 = 1 y n+1 = y n + 3 2 xn y n h, x n = nh. (1) Dersom y n = y(x n ), vil høgre side i uttrykket over vere ei lineær tilnærming til y(x n +h). Vi har tidlegare sett at dette er ei god tilnærming så lenge h er liten. Dermed har vi, sidan y 0 = y(x 0 ), at y 1 y(x 1 ), som igjen gir at y 2 y(x 2 ) og så vidare. Merk at vi for kvar slik iterasjon introduserer ein feil. Denne blir større og større for kvart ledd. d) Skriptet kan til dømes sjå slik ut: % Gir start og slutt for x x0=0; xslutt=2; 2
% Initialverdi for y: y0=1; % Gir talet på steg (blir lest inn frå skjerm) N=input('Gi talet paa steg: '); % Steglengda h=(xslutt-x0)/n; % Lagar vektor med x-verdiar xvektor=x0:h:xslutt; % Startar på vektor med y-verdiar yvektor(1)=y0; % Lagar resten med ei for-løkke for n=1:n % Tilorndar x- og y-verdiar xn=xvektor(n); yn=yvektor(n); % Finn neste y-verdi ved Eulers metode yvektor(n+1)=yn+3/2*sqrt(xn)*yn*h; end % Skriv x- og y-verktorane til skjerm xvektor yvektor Kommentarene i skriptet burde vere ganske forklarande. Vi har gitt skriptet namnet EulersMetode.m. Når vi køyrer det i Octave og gir N-verdien 10, får vi: > EulersMetode Gi talet paa steg: 10 xvektor = Columns 1 through 7: 0.00000 0.20000 0.40000 0.60000 0.80000 1.00000 1.20000 Columns 8 through 11: 1.40000 1.60000 1.80000 2.00000 yvektor = Columns 1 through 8: 1.0000 1.0000 1.1342 1.3494 1.6629 2.1091 2.7419 3.6429 3
Figur 2: Svaret i deloppgåve 1e). Figuren viser den analytiske løysinga av initialverdiproblemet saman med ei numerisk løysing basert på N = 10 steg. Columns 9 through 11: 4.9360 6.8091 9.5498 Denne måten å presentere svaret på, er jo ikkje så informativ. Det er nok betre å gjere det grask. e) Om vi legg følgande til i skriptet over, får vi dei plotta vi skal ha: % Vi plottar resultatet saman med den analytiske løysinga % Eksakt, analytisk løsying: xeks=x0:1e-2:xslutt; yeks=exp(xeks.^(3/2)); % Plottar eksakt løysing plot(xeks,yeks,'k-','linewidth',2) hold on % Plottar numerisk løysing plot(xvektor,yvektor,'r-','linewidth',2) hold off Vi køyrer skriptet igjen og set N = 10. Figuren vi då får, er vist i gur 2. Som vi ser, er ikkje dei to grafane særleg like. Då er vel h for stor då eller N for liten. f) Når vi gjentar det vi gjorde i forige del-oppgåve med stadig høgare N, får vi grafane vist i gur 3. Vi ser at den numeriske løysinga vår ser ut til å begynne å nærme seg den eksakte. Vi ser også at den numeriske løysinga 4
Figur 3: Svaret i deloppgåve 1f). Vi ser numeriske løysingar for ulike steglengder. konsekvent ligg under den eksakte. Fyrst når N = 500 begynnar det å bli vanskeleg å sjå skilnad på den numeriske og den eksakte løysinga. g) Vi skal vise at den generelle formelen y n+1 = y n + F (x n+1, y n+1 )h i vårt tilfelle kan skrivast slik: y n+1 = y n 1 3 2 n + 1 h 3/2. Vi set inn at F (x, y) = 3 2 x y og at xn = nh: y n+1 = y n + 3 xn+1 y n+1 h = y n + 3 2 2 n + 1h yn+1 h = ( y n+1 1 3 ) n + 1 h 3/2 2 = y n y n + 3 2 n + 1 yn+1 h 3/2 y n+1 = y n 1 3 2 n + 1 h 3/2 (q. e. d.) h) Vi endrar linje 23 i skriptet frå deloppgåve d) til: yvektor(n+1)=yn/(1-3/2*sqrt(n+1)*h^(3/2)); Med denne endringa gjentar vi det vi gjorde i deloppgåve f). Resultatet er vist i gur 4. Som vi ser, gir slett ikkje denne metoden noko betre resultat enn framover-metoden snarare tvert imot. Sjølv med 500 steg ser vi tydeleg skilnad på den eksakte og den numeriske løysinga. Til skilnad frå framover-metoden, gir bakover-metoden her ein graf som konsekvent ligg over den eksakte løysinga. 5
Figur 4: Svaret på deloppgåve 1h). Vi ser her numeriske løysingar basert på Eulers bakover-metode for ulike steglengder saman med den eksakte løysinga. i) Dei to eksempla oppgåva siktar til, er midpunktsformelen for numerisk derivasjon og midtpunktsseleksjonar, til skilnad frå høgre- og venstreseleksjonar, for Riemann-summar basert på regulære partisjonar. Når vi skal implementere denne metoden, er det berre det som står i for-løkka som treng endrast i høve til framover-skriptet. Denne kan implementerast slik: for n=1:n % Tilorndar x- og y-verdiar xn=xvektor(n); yn=yvektor(n); xnhatt=xn+h/2; ynhatt=yn+3/2*sqrt(xn)*yn*h/2; % Finn neste y-verdi ved Eulers midtpunk-metode yvektor(n+1)=yn+3/2*sqrt(xnhatt)*ynhatt*h; end Når vi lagar tilsvarande plott som i gur 3 og -4, får vi gur 5 som resultat. Vi ser her at konvergensen er langt raskare enn for dei andre to metodane. Oppgave 2 Utan fasit I desse oppgåvene har vi vald å gjere skriptet som implementerar Eulers metode litt meir generiske i den forstand at vi lagar ei eiga funksjonsl for F (x, y). På den måten er det går det ganske smidig å bruke det same skriptet for å løyse 6
Figur 5: Svaret på deloppgåve 1j). Figuren viser tydeleg at Eulers midtpunktsmetode har heilt andre konvergenseigenskaper enn framover- og bakover-metodane. forskjellige dierensiallikningar. Skriptet vi brukar for framover-metoden ser slik ut (det er svært likt det vi brukte oppgåve 1): % Tar bort gamle variable clear all % Gir start og slutt for x x0=0; xslutt=5; % Initialverdi for y: y0=0; % Gir talet på steg N=input('Gi talet paa steg: '); % Steglengda (blir skrive til skjerm) h=(xslutt-x0)/n % Initierar vektor med x-verdiar xvektor=x0:h:xslutt; yvektor(1)=y0; for n=1:n % Tilorndar x- og y-verdiar xn=xvektor(n); yn=yvektor(n); % y' er gitt ved differensiallikninga yderiv=derivfunk(xn,yn); 7
% Finn neste y-verdi ved Eulers metode yvektor(n+1)=yn+yderiv*h; end % Plottar løysinga hold on plot(xvektor,yvektor,'b-','linewidth',2) hold off Skriptet heiter EulerFramoverFunk.m. Merk at initialkravet og maksimal x- verdi framleis er hard-koda; dette må endrast når vi skal løyse ulike dierensiallikngar. Funksjonsla som gir F (x, y) heiter DerivFunk.m. For deloppgåve 2a) ser ho slik ut: function F=DerivFunk(x,y) % Funksjon som blir bruka av skripta EulersMetode.m og % og EulerMidpunkt.m. Funksjonen er høgresida i diff.- % likninga y'=f(x,y) F=sin(x+y^2); Midpunkts-metoden er implementert akkurat likt; det er berre for-løkka som er ulik. Den ser slik ut: for n=1:n % Tilorndar x- og y-verdiar xn=xvektor(n); yn=yvektor(n); % Tilordnar x-hatt og y'hatt xnhatt=xn+h/2; ynhatt=yn+derivfunk(xn,yn)*h/2; % Finn neste y-verdi ved Eulers midtpunk-metode yvektor(n+1)=yn+derivfunk(xnhatt,ynhatt)*h; end a) y = sin(x + y 2 ), y(0) = 0, x [0, 5]. Vi køyrer skriptet eire gonger med stadig høgare N (lågare h): > EulerFramoverFunk Gi talet paa steg: 10 h = 0.50000 > EulerFramoverFunk Gi talet paa steg: 20 8
Figur 6: Svaret på deloppgåve 2a). Figuren viser korleis svaret konvergerar med Eulers framover-metode. h = 0.25000 > EulerFramoverFunk Gi talet paa steg: 50 h = 0.10000 > EulerFramoverFunk Gi talet paa steg: 100 h = 0.050000 Plottet vi då får er vist i gur 6. Vi gjer tilsvarande med midpunktsformelen. Dette resultatet er vist i gur 7. For framover-metoden ser vi ut til å få eit rimeleg konvergert med resultat med h = 0.05, medan h = (5 0)/50 = 0.1 ser ut til å vere lite nok for midtpunktsmetoden. b) y + x 2 cos(x/2) = y, y(0) = 1, x [0, 4]. Likninga er ekvivalent med y = y x 2 cos(x/s). Vi endrar dei fyrste radene i skripta til følgande: % Tar bort gamle variable clear all % Gir start og slutt for x x0=0; xslutt=4; % Initialverdi for y: y0=1; 9
Figur 7: Svaret på deloppgåve 2a). Figuren viser det same som gur 6 bortsett frå at vi her har brukt midtpunktsmetoden Vidare endrar vi siste linje i funksjonsla til F=sqrt(y)-x^2*cos(x/2); Konvergesplotta er vist i gur 8 og -9. Framover-resultatet er nokonlunde konvergert med h = 0.01 (N = 400), medan h = 0.08 (N = 50) ser ut til å vere rikeleg lite nok med midpunktsmetoden. Ekstra: Oppgave 3 konvergensbevis a) Vi løyser dierensiallikninga: dy dx = y dy y = dx dx 1 y dy = ln y = x + C 1 y = e x+c 1 y = ±e x+c 1 = ±e C 1 e x = Ce x (C = ±e C 1 ) Vi bestemmer C ved initialkravet: y(0) = 1 Ce 0 = C = y 0. Altså: y(x) = y 0 e x, slik at y(1) = y 0 e. 10
Figur 8: Svaret på deloppgåve 2b). Som i gur 6 viser guren viser korleis svaret konvergerar med Eulers framover-metode. Figur 9: Svaret på deloppgåve 2b). Figuren viser det same som gur 8 bortsett frå at vi her har brukt midtpunktsmetoden 11
b) I følge Eulers metode får vi at y 1 = y 0 + y 0 h = y 0 (1 + h) y 2 = y 1 + y 1 h = y 1 (1 + y) = y 0 (1 + h) (1 + h) = y 0 (1 + h) 2 y 3 = y 2 + y 2 h = y 2 (1 + h) = y 0 (1 + h) 2 (1 + h) = y 0 (1 + h) 3 Og så vidare. Etterkvart blir det ganske tydeleg at vi for kvar iterasjon multipliserar forige ledd med (1 + h) slik at y n = y 0 (1 + h) n. c) lim y N = lim y 0(1 + h) N = y 0 N N lim N ( 1 + 1 N ) N = y 0 e (q. e. d.) d) Eulers bakover-metode gir her følgande formel: y n+1 = y n + y n+1 h y n+1 (1 h) = y n y n+1 = y n /(1 h). Det gir at y 1 = y 2 =. y n = y 0 1 h y0 y 1 1 h = 1 h y 0 (1 h) n 1 h = y 0 (1 h) 2 Grenseverdien blir: lim y N = lim N N y 0 (1 h) N = y 0 lim N ( 1 1 N ) N = y 0 lim u 0 (1+u)1/u = y 0 e (q. e. d.) Vi har her innført variabelbytet u = 1/N. 12