L\303\270sning af DifferentialligningerPreben Alsholm, 10/3 2006Maple kan l\303\270se ordin\303\246re differentialligninger, s\303\245vel som systemer af differentialligninger, symbolsk eller numerisk. I en differentialligning, hvor den ubekendte funktion hedder x og den uafh\303\246ngige variable hedder t, er der tradition for at udelade t'et i x(t) og kun skrive x, som i f\303\270lgende eksempel: LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2I1EhRictRiM2J0YrLUYjNiUtSSZtZnJhY0dGJDYoLUYjNiMtRiw2JVEjZHhGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictRiM2Iy1GLDYlUSNkdEYnRjtGPi8lLmxpbmV0aGlja25lc3NHUSIxRicvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGSy8lKWJldmVsbGVkR1EmZmFsc2VGJy1JI21vR0YkNi1RIitGJy9GP1Enbm9ybWFsRicvJSZmZW5jZUdGUC8lKnNlcGFyYXRvckdGUC8lKXN0cmV0Y2h5R0ZQLyUqc3ltbWV0cmljR0ZQLyUobGFyZ2VvcEdGUC8lLm1vdmFibGVsaW1pdHNHRlAvJSdhY2NlbnRHRlAvJSdsc3BhY2VHUSwwLjIyMjIyMjJlbUYnLyUncnNwYWNlR0Zhby1GNDYoLUYjNiUtSSNtbkdGJDYkUSIyRidGVS1GUjYtUTEmSW52aXNpYmxlVGltZXM7RidGVUZXRllGZW5GZ25GaW5GW29GXW8vRmBvUSYwLjBlbUYnL0Zjb0ZgcC1GLDYlUSJ4RidGO0Y+LUYjNiVGKy1GIzYlLUZpbzYkUSIxRidGVUZRLUYsNiVRInRGJ0Y7Rj5GK0ZGRklGTEZOLUZSNi1RIj1GJ0ZVRldGWUZlbkZnbkZpbkZbb0Zdby9GYG9RLDAuMjc3Nzc3OGVtRicvRmNvRmNxLUYjNiUtRiw2JVEkc2luRicvRjxGUEZVLUZSNi1RMCZBcHBseUZ1bmN0aW9uO0YnRlVGV0ZZRmVuRmduRmluRltvRl1vRl9wRmFwLUkobWZlbmNlZEdGJDYkLUYjNiNGXHFGVUYrRis=I Maple skal altid skrives x(t). Ovenst\303\245ende differentialligning skrives derfor s\303\245ledes i Maplediff( x(t), t) +2*x(t)/(1+t) = sin(t)Eksakt l\303\270sning af differentialligningDifferentialligningsl\303\270seren hedder dsolve. Vi giver tre eksempler:Eksempel 1Vi betragter en line\303\246r differentialligning af f\303\270rste orden, som vi selv kan l\303\270se vha. Panserformlen. Men her bruger vi Maple:ligning1:=diff( x(t),t) +2*x(t)/(1+t)=sin(t);Den fuldst\303\246ndige l\303\270sning findes s\303\245ledes:dsolve(ligning1); Ved tilf\303\270jelsen useInt bruges inaktiv integration (alts\303\245 Int). Derved f\303\245s et mellemresultat:dsolve(ligning1,useInt); Man ser Panserformlen i brug. Udregningen af integralerne sker ved value:value(%);Er der foruden differentialligningen ogs\303\245 givet en begyndelsesbetingelse, eksempelvis LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2I1EhRictRiM2JkYrLUYjNiUtRiw2JVEieEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RMCZBcHBseUZ1bmN0aW9uO0YnL0Y6USdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGRC8lKXN0cmV0Y2h5R0ZELyUqc3ltbWV0cmljR0ZELyUobGFyZ2VvcEdGRC8lLm1vdmFibGVsaW1pdHNHRkQvJSdhY2NlbnRHRkQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZTLUkobWZlbmNlZEdGJDYkLUYjNiMtSSZtZnJhY0dGJDYoLUYjNiMtRiw2JVElJnBpO0YnL0Y3RkRGQC1GIzYjLUkjbW5HRiQ2JFEiMkYnRkAvJS5saW5ldGhpY2tuZXNzR1EiMUYnLyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRmlvLyUpYmV2ZWxsZWRHRkRGQC1GPTYtUSI9RidGQEZCRkVGR0ZJRktGTUZPL0ZSUSwwLjI3Nzc3NzhlbUYnL0ZVRmJwRmBvRis=, s\303\245 g\303\270res som f\303\270lger:L:=dsolve( {ligning1, x(Pi/2)=2 }); Ogs\303\245 her kan man bruge useInt: dsolve( {ligning1, x(Pi/2)=2},useInt); L\303\270sningen kan (og b\303\270r!) kontrolleres ved inds\303\246ttelse i ligningen:subs( L, ligning1);simplify(%);Kontrol kan ogs\303\245 ske vha. proceduren odetest. Kommer der et nul som output, er l\303\270sningen korrekt (if\303\270lge Maple):odetest(L,ligning1); \303\230nskes l\303\270sningen defineret som en funktion kaldet f, kan man g\303\270re \303\251t af to: (1) Lave h\303\270jresiden af L til en funktion af t:f:=unapply( rhs(L), t); Lad os afpr\303\270ve funktionen:f(Pi/2);simplify(%);(2) Den anden metode til definition af f ser lidt mere uigennemskuelig ud, men id\303\251en er god at bide m\303\246rke i:f:=unapply( subs(L,x(t)), t);Vi skal senere se, at en lignende syntaks er nyttig ved numerisk l\303\270sning af differentialligninger.Eksempel 2Det f\303\270rste eksempel var en line\303\246r differentialligning. Vi tager nu en simpel uline\303\246r differentialligning. Betragt for t > 0 f\303\270lgende differentialligning:ligning2:=diff(x(t),t)=3/2/t*(x(t)-x(t)^(1/3));imp:=dsolve(ligning2);odetest(imp,ligning2);Vi ser, at den fuldst\303\246ndige l\303\270sning til denne separable differentialligning blev givet p\303\245 implicit form, og at odetest kan kontrollere implicit givne l\303\270sninger. Bem\303\246rk i\303\270vrigt, at l\303\270sningen x(t) = 0 (for alle t) ikke blev fundet. Ved tilf\303\270jelsen explicit f\303\245s l\303\270sningerne p\303\245 eksplicit form:eksp:=dsolve(ligning2, explicit);I dette tilf\303\246lde er det dog s\303\245 som s\303\245 med det eksplicitte.L\303\270ses et begyndelsesv\303\246rdiproblem kommer l\303\270sningen altid p\303\245 eksplicit form - men evt. ved brug af RootOf-notationen:dsolve({ligning2, x(1)=8});Eksempel 3Som vores n\303\246ste eksempel tager vi en line\303\246r andenordens differentialligning.ligning3:=t*diff(x(t),t,t) - (2*t+1)*diff(x(t),t) + (t+1)*x(t) = 2*t^2*exp(t);Den fuldst\303\246ndige l\303\270sning f\303\245s ved dsolve som ovenfor:dsolve(ligning3);hvor _C1 og _C2 er arbitr\303\246re konstanter. \303\230nsker vi den partikul\303\246re l\303\270sning, der opfylder begyndelsesbetingelserne x(1) = e og x'(1) = e skriver vi: q:=dsolve({ligning3, x(1) = exp(1) , D(x)(1) = exp(1)});idet vi erindrer, at exp(1) skal bruges for e. L\303\270sningen som funktion f\303\245s som i f\303\270rste eksempel ovenfor enten ved:f:= unapply( rhs(q), t); eller vedf:=unapply( subs(q,x(t)), t);L\303\270sning af randv\303\246rdiproblemer lader sig ogs\303\245 g\303\270re:dsolve({ligning3, x(1) = exp(1) , x(3) = 0});Numerisk l\303\270sning af differentialligningMaple kan l\303\270se b\303\245de begyndelsesv\303\246rdiproblemer og randv\303\246rdiproblemer numerisk.Hvis vi \303\270nsker en numerisk beregning af l\303\270sningen, tilf\303\270jer vi type= numeric (eller blot numeric) som et ekstra argument i dsolve-kommandoen. Vi tager som f\303\270rste eksempel begyndelsesv\303\246rdiproblemet best\303\245ende af differentialligningenligning4:=diff(x(t),t)=sqrt(1+x(t)^3)*sin(t);med LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2I1EhRictRiM2JkYrLUYjNiUtRiw2JVEieEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RMCZBcHBseUZ1bmN0aW9uO0YnL0Y6USdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGRC8lKXN0cmV0Y2h5R0ZELyUqc3ltbWV0cmljR0ZELyUobGFyZ2VvcEdGRC8lLm1vdmFibGVsaW1pdHNHRkQvJSdhY2NlbnRHRkQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZTLUkobWZlbmNlZEdGJDYkLUYjNiMtSSZtZnJhY0dGJDYoLUYjNiMtRiw2JVElJnBpO0YnL0Y3RkRGQC1GIzYjLUkjbW5HRiQ2JFEiMkYnRkAvJS5saW5ldGhpY2tuZXNzR1EiMUYnLyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRmlvLyUpYmV2ZWxsZWRHRkRGQC1GPTYtUSI9RidGQEZCRkVGR0ZJRktGTUZPL0ZSUSwwLjI3Nzc3NzhlbUYnL0ZVRmJwLUZhbzYkUSIwRidGQEYr.Maple's svar kan f\303\245s p\303\245 to former, enten som en listprocedure eller som en procedurelist. Vi anbefaler listprocedure, s\303\245 kun den metode omtales nedenfor.Lp:=dsolve({ligning4, x(Pi/2) =0} , type=numeric, output=listprocedure);Lp er hermed en liste best\303\245ende af procedurer (h\303\251r 2). Det er den sidste af disse, der er vores numeriske l\303\270sning. Den f\303\245s meget elegant som en funktion (en procedure) som f\303\270lger:f:=subs(Lp, x(t)); f(2);Procedurerne i output-listen fra dsolve/numeric/listprocedure returnerer uevalueret, hvis input ikke er et tal. Det g\303\270r, at vores procedure f returnerer uevalueret i f\303\270lgende to tilf\303\246lde:f(h),f(t);Det er en afgjort fordel ved plotning, idet vi da er fri til at benytte b\303\245de syntaksen plot( f(t), t=a..b); og den variabelfri: plot( f, a..b);plot(f(t),t=0..3*Pi);Der findes i plots-pakken en s\303\246rlig procedure indrettet specielt p\303\245 plotning af resultatet af dsolve, numeric. Den kaldes odeplot. Den foruds\303\246tter ikke, at man f\303\270rst har defineret l\303\270sningen som en funktion:with(plots): odeplot(Lp,[t,x(t)],t=0..3*Pi); odeplot kan ogs\303\245 plotte funktioner af l\303\270sningen. Her plotter vi den numeriske v\303\246rdi af x(t) som funktion af t:odeplot(Lp,[t,abs(x(t))],t=0..3*Pi,numpoints=100);Tilf\303\270jes et valgfrit argument af formen frames=positivt helt tal f\303\245s en animation (en tegnefilm) som i f\303\270lgende eksempel:odeplot(Lp,[t,x(t)],t=0..5*Pi,frames=50);DEtools-pakkenPakken DEtools indeholder forskelligt af interesse. Vi tager ligning4 som eksempel:with(DEtools):Vi minder om systemet:ligning4;DEplot tegner l\303\270sninger, n\303\245r den f\303\245r differentialligningen og begyndelsesbetingelserne. Begyndelsesbetingelserne gives i en liste (eller m\303\246ngde) af lister p\303\245 formen [ [x(t0) = x0], [x(t1) = y1], ....]. I eksemplet nedenfor tegnes den tidligere sete l\303\270sning plus \303\251n mere. Desuden tegnes h\303\246ldningsfeltet med mindre man tilf\303\270jer arrows=none:DEplot( ligning4, x, t=0..3*Pi, [ [x(Pi/2)=0], [x(Pi/2)=1] ],linecolor=[blue,maroon], stepsize=0.1);Vil man kun have h\303\246ldningsfeltet, kan man fjerne begyndelsesv\303\246rdilisten, men m\303\245 s\303\245 tilf\303\270je et x-interval:DEplot( ligning4, x, t=0..3*Pi,x=-1..5, color=grey, arrows=large);pile:=%:En animation af banekurverne kan laves p\303\245 f\303\270lgende m\303\245de, hvor vi bruger pilebilledet som fast baggrund:animate(DEplot,[ligning4, x, t=0..T, [ [x(Pi/2)=0], [x(Pi/2)=1] ],linecolor=[blue,maroon], stepsize=0.1,arrows=none], T=1..3*Pi,background=pile);