Innhold:

Denne artikkelen viser hvordan du kan bruke Matlab til å lage en funksjon som beregner en 1. ordens differensialligning ved Eulers metode. Eulers metode er pensum i Matematikk 1, og er beskrevet i Calculus 1, Pearson, kapittel 18.3 side 1001.


 

Teorien for Eulers metode

Eulers metode finner en tilnærmet løsning på initialverdiproblemet

på intervallet x ∈ [a,b]. Vi deler intervallet fra a til b i N biter. Da blir lengden av hver bit

Dette kalles også skrittlengden h i Eulers metode. Eulers metode finner en omtrentlig løsning u(xi) til den matematisk eksakte løsningen y(xi) i punktene

Merk at vi bruker u(xi) for de beregnede verdiene fra Eulers metode og ikke yi som Calculus 1, Pearson, kapittel 18.3 for bedre å skille beregnet og eksakt verdi fra hverandre. Det er også mer oversiktlig å bruke en egen variabel u når vi skal programmere — slike hensyn trenger ikke matematikere å ta. Med denne notasjonen blir Eulers metode:

 

hvor ui ≈ y(xi) for i = 1,...,N. Figuren nedenfor viser sammenhengen mellom a,b,N og h.

 

Pekere til funksjoner

Fra teorien i forrige avsnitt vil vi gjerne lage en funksjon på formen

 u = int_euler(a,b,ya,N,F);

Det er ett problem her: F. Vi vil gjerne angi navnet på funksjonen F(x,y) vi skal bruke i differensialligningen vår, og ikke skrive en ny Matlab-funksjon hver eneste gang vi har en ny F i differensialligningen. Det blir altfor tungvint! Heldigvis har forfatterne av Matlab (og andre programmeringsspråk) tenkt på dette. I programmering kaller vi det pekere til funksjoner. Vi navngir en funksjon F, hvor mange variable den skal ta og hva den skal regne ut med

funksjonsnavn = @(variable) «beregning»;

Det som er nytt her er tegnet @ (krøllalfa), som brukes til å fortelle Matlab at vi angir en funksjon og ikke en vanlig Matlab-variabel i en tilordning. Se denne artikkelen for flere detaljer om lagring av funksjoner i variable. I Calculus 1 kap. 18.3, har vi gitt en differensialligning med funksjon, eller høyreside.

I Matlab angir vi dette ved funksjonsdefinisjonen:

F = @(x,y) x + y/5;

Etter at vi har gjort dette kan vi sende F inn i vår funksjon int_euler !

Implementasjon av int_euler

Vi er nå nesten klare til å skrive int_euler. Det er ett lite problem som gjenstår. Vi vil gjerne lagre tilnærmingen vår til løsningen i en vektor (liste) med N+1 verdieru(0:N). Imidlertid må alle indekser i Matlab starte med 1! Dette forkludrer programmeringen litt, fordi vi må returnere u(1:N+1), og så må du huske på at u(1) i Matlab er y0 i i Matte 1 osv.

Dette er dessverre noe vi bare må leve med fordi Matlab er laget slik. Problemet er at det er fort gjort å gjøre såkalte off-by-oneprogrammeringsfeil — at du bruker en indeksverdi høyere eller lavere enn det du skulle ha gjort. En liten trøst er at off-by-one er en av de vanligste feilene i programmering.

Koden til int_euler.m er lagt ut som en egen lenke i tilfelle du har lyst til å programmere den selv først. For å bruke int_euler til å løse problemer må du skrive noe tilsvarende dette i kommandovinduet:

F = @(x,y) x + y/5;
u = int_euler(0,5,-3,25,F);

Prøv selv å regne ut dette og plotte og/eller sammenligne med resultatene fra boken!

 

Hvis du sammenligner resultatene u(xi) fra Eulers metode den matematiske løsningen y(xi) for ligninger du klarer å løse ser du at feilen vokser med størrelsen på steglengden h. Vi sier at feilen er proporsjonal med h eller også O(h). Eulers metode er ikke så veldig nøyaktig fordi vi må bruke en svært liten steglengde for å få gode resultater.

 

Det fins mange andre og mer nøyaktige måter for å løse differensialligninger på datamaskin. Hvis du har lyst til å undersøke dette nærmere kan du sammenligne Eulers metode med 2. ordens Runge-Kutta og 4. ordens Runge-Kutta. Prøv en ligning du lett kan finne svaret på og sammenlign mot den matematiske løsningen, f.eks F(x,y) = y, x ∈[0,1], y(0) = 1


Nøyaktigheten av Eulers metode

Hvis du sammenligner resultatene u(xi) fra Eulers metode den matematiske løsningen y(xi) for ligninger du klarer å løse ser du at feilen vokser med størrelsen på steglengden h. Vi sier at feilen er proporsjonal med h eller også O(h). Eulers metode er ikke så veldig nøyaktig fordi vi må bruke en svært liten steglengde for å få gode resultater.

Det fins mange andre og mer nøyaktige måter for å løse differensialligninger på datamaskin. Hvis du har lyst til å undersøke dette nærmere kan du sammenligne Eulers metode med 2. ordens Runge-Kutta og 4. ordens Runge-Kutta. Prøv en ligning du lett kan finne svaret på og sammenlign mot den matematiske løsningen, f.eks F(x,y) = y, x ∈[0,1], y(0) = 1.


  • No labels