Matematisk analys i en variabel, AT1 TMV13-1/13 Matematiska vetenskaper Laboration Ordinära differentialekvationer Vi skall se på begynnelsevärdesproblem för första ordningens differentialekvation u = f(t, u), a t b u(a) = u a där f en given funktion och u a en given konstant. Som exempel tar vi problemet u = u(t) + sin(t) + cos(t), t 4 u() = u med analytisk (exakt) lösning u(t) = sin(t) + u e t. I den vänstra figuren nedan har vi ritat riktningsfältet och i den högra lösningskurvorna för några olika värden på u. Vi ser hur lösningskurvorna följer riktningsfältet. 1 1 u u(t) 1 1 1 3 4 t 1 3 4 t Metoder för att beräkna numeriska (approximativa) lösningar till differentialekvationer bygger på idéen att försöka följa riktningsfältet så noggrannt och effektivt som möjligt. Vi skall approximera lösningen u(t) till differentialekvationen på ett nät t n = a + nh för n =, 1,, N, med steglängden h = b a N. Låter vi u n beteckna approximationen av u(t n ) och ersätter u (t n ) med en framåt differenskvot D + u(t n ) så gäller D + u(t n ) = u(t n+1) u(t n ) h u (t n ) = f(t n, u(t n )) u(t n+1 ) u(t n ) + hf(t n, u(t n )) 1
Detta ger Eulers framåtmetod u n+1 = u n + hf(t n, u n ) Utgående från begynnelsevärdet försöker metoden följa riktningsfältet med korta steg. Metoden är explicit eftersom alla värden i högerledet är kända. Ersätter vi u(t n+1 ) med en bakåt differenskvot D u(t n+1 ) får vi D u(t n+1 ) = u(t n+1) u(t n ) h Detta ger Eulers bakåtmetod u (t n+1 ) = f(t n+1, u(t n+1 )) u(t n+1 ) u(t n ) + hf(t n+1, u(t n+1 )) u n+1 = u n + hf(t n+1, u n+1 ) Metoden är implicit eftersom u n+1, som är obekant, finns med även i f. För att ta ett steg måste man normalt lösa en icke-linjär ekvation med t.ex. Newtons metod. g(z) = z u n hf(t n+1, z) = Vi kan också integrera differentialekvationen från t n till t n+1 = t n + h och får u(t n+1 ) = u(t n ) + och kan sedan approximera integralen på olika sätt. tn+1 t n f(t, u(t)) dt Med vänster och höger rektangelregel får vi Eulers framåt- respektive bakåtmetod och med trapetsregeln får vi den implicita trapetsmetoden u n+1 = u n + h (f(t n, u n ) + f(t n+1, u n+1 )) Om vi i denna metod ersätter u n+1 i högerledet med en Euler framåt approximationen får vi Heuns metod som är en explicit metod. u n+1 = u n + h (f(t n, u n ) + f(t n + h, u n + hf(t n, u n ))) Metoderna vi sett på är alla konvergenta, dvs. tar vi tillräckligt liten steglängd kan vi få godtyckligt bra approximation på ett ändligt intervall. För Euler metoderna gäller att om vi halverar steglängden så (ungefär) halveras felet i approximationen. För trapetsmetoden och Heuns metod gäller att om vi halverar steglängden så delas felet i approximationen med (ungefär) fyra. Ett begynnelsevärdesproblem som beskriver förlopp eller processer vilka utspelas under tidsintervall av mycket olika storleksordning kallas för styvt. T.ex. inom kemisk reaktionsteknik är styva problem vanliga. För styva problem måste implicita metoder används, dvs. av typen Euler bakåtmetoden eller trapetsmetoden. Explicita metoder, som Euler framåtmetoden eller Heuns metod, blir mycket ineffektiva.
Rita riktningsfält Vi skall se hur man kan rita riktningsfält till differentialekvationen u = f(t, u), a t b u(a) = u a Ett riktningsfält består i en samling punkter (t i, u j ) i tu-planet (ett gitter) där vi i varje punkt ritar en liten pil i den riktning som en lösningskurva t (t, u(t)) genom punkten har precis i punkten, dvs. en pil i riktningen (1, u (t i )) = (1, f(t i, u j )). Vi skalar pilarna så att vi får en tydlig bild. (För korta pilar och inget syns, för långa pilar och bilden blir grötig.) Som exempel ritar vi riktningsfältet till det inledande begynnelsevärdesproblemet u = u(t) + sin(t) + cos(t), t 4 u() = u Först bildar vi ett gitter (grid) med meshgrid. I matriserna T och U kommer vi ha gittrets koordinater. Sedan bildar vi en matris DT med ettor, som är första koordinaterna i pilarna, och en matris DU, som är andra koordinaterna i pilarna. Slutligen ritar vi ut pilarna med quiver, där talet.9 är en skalfaktor (lagom långa pilar). >> f=@(t,u)-u+sin(t)+cos(t); >> a=; b=4; >> t=linspace(a,b,); u=linspace(-,,); >> [T,U]=meshgrid(t,u); >> DT=ones(size(T)); DU=f(T,U); >> quiver(t,u,dt,du,.9) Som resultat får vi vänstra figuren på första sidan. Uppgift 1. Rita riktningsfältet till följande begynnelsevärdesproblem u = cos(3t) sin(5t)u, t 5 Eget program i Matlab u() = u Vi skall nu beskriva hur man kan beräkna en numerisk lösning till begynnelsevärdesproblemet u = f(t, u), a t b u(a) = u a De metoder vi sett på går alla att använda men vi nöjer vi oss med Euler framåtmetoden, som är den enklaste av dessa metoder. Vi bildar först ett nät med nodpunkterna t n = a + nh, n =, 1,, N, och steglängden h = b a N. Detta ger en uppdelning av intervallet a t b i N stycken lika långa delintervall a = t < t 1 < t < < t n < t n+1 < < t N 1 < t N = b Vi beräknar sedan en approximativ lösning enligt U(t ) = u a U(t n+1 ) = U(t n ) + hf(t n, U(t n )). 3
Genom att förbinda punkterna (t n, U(t n )) med räta linjer får vi en graf och funktionen U(t) blir definierad också mellan beräkningsnoderna t n. I Matlab måste U(t n ) representeras av en vektor U med N komponenter. Med andra ord, U(n) skall innehålla approximationen av u(t n ) för beräkningsnoden (tidpunkten) t n. Vi ser på vårt inledande exempel och tar u() = 1. Så här enkel blir Matlab-koden >> f=@(t,u)-u+sin(t)+cos(t); >> a=; b=4; ua=1; >> N=1; h=(b-a)/n; >> t=a+(:n)*h; U=zeros(size(t)); >> U(1)=ua; >> for n=1:n U(n+1)=U(n)+h*f(t(n),U(n)); end >> plot(t,u) Uppgift. Vi ser återigen på begynnelsevärdesproblemet u = cos(3t) sin(5t)u, t 5 u() = Lös problemet med Euler framåtmetoden. Rita en graf av lösningen i en figur som dessutom innehåller riktningsfältet. Uppgift 3. Skriv en funktion min_ode med anropet [t,u]=min_ode(f,i,ua,h) som löser begynnelsevärdesproblemet med Euler framåtmetoden. Använd det progamskal du finner på kurshemsidan. Uppgift 4. Testa min_ode på följande begynnelsevärdesproblem. För varje exempel måste du skriva en funktionsfil av typen function y=funk(t,u). Lös först begynnelsevärdesproblemet analytiskt (dvs. som en formel med penna och papper). Rita både den analytiska lösningen u och den approximativa lösningen U i samma figur. (a). u (t) = t, 1 t 3 u(1) = 1 (b). u (t) = u(t), t u() = 1 (c). u (t) = t u(t), t 3 u() = 1 (d). u (t) = 5u(t), t 1 u() = Färdiga program i Matlab Det finns färdiga funktioner i Matlab för att lösa differentialekvationer, se Jönsson avsnitt 14.4. En sådan funktion är ode45 för vanliga begynnelsevärdesproblem, en annan är ode15s för styva problem. Med ode45 kan vi beräkna en lösning till vårt inledande exempel för t.ex. u() = 1 enligt >> a=; b=4; ua=1; >> [t,u]=ode45(@(t,u)(-u+sin(t)+cos(t)),[a b],ua); >> plot(t,u) 4
Här blir t en kolonnvektor, med t-värden mellan a och b, där lösningen är beräknad och U är en kolonnvektor med den beräknade lösningen för de olika t-värdena. Uppgift 5. För en sista gång ser vi på begynnelsevärdesproblemet u = cos(3t) sin(5t)u, t 5 u() = Lös problemet med ode45. Rita en graf av lösningen i en figur som även innehåller riktningsfältet och en approximation beräknad med Euler framåtmetoden. Använd olika färg för de olika graferna. System av differentialekvationer Med Matlab kan vi lika lätt lösa system av differentialekvationer u (t) = f(t, u(t)), a t b där u(t) = u 1 (t). u m (t) u(a) = u a, f(t, u) = f 1 (t, u 1 (t),, u m (t)). f m (t, u 1 (t),, u m (t)), u a = Skillnaden är att nu blir U en matris och vi finner u k (t) (för olika tidpunkter t i ) som kolonn U(:,k), dvs. kolonn nr k i U. Som exempel på ett system av ekvationer tar vi: Populationsdynamik Vi betraktar population av bytesdjur (kaniner) som lever tillsammans med en population rovdjur (rävar). Låt u 1 (t) respektive u (t) beteckna antalet kaniner respektive rävar vid tiden t. En enkel matematisk modell för populationernas utveckling ges av Volterra-Lotka-ekvationerna: u 1 (t) = a u 1 (t) bu 1 (t) u (t) u (t) = c u (t) + d u 1 (t) u (t) Koefficienterna a, b, c, d är positiva. Termen a u 1 (t) representerar netto-födelse-dödstalet i en ensam kaninpopulation. Termen c u (t) är motsvarande för rävarna. Termen bu 1 (t) u (t) är antalet kaniner som blir uppätna per tidsenhet. Termen d u 1 (t) u (t) är antalet rävar per tidsenhet som överlever på grund av tillgång på föda. Observera teckenkombinationen i ekvationerna. Vad blir lösningen om populationerna är ensamma (b = d = )? Vi beskriver högerledet i differentialekvationen med en funktion function f=volterra(t,u) a=.5; b=.3; c=.; d=.1; f=[ a*u(1)-b*u(1)*u() -c*u()+d*u(1)*u()]; Vi löser sedan med funktionen ode45 och ritar upp enligt >> u=[.5;.3]; >> [t,u]=ode45(@volterra,[ 8],u); u a1. u am 5
>> plot(t,u(:,1),t,u(:,), r-- ) >> legend( Bytesdjur, Rovdjur ) >> xlabel( Tiden ), ylabel( Population ) >> title( Volterra-Lotka ) 1 Volterra Lotka Population 1 8 6 4 Bytesdjur Rovdjur 1 3 4 5 6 7 8 Tiden Uppgift 6. Lös Volterra-Lotka-ekvationerna med ode45. Ändra koefficienterna till a =.5, b =.3, c =., d =.5. Högre ordningens differentialekvationer Högre ordningens differentialekvationer kan skrivas om som system av första ordningen. Dessa system kan sedan lösas numeriskt. Som exempel tar vi åter igen den matematiska pendeln. En masspunkt med massan m hänger i en viktlös smal stav av längden l. Med beteckningarna i figuren och Newtons andra lag får vi rörelseekvationen ml θ(t) = mg sin(θ(t)) Vi vill bestämma lösningen för olika begynnelseutslag θ, dvs. θ() = θ, då vi släpper pendeln från vila, dvs. θ() =. θ l m mg Om vi låter ϕ = θ, dvs. inför vinkelhastigheten, kan ekvationen skrivas θ = ϕ, θ() = θ ϕ = g sin(θ), ϕ() = l 6
För att komma till standardform låter vi u 1 = θ och u = ϕ och får u 1 = u, u 1 () = θ u = g l sin(u 1), u () = Nu har vi standardformen [ u = f(t, u) u1, u = u() = u u ] [ u, f(t, u) = g sin(u l 1) ] [ θ, u = ] Vi beskriver differentialekvationen i Matlab med funktionen function f=pendel(t,u,g,l) f=[u() -g/l*sin(u(1))]; Följer lösningskurvorna med ode45 för några olika begynnelseutslag och ritar en bild som visar lösningarna t (t, θ(t)) och fasporträtten t (θ(t), θ(t)) för de olika begynnelseutslagen. g=9.81; l=.1; theta=[3::11]*pi/18; tspan=linspace(,1,); for k=1:length(theta) u=[theta(k);]; [t,u]=ode45(@(t,u)pendel(t,u,g,l),tspan,u); subplot(1,,1), plot(t,u(:,1)), hold on subplot(1,,), plot(u(:,1),u(:,)), hold on end subplot(1,,1), hold off xlabel( $t$, interpreter, latex, fontsize,1) ylabel( $\theta(t)$, interpreter, latex, fontsize,1), subplot(1,,), hold off xlabel( $\theta(t)$, interpreter, latex, fontsize,1) ylabel( $\dot\theta}(t)$, interpreter, latex, fontsize,1) 1 1 θ(t) θ(t) 1 1..4.6.8 1 t 1 1 θ(t) Från figuren ser vi att periodlängden ökar med ökande begynnelseutslag. 7
Uppgift 7. En dämpad matematisk pendel beskrivs av ml θ(t) = mg sin(θ(t)) cl θ(t), t θ() = θ, θ() = där c är dämpningskonstanten. Lös problemet för l =.1, m =.1 och c =. och några olika begynnelseutslagsvinklar. Använd ode45. När vi gjorde figuren ovan i Matlab skrev vi formlerna med s.k. L A TEX-kod. Så brukar matematiker skriva formler för att de skall bli snygga. Men vi får vi se det som överkurs. 8