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»;
@
(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.