odemaple.mws
Lineaaristen differentiaaliyhtälösysteemien luokittelua, myös epälineaarisia systeemejä numeerisesti ja graafisesti
Numsym, tammikuu 2004
Pohjana peruskurssi 3:n materiaalia.
Opimme myös Maple-tekniikkaa erityisesti numeeristen ratkaisujen kohdalla.
Linkki: L/odemaple.mws , myös L/odemaple.html (edellisestä "EXPORTattu")
Alustukset
> | with(LinearAlgebra):with(linalg): |
Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value
Warning, the protected names norm and trace have been redefined and unprotected
> | with(plots): with(DEtools): |
Warning, the name changecoords has been redefined
Warning, the name adjoint has been redefined
Seosprobleema (P3/K3)
> | restart: |
> | with(LinearAlgebra):with(linalg): |
Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value
Warning, the protected names norm and trace have been redefined and unprotected
> | A:=<<-1/10,1/10>|<3/40,-1/5>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | x:=[ov[1..-1,1],ov[1..-1,2]]; |
> | Yh:=C1*exp(lambda[1]*t)*x[1]+C2*exp(lambda[2]*t)*x[2]; |
HY-yrite: Yksinkertaisinta on yrittää vakiovektoria y=v;
> | yp:=<v1,v2>; |
> | b:=<3/2,3>; |
> | map(diff,yp,t)='A.yp'+b; |
> | Yp:=LinearSolve(A,-b); |
> |
> | Y:=Yh+Yp; |
> | diff(Y,t); |
> | A.Y+b; |
Tarkistaminen vektorimuodossa ei käykään helposti, Maplen tietorakenteet tekevät tenän.
No, jatketaan ja jätetään tarkistus loppuun.
> | AE:=subs(t=0,Y)=<25,15>;AE:=map(eval,%); |
> | evalm(lhs(AE)); |
> | Ceet:=LinearSolve(<<1,-2>|<3/2,1>>,<25-42,15-36>); |
> | Y:=subs(C1=Ceet[1],C2=Ceet[2],Y); |
> | y12:=evalm(Y); |
> | y1:=y12[1];y2:=y12[2]; |
> | plot([y1,y2],t=0..100); |
> | <diff(y1,t),diff(y2,t)>; |
> | A.<y1,y2>+b; |
Kävihän se tarkistus toki näin!
2x2-systeemejä, faasitasoja
Katsotaan ensin, mikä on "aikatason" ja faasitason suhde ja mikä on vastaava Maple-syntaksi.
Merkitään havainnollisuuden vuoksi faasitason pisteitä (x(t) , y(t)).
Olk. , .
> | x:=cos(t): y:=sin(t): |
> | plot([x,y],t=0..2*Pi,title="Aikakuva"); # Käyräparvi |
> | plot([x,y,t=0..2*Pi],title="Faasikuva"); # Parametrikäyrä tasossa |
> |
Esim. 1 (KRE s. 163)
> | restart: with(LinearAlgebra): with(linalg): with(plots): |
Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
> | A:=<<-3,1>|<1,-3>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | x1:=ov[1..-1,1]; x2:=ov[1..-1,2]; |
> | Y:=C1*exp(lambda[1]*t)*x1+C2*exp(lambda[2]*t)*x2; |
> | C1:=1: C2:=.5: plot([Y[1],Y[2]],t=0..2,title="Ratkaisufunktiot y1(t)ja y2(t) aikakuvassa",color=[red,blue]); |
Faasikuvan piirtämistä ajatellen kannattaa katsoa taas ominaisvektorikantaa, Sekä käsin, että Maplella on helpompaa, jos otetaan käyräparametriksi
> | s=exp(-2*t); |
> | C1:='C1': C2:='C2': |
> | Ys:=C1*s^2*x1+C2*s*x2; |
> | YY:=evalm(Ys); |
> | C1:=arvo1: C2:=arvo2: 'plot'([YY[1],YY[2],s=a..b]); # Huomaa param. piirron syntaksi! |
> | C1:=-2: C2:=1: plot([YY[1],YY[2],s=0..1]);kuva1:=%: |
> |
> | C1:=2: C2:=-1: kuva2:=plot([YY[1],YY[2],s=0..1]): |
> | display(kuva1,kuva2); |
> | C1:='C1': C2:='C2': |
> | parvi:=seq(seq([YY[1],YY[2],s=0..1],C2=-2..2),C1=-2..2); |
> | plot([parvi]); |
> | display(%,arrow([x1,x2])); |
> | kuva:=%: |
> | with(DEtools): |
Warning, the name adjoint has been redefined
> | DEplot([D(y1)(t)=-3*y1(t)+y2(t),D(y2)(t)=y1(t)-3*y2(t)], [y1(t),y2(t)],t=-5..2,y1=-4..4,y2=-4..4,color=grey); |
> | display(kuva,%,title="Trajektoreita ja suuntakenttä"); |
1. 2x2-faasitasotyypit
KRE:ssä on perusesimerkkejä ss. 164 - 168.
Käydään tässä EN:n sivujen mukaan ja käytetään EN-nimityksiä
[EN]: Eirola-Nevanlinna: Diff. yht. sys. L3-luentoja
1.1 Esim. 2.2 Lähde, ominaisarvot > 0
> | restart: with(LinearAlgebra): with(linalg): with(plots): |
Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
> | A:=<<1,0>|<1,2>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | v1:=ov[1..-1,1]; v2:=ov[1..-1,2]; |
> | C:='C1': C:='C2': |
> | y:=t->C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2; |
> | Y:=y(t); # Vektorilauseke. |
> | C1:=1: C2:=.5: plot([Y[1],Y[2]],t=0..2,title="Ratkaisufunktiot y1(t)ja y2(t) aikakuvassa",color=[red,blue]); |
> | C1:='C1': C2:='C2': |
> | Ys:=map(eval,subs(t=log(s),y(t))); |
> | YY:=evalm(Ys); |
> | parvi:=seq(seq([YY[1],YY[2],s=0..4],C2=-2..2),C1=-2..2): |
> | parvi: # Vaihda puolipiste, niin näet "parven". |
> | plot([parvi]); |
> | display(%,arrow([v1,v2]),view=[-5..5,-5..5]); |
> | kuva:=%: |
> | with(DEtools): |
Warning, the name adjoint has been redefined
> | DEplot([diff(y1(t),t)=y1(t)+y2(t),diff(y2(t),t)=2*y2(t)], [y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey); |
> | display(kuva,%,title="Lähde,lambda[1] > 0, lambda[2] > 0"); |
1.2 Esim. 2.3, Nielu, ominaisarvot < 0
Periaatteessa samanlainen kuin lähde edellä, mutta nyt ominaisarvot negatiiviset. Trajektirit virtaavat origoon.
> | A:=<<-2,-1>|<-1,-2>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | v1:=ov[1..-1,1]; v2:=ov[1..-1,2]; |
> | C1:='C1': C2:='C2': |
> | y:=t->C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2; |
> | subs(t=log(s),y(t)): Ys:=eval(%); # Siirrytään logaritmiseen parametriin. Tämä ei ole välttämätöntä, mutta helpottaa erit. käsin piirtoa, myös Maple-piirrossa skaala pysyy paremmin hanskassa. |
> | # 0 < s < 1, kun t > 0. |
Lasketaan koordinaattimuodossa:
> | YY:=evalm(Ys); |
> | parvi:=seq(seq([YY[1],YY[2],s=0..4],C2=-2..2),C1=-2..2): |
> | plot([parvi]); |
> | display(%,arrow([v1,v2]),view=[-5..5,-5..5]); |
> | kuva:=%: |
> | with(DEtools): |
> | display(kuva,DEplot([D(y1)(t)=-2*y1(t)-y2(t),D(y2)(t)=-y1(t)-2*y2(t)], [y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey),title="Nielu"); |
Nielu on vahvasti stabiili. Kaikki trajektorit lähestyvät O:a, kun t -> .
1.3 Esim 2.4 Satula, reaaliset, erimerkk.
> | A:=<<2,-4>|<-1,-1>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | v1:=ov[1..-1,1]; v2:=ov[1..-1,2]; |
> | C1:='C1': C2:='C2': |
> | Y:=C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2; |
> | subs(t=log(s),Y);Ys:=eval(%); |
> | # 0 < s < 1, kun t > 0 |
> | YY:=evalm(Ys); |
> | parvi:=seq(seq([YY[1],YY[2],s=0..4],C2=-2..2),C1=-2..2): |
> | plot([parvi]); |
> | display(%,arrow([v1,v2]),view=[-5..5,-5..5]); |
> | kuva:=%: |
> | with(DEtools): |
> | display(kuva,DEplot([D(y1)(t)=2*y1(t)-y2(t),D(y2)(t)=-4*y1(t)-y2(t)], [y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey),title="Satula"); |
Epästabiili. Osa trajektoreista --> , lähdettiinpä miten läheltä O:a tahansa (erit. posit. ominaisarvoa vastaavan
ominaisvektorin pisteistä).
1.4 Esim. 2.5, epästabiili fokus , kompleksiset, Re( ) > 0
> | A:=<<9,16>|<-8,-7>>; |
> | (lambda,ov):=Eigenvectors(A); |
> | v1:=ov[1..-1,1]; v2:=ov[1..-1,2]; |
> | C1:='C1': C2:='C2': |
> | Y:=C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2; |
> | alpha:=Re(lambda[1]); |
> | beta:=Im(lambda[1]); |
> | u:=map(Re,v1); v:=map(Im,v1); |
> | uv:=<u|v>; |
> | C:=<<cos(beta*t),-sin(beta*t)>|<sin(beta*t),cos(beta*t)>>; |
> | Y:=exp(alpha*t)*(uv.C.<C1,C2>); # Sulut laitettava näin, Maple ei täysin hallitse kertolaskujen liitännäisyyttä. |
> | YY:=evalm(Y); |
> |
> | parvi:=seq(seq([YY[1],YY[2],t=0..2],C2=-2..2),C1=-2..2): |
> | plot([parvi]); |
> | display(%,arrow([u,v]),view=[-5..5,-5..5]); |
> | kuva:=%: |
> | with(DEtools): |
> | display(kuva,DEplot([D(y1)(t)=9*y1(t)-8*y2(t),D(y2)(t)=16*y1(t)-7*y2(t)], [y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey),title="Epästabiili fokus"); |
1.5 Esim. 3.0 Degeneroitununut lähde (KRE s. 168)
> | A:=<<4,-1>|<1,2>>; |
> | Eigenvectors(A); |
> | expA:=t->exp(3*t)*<<1+t,-t>|<t,1-t>>; |
> | expA(t); |
> | exponential(A,t); # Tarkistus. |
> | Y:=exp(3*t)*((expA(t)/exp(3*t)).<C1,C2>); |
Jälleen piti temppuilla, koska kertolaskun liitännäisyys ei ole ihan hallinnassa.
> | YY:=evalm(Y); |
> |
> | parvi:=seq(seq([YY[1],YY[2],t=-2..2],C2=-2..2),C1=-2..2): |
> |
> | display(plot([parvi]),arrow(<-1,1>),view=[-5..5,-5..5],title="Degeneroitunut lähde"); |
EHY-esim, degeneroitunut
> | A:=<<1,-1>|<4,-3>>; |
> | g:=<t,1>; |
> | y:=<a*t+b,c*t+d>; |
> | dy:=map(diff,y,t); |
> | A.y+g; |
> |
> |
> |
> |
2. Diffyhtsys, analyyttisesti, numeerisesti, graafisesti, dsolve,dsolve(...,numeric), DEplot
Edellä käytimme piirtoon analyyttisiä ratkaisuja, jotka lineaariselle systeemille ovat saatavissa.
o dsolve osaa suoraan ratkaista analyyttisesti, tosin edellä tehty on varmasti opettavaisempaa.
> |
Warning, premature end of input
Maple-tekniikan suhteen analyyttisen ratkaisun alla oleva jatkokäsittely on opettavaista ja johdattelee vastaavaan numeeristen menetelmien kohdalla.
Trajektorien piirto voidaan suorittaa myös DEplot :lla, joka kuitenkin on varsin karkea väline. (Laskee kiinteällä askelpituudella.) Katsotaan sitäkin joka tapauksessa.
Yleisessä, epälineaarisessa tapauksessa käytetään numeerista ratkaisijaa laskemiseen. (Niin teemme aina Matlabissa.)
Määrittelemällä sopivasti apufunktioita, saamme homman oikein joustavaksi.
Nämä ideat ovat peräisin kirjasta [Coombes & al.]
2.1 Analyyttinen ratkaisu (dsolve)
Esimerkki:
> | restart: |
> | AAteht:={diff(x(t),t)=x(t)+2*y(t),diff(y(t),t)=-x(t),x(0)=a,y(0)=0}; |
> | aaratk:=dsolve(AAteht,{x(t),y(t)}); |
> | aaratkf:=unapply(subs(aaratk,[x(t),y(t),t=trange]),a,trange); |
> | aaratkf(2,a..b); |
> | plot(aaratkf(1,0..10)): |
> | seq(aaratkf(a,0..10),a=-1..1); |
> | plot([seq(aaratkf(a,-4..3),a=-4..4)]); |
Tehdään käyttäjälle vielä helpommaksi uudella kertakäyttöfunktiolla
> | faasi:=trange->plot([seq(aaratkf(a,trange),a=-4..4)]); |
> | faasi(-4..3);faasi(-10..1); |
Vaihdetaan parametriväliä, lisätään samalla funktioon mahdollisuus antaa plot-optioita.
> | faasi:=(trange,opt1,opt2)->plot([seq(aaratkf(a,trange),a=-20..20)],opt1,opt2); |
> | faasi(-10..10,view=[-10..10,-10..10],numpoints=200); |
Error, `..` unexpected
2.2. Numeerinen ratkaisu (dsolve(..,numeric))
s. 170-..
Teknisesti asia voitaisiin ajatella hoidettavaksi aivan samoin kuin yllä, lisäämällä dsolve-komentoon valitsin " numeric ".
Tämä ei kuitenkaan toimi yllä olevalla tavalla tehtynä, koska dsolve(...,numeric) tarvitsee numeeriset alkuarvot, ennenkuin se voi laskea mitään. Nyt täytyy olla senverran ovela, että estetään Maple evaluoimasta mitään ennen numeeristen alkuarvojen antamista.
Nämä ovat hiukan sofistikoituneita symbolilaskenta-asioita. Jos haluat pitäytyä vain ylimalkaisessa evalointiärjestysasioiden ymmärryksessä, voit toki ottaa tämän työarkin kaikelle tämänsuunaiselle toiminnalle pohjaksi.
> | restart: with(plots): |
Warning, the name changecoords has been redefined
> | dys:=diff(x(t),t)=x(t)+2*y(t),diff(y(t),t)=-x(t); |
> | numratk:=(a,b)->dsolve({dys,x(0)=a,y(0)=b},{x(t),y(t)},numeric,maxfun=1000); |
> | numratk(0,1); |
> | numratk(0,1)(1); # Numeerisen ratkaisun arvo annetussa pisteessä. |
> |
Nyt käytetään -> määrittelyä, jolloin evaluointi tapahtuu vasta suoritusaikana. Voit kokeilla, mitä tapahtuu unapply -tyylillä, jos haluat nähdä, mikä on virheilmoitus.
Error, `->` unexpected
> | kayra:=(a,b,trange)->odeplot(numratk(a,b),[x(t),y(t)],trange); |
Tämä on yhtä looginen kuin odeplot:n syntaksi. Siinä noudatetaan funktioplot:n syntaksia (x(t) ja y(t) nyt eivät ihan näytä funktioilta, mutta tämän lähemmäksi rautaista logiikkaa ei näköjään odeplot: ssa ole päästy.)
Error, missing operator or `;`
> | kayra(1,0,-3..3); |
> | numfaasi:=trange->display([seq(seq(kayra(a,b,trange),a=-2..2),b=-2..2)],view=[-20..20,-15..15]); |
> | numfaasi(-3..3); |
Hienosti nämä toimivat, kun ne näin rakennetaan!
Tästä on sopivaa jatkaa aluksi vaikka muodostamalla lineaaristen faasitasot.
Nyt voi kuvaan lisätä trajektoreita yksi kerrallaan paljon tarkemmin kuin DEplot:lla, jolla kannattaa tehdä vain suuntakenttä. (Alla on esitetty kätevä tapa DEplot-käyttöön, mutta kuvat eivät ole kauniita paksuine viivoineen.
Alla on esietty konkreettisesti, miten homma käy.
Tietysti kannattaa verrata Matlab -tyyliin. Se voidaan rakentaa eri tavalla vuorovaikutteiseksi.
2.3 Graafinen, DEplot ja dsolve(..,numeric) yhdessä
> | restart: |
> | with(DEtools):with(plots): |
Warning, the name changecoords has been redefined
> | dys:=diff(x(t),t)=x(t)+2*y(t),diff(y(t),t)=-x(t); |
> | AA:=[seq(seq([0,a,b],a=-2..2),b=-2..2)]; |
> | faasitaso:=trange->DEplot([dys],[x(t),y(t)],t=trange,AA,stepsize=0.1); |
> | faasitaso(-3..3); |
> | ?DEplot |
> |
> | DEplot([dys],[x(t),y(t)],t=-3..3,x=-3..3,y=-3..3,stepsize=0.1); |
> | proc (trange) options operator, arrow; DEplot(dys,[x(t), y(t)],t = trange,AA,stepsize = .1) end proc |
> |
> |
Warning, premature end of input
> | DEplot([diff(y1(t),t)=y1(t)+y2(t),diff(y2(t),t)=2*y2(t)], [y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey); |
> |
> | numratk:=(a,b)->dsolve({dys,x(0)=a,y(0)=b},{x(t),y(t)},numeric,maxfun=1000); |
> | kayra:=(a,b,trange)->odeplot(numratk(a,b),[x(t),y(t)],trange); |
> | numfaasi:=trange->display([seq(seq(kayra(a,b,trange),a=-2..2),b=-2..2)]); |
> | suuntak:=DEplot([dys],[x(t),y(t)],t=-3..3,x=-3..3,y=-3..3,stepsize=0.1,color=grey): |
> | display([numfaasi(-3..3),suuntak]); |
> | kuva:=%: |
> | display(suuntak,kayra(0,1.8,-3..3)); |
Tällä tavalla on aika kätevää rakentaa faasikuvaa:
- Klikkaa hiirellä kuvaan ja lue koordinaatit vasemmasta ylänurkasta.
- Jatka kuvan rakentelua yllä olevalla display -tyylillä.
> |
Warning, premature end of input
> | display(%,kayra(-0.7,1.1,-3..3)); |
> |
> | kay:=numfaasi(-3..3): |
> | kay; |
> |
> | aasi:=(trange,opt1,opt2)->plot([seq(aaratkf(a,trange),a=-20..20)],opt1,opt2); |
> | print(aasi); |
> | proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc; |
> |
> |