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>>;

A := Matrix(%id = 2831376)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 3181388), Matrix(%id = 3182672)

>    x:=[ov[1..-1,1],ov[1..-1,2]];

x := [Vector(%id = 16314156), Vector(%id = 16270020)]

>    Yh:=C1*exp(lambda[1]*t)*x[1]+C2*exp(lambda[2]*t)*x[2];

Yh := C1*exp(-1/4*t)*Vector(%id = 16314156)+C2*exp(-1/20*t)*Vector(%id = 16270020)

HY-yrite: Yksinkertaisinta on yrittää vakiovektoria y=v;

>    yp:=<v1,v2>;

yp := Vector(%id = 3118776)

>    b:=<3/2,3>;

b := Vector(%id = 16334088)

>    map(diff,yp,t)='A.yp'+b;

Vector(%id = 16352156) = A.yp+Vector(%id = 16334088)

>    Yp:=LinearSolve(A,-b);

Yp := Vector(%id = 3119176)

>   

>    Y:=Yh+Yp;

Y := C1*exp(-1/4*t)*Vector(%id = 16314156)+C2*exp(-1/20*t)*Vector(%id = 16270020)+Vector(%id = 3119176)

>    diff(Y,t);

-1/4*C1*exp(-1/4*t)*Vector(%id = 16314156)-1/20*C2*exp(-1/20*t)*Vector(%id = 16270020)

>    A.Y+b;

Matrix(%id = 2831376).(C1*exp(-1/4*t)*Vector(%id = 16314156)+C2*exp(-1/20*t)*Vector(%id = 16270020)+Vector(%id = 3119176))+Vector(%id = 16334088)

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,%);

AE := C1*exp(0)*Vector(%id = 16314156)+C2*exp(0)*Vector(%id = 16270020)+Vector(%id = 3119176) = Vector(%id = 16541112)

AE := C1*Vector(%id = 16314156)+C2*Vector(%id = 16270020)+Vector(%id = 3119176) = Vector(%id = 16541112)

>    evalm(lhs(AE));

vector([C1+3/2*C2+42, -2*C1+C2+36])

>    Ceet:=LinearSolve(<<1,-2>|<3/2,1>>,<25-42,15-36>);

Ceet := Vector(%id = 16730740)

>    Y:=subs(C1=Ceet[1],C2=Ceet[2],Y);

Y := 29/8*exp(-1/4*t)*Vector(%id = 16314156)-55/4*exp(-1/20*t)*Vector(%id = 16270020)+Vector(%id = 3119176)

>    y12:=evalm(Y);

y12 := vector([29/8*exp(-1/4*t)-165/8*exp(-1/20*t)+42, -29/4*exp(-1/4*t)-55/4*exp(-1/20*t)+36])

>    y1:=y12[1];y2:=y12[2];

y1 := 29/8*exp(-1/4*t)-165/8*exp(-1/20*t)+42

y2 := -29/4*exp(-1/4*t)-55/4*exp(-1/20*t)+36

>    plot([y1,y2],t=0..100);

[Maple Plot]

>    <diff(y1,t),diff(y2,t)>;

Vector(%id = 16933644)

>    A.<y1,y2>+b;

Vector(%id = 21245364)

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(t) = cos(t)  , y(t) = sin(t)  .

>    x:=cos(t): y:=sin(t):

>    plot([x,y],t=0..2*Pi,title="Aikakuva"); # Käyräparvi

[Maple Plot]

>    plot([x,y,t=0..2*Pi],title="Faasikuva"); # Parametrikäyrä tasossa

[Maple Plot]

>   

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>>;

A := Matrix(%id = 3223452)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 2757196), Matrix(%id = 2677488)

>    x1:=ov[1..-1,1]; x2:=ov[1..-1,2];

x1 := Vector(%id = 18342900)

x2 := Vector(%id = 16652740)

>    Y:=C1*exp(lambda[1]*t)*x1+C2*exp(lambda[2]*t)*x2;

Y := C1*exp(-4*t)*Vector(%id = 18342900)+C2*exp(-2*t)*Vector(%id = 16652740)

>    C1:=1: C2:=.5: plot([Y[1],Y[2]],t=0..2,title="Ratkaisufunktiot y1(t)ja y2(t) aikakuvassa",color=[red,blue]);

[Maple Plot]

Faasikuvan piirtämistä ajatellen kannattaa katsoa taas ominaisvektorikantaa, Sekä käsin, että Maplella on helpompaa, jos otetaan käyräparametriksi

>    s=exp(-2*t);

s = exp(-2*t)

>    C1:='C1': C2:='C2':

>    Ys:=C1*s^2*x1+C2*s*x2;

Ys := C1*s^2*Vector(%id = 18342900)+C2*s*Vector(%id = 16652740)

>    YY:=evalm(Ys);

YY := vector([-C1*s^2+C2*s, C1*s^2+C2*s])

>    C1:=arvo1: C2:=arvo2: 'plot'([YY[1],YY[2],s=a..b]); # Huomaa param. piirron syntaksi!

plot([-arvo1*s^2+arvo2*s, arvo1*s^2+arvo2*s, s = a .. b])

>    C1:=-2: C2:=1: plot([YY[1],YY[2],s=0..1]);kuva1:=%:

[Maple Plot]

>   

>    C1:=2: C2:=-1: kuva2:=plot([YY[1],YY[2],s=0..1]):

>    display(kuva1,kuva2);

[Maple Plot]

>    C1:='C1': C2:='C2':

>    parvi:=seq(seq([YY[1],YY[2],s=0..1],C2=-2..2),C1=-2..2);

parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...
parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...
parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...
parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...
parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...
parvi := [2*s^2-2*s, -2*s^2-2*s, s = 0 .. 1], [2*s^2-s, -2*s^2-s, s = 0 .. 1], [2*s^2, -2*s^2, s = 0 .. 1], [2*s^2+s, -2*s^2+s, s = 0 .. 1], [2*s^2+2*s, -2*s^2+2*s, s = 0 .. 1], [s^2-2*s, -s^2-2*s, s =...

>    plot([parvi]);

[Maple Plot]

>    display(%,arrow([x1,x2]));

[Maple Plot]

>    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);

[Maple Plot]

>    display(kuva,%,title="Trajektoreita ja suuntakenttä");

[Maple Plot]

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>>;

A := Matrix(%id = 18512868)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 20470036), Matrix(%id = 20515196)

>    v1:=ov[1..-1,1]; v2:=ov[1..-1,2];

v1 := Vector(%id = 20470196)

v2 := Vector(%id = 20670028)

>    C:='C1': C:='C2':

>    y:=t->C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2;

y := proc (t) options operator, arrow; C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2 end proc

>    Y:=y(t); # Vektorilauseke.

Y := C1*exp(2*t)*Vector(%id = 20470196)+C2*exp(t)*Vector(%id = 20670028)

>    C1:=1: C2:=.5: plot([Y[1],Y[2]],t=0..2,title="Ratkaisufunktiot y1(t)ja y2(t) aikakuvassa",color=[red,blue]);

[Maple Plot]

>    C1:='C1': C2:='C2':

>    Ys:=map(eval,subs(t=log(s),y(t)));

Ys := C1*s^2*Vector(%id = 20470196)+C2*s*Vector(%id = 20670028)

>    YY:=evalm(Ys);

YY := vector([C1*s^2+C2*s, C1*s^2])

>    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]);

[Maple Plot]

>    display(%,arrow([v1,v2]),view=[-5..5,-5..5]);

[Maple Plot]

>    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);

[Maple Plot]

>    display(kuva,%,title="Lähde,lambda[1] > 0, lambda[2] > 0");

[Maple Plot]

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>>;

A := Matrix(%id = 19261884)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 17357248), Matrix(%id = 17528028)

>    v1:=ov[1..-1,1]; v2:=ov[1..-1,2];

v1 := Vector(%id = 18055248)

v2 := Vector(%id = 17499964)

>    C1:='C1': C2:='C2':

>    y:=t->C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2;

y := proc (t) options operator, arrow; C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2 end proc

>    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.

Ys := C1/s*Vector(%id = 18055248)+C2/s^3*Vector(%id = 17499964)

>     # 0 < s < 1, kun t > 0.

Lasketaan koordinaattimuodossa:

>    YY:=evalm(Ys);

YY := vector([-C1/s+C2/s^3, C1/s+C2/s^3])

>    parvi:=seq(seq([YY[1],YY[2],s=0..4],C2=-2..2),C1=-2..2):

>    plot([parvi]);

[Maple Plot]

>    display(%,arrow([v1,v2]),view=[-5..5,-5..5]);

[Maple Plot]

>    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");

[Maple Plot]

Nielu on vahvasti stabiili. Kaikki trajektorit lähestyvät O:a, kun t -> infinity  .

1.3 Esim 2.4 Satula, reaaliset, erimerkk.

>    A:=<<2,-4>|<-1,-1>>;

A := Matrix(%id = 18687800)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 2453752), Matrix(%id = 2390372)

>    v1:=ov[1..-1,1]; v2:=ov[1..-1,2];

v1 := Vector(%id = 2880916)

v2 := Vector(%id = 2879172)

>    C1:='C1': C2:='C2':

>    Y:=C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2;

Y := C1*exp(3*t)*Vector(%id = 2880916)+C2*exp(-2*t)*Vector(%id = 2879172)

>    subs(t=log(s),Y);Ys:=eval(%);

C1*exp(3*ln(s))*Vector(%id = 2880916)+C2*exp(-2*ln(s))*Vector(%id = 2879172)

Ys := C1*s^3*Vector(%id = 2880916)+C2/s^2*Vector(%id = 2879172)

>     # 0 < s < 1, kun t > 0

>    YY:=evalm(Ys);

YY := vector([-C1*s^3+C2/s^2, C1*s^3+4*C2/s^2])

>    parvi:=seq(seq([YY[1],YY[2],s=0..4],C2=-2..2),C1=-2..2):

>    plot([parvi]);

[Maple Plot]

>    display(%,arrow([v1,v2]),view=[-5..5,-5..5]);

[Maple Plot]

>    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");

[Maple Plot]

Epästabiili.  Osa trajektoreista --> infinity , lähdettiinpä miten läheltä O:a tahansa (erit. posit. ominaisarvoa vastaavan

ominaisvektorin pisteistä).

1.4 Esim. 2.5, epästabiili fokus , kompleksiset, Re( lambda ) > 0

>    A:=<<9,16>|<-8,-7>>;

A := Matrix(%id = 18044028)

>    (lambda,ov):=Eigenvectors(A);

lambda, ov := Vector(%id = 17052636), Matrix(%id = 18043340)

>    v1:=ov[1..-1,1]; v2:=ov[1..-1,2];

v1 := Vector(%id = 17144596)

v2 := Vector(%id = 17141696)

>    C1:='C1': C2:='C2':

>    Y:=C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2;

Y := C1*exp((1+8*I)*t)*Vector(%id = 17144596)+C2*exp((1-8*I)*t)*Vector(%id = 17141696)

>    alpha:=Re(lambda[1]);

alpha := 1

>    beta:=Im(lambda[1]);

beta := 8

>    u:=map(Re,v1); v:=map(Im,v1);

u := Vector(%id = 17119768)

v := Vector(%id = 17119488)

>    uv:=<u|v>;

uv := Matrix(%id = 3135972)

>    C:=<<cos(beta*t),-sin(beta*t)>|<sin(beta*t),cos(beta*t)>>;

C := Matrix(%id = 16562076)

>    Y:=exp(alpha*t)*(uv.C.<C1,C2>); # Sulut laitettava näin, Maple ei täysin hallitse kertolaskujen liitännäisyyttä.

Y := exp(t)*Vector(%id = 16914696)

>    YY:=evalm(Y);

YY := vector([exp(t)*(cos(8*t)*C1+sin(8*t)*C2), exp(t)*((cos(8*t)+sin(8*t))*C1+(sin(8*t)-cos(8*t))*C2)])

>   

>    parvi:=seq(seq([YY[1],YY[2],t=0..2],C2=-2..2),C1=-2..2):

>    plot([parvi]);

[Maple Plot]

>    display(%,arrow([u,v]),view=[-5..5,-5..5]);

[Maple Plot]

>    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");

[Maple Plot]

1.5 Esim. 3.0 Degeneroitununut lähde (KRE s. 168)

>    A:=<<4,-1>|<1,2>>;

A := Matrix(%id = 16287788)

>    Eigenvectors(A);

Vector(%id = 16450084), Matrix(%id = 18148612)

>    expA:=t->exp(3*t)*<<1+t,-t>|<t,1-t>>;

expA := proc (t) options operator, arrow; exp(3*t)*`<|>`(`<,>`(1+t,-t),`<,>`(t,1-t)) end proc

>    expA(t);

exp(3*t)*Matrix(%id = 18854984)

>    exponential(A,t); # Tarkistus.

matrix([[exp(3*t)+t*exp(3*t), t*exp(3*t)], [-t*exp(3*t), exp(3*t)-t*exp(3*t)]])

>    Y:=exp(3*t)*((expA(t)/exp(3*t)).<C1,C2>);

Y := exp(3*t)*Vector(%id = 22847460)

Jälleen piti temppuilla, koska kertolaskun liitännäisyys ei ole ihan hallinnassa.

>    YY:=evalm(Y);

YY := vector([exp(3*t)*((1+t)*C1+t*C2), exp(3*t)*(-t*C1+(1-t)*C2)])

>   

>    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");

[Maple Plot]

EHY-esim, degeneroitunut

>    A:=<<1,-1>|<4,-3>>;

A := Matrix(%id = 17864144)

>    g:=<t,1>;

g := Vector(%id = 17838260)

>    y:=<a*t+b,c*t+d>;

y := Vector(%id = 17766620)

>    dy:=map(diff,y,t);

dy := Vector(%id = 18016552)

>    A.y+g;

Vector(%id = 17864200)

>   

>   

>   

>   

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};

AAteht := {diff(y(t),t) = -x(t), x(0) = a, y(0) = 0, diff(x(t),t) = x(t)+2*y(t)}

>    aaratk:=dsolve(AAteht,{x(t),y(t)});

aaratk := {y(t) = -2/7*exp(1/2*t)*a*7^(1/2)*sin(1/2*7^(1/2)*t), x(t) = -1/2*exp(1/2*t)*(-2/7*a*7^(1/2)*sin(1/2*7^(1/2)*t)-2*a*cos(1/2*7^(1/2)*t))}

>    aaratkf:=unapply(subs(aaratk,[x(t),y(t),t=trange]),a,trange);

aaratkf := proc (a, trange) options operator, arrow; [-1/2*exp(1/2*t)*(-2/7*a*7^(1/2)*sin(1/2*7^(1/2)*t)-2*a*cos(1/2*7^(1/2)*t)), -2/7*exp(1/2*t)*a*7^(1/2)*sin(1/2*7^(1/2)*t), t = trange] end proc

>    aaratkf(2,a..b);

[-1/2*exp(1/2*t)*(-4/7*sin(1/2*7^(1/2)*t)*7^(1/2)-4*cos(1/2*7^(1/2)*t)), -4/7*exp(1/2*t)*7^(1/2)*sin(1/2*7^(1/2)*t), t = a .. b]

>    plot(aaratkf(1,0..10)):

>    seq(aaratkf(a,0..10),a=-1..1);

[-1/2*exp(1/2*t)*(2/7*sin(1/2*7^(1/2)*t)*7^(1/2)+2*cos(1/2*7^(1/2)*t)), 2/7*exp(1/2*t)*7^(1/2)*sin(1/2*7^(1/2)*t), t = 0 .. 10], [0, 0, t = 0 .. 10], [-1/2*exp(1/2*t)*(-2/7*sin(1/2*7^(1/2)*t)*7^(1/2)-2...
[-1/2*exp(1/2*t)*(2/7*sin(1/2*7^(1/2)*t)*7^(1/2)+2*cos(1/2*7^(1/2)*t)), 2/7*exp(1/2*t)*7^(1/2)*sin(1/2*7^(1/2)*t), t = 0 .. 10], [0, 0, t = 0 .. 10], [-1/2*exp(1/2*t)*(-2/7*sin(1/2*7^(1/2)*t)*7^(1/2)-2...

>    plot([seq(aaratkf(a,-4..3),a=-4..4)]);

[Maple Plot]

Tehdään käyttäjälle vielä helpommaksi uudella kertakäyttöfunktiolla

>    faasi:=trange->plot([seq(aaratkf(a,trange),a=-4..4)]);

faasi := proc (trange) options operator, arrow; plot([seq(aaratkf(a,trange),a = -4 .. 4)]) end proc

>    faasi(-4..3);faasi(-10..1);

[Maple Plot]

[Maple Plot]

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 := proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc

>    faasi(-10..10,view=[-10..10,-10..10],numpoints=200);

[Maple Plot]

  • Käyttöohje:
  •    Aina, kun haluat vaihtaa parametriväliä, suorita määrittelyrivi faasi:=(..)->.. uudestaan.
  •    Kun piirrät eri t: n arvoilla, suorita komento faasi(..) ;
  •    Kun vaihdat diffyhtsysteemiä, suorita ensin rivit: AAteht:=..  ja aaratk:= ..  .

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);

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 := proc (a, b) options operator, arrow; dsolve({dys, x(0) = a, y(0) = b},{x(t), y(t)},numeric,maxfun = 1000) end proc

>    numratk(0,1);

proc (x_rkf45) local res, solnproc, outpoint, ndsol, i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; _EnvDSNumericSaveDigits := Digits; Digits := 14; if _EnvInFsolve = true ...

>    numratk(0,1)(1);  # Numeerisen ratkaisun arvo annetussa pisteessä.

>   

[t = 1., x(t) = 2.41641902799175812, y(t) = -.199526923222372004]

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);

kayra := proc (a, b, trange) options operator, arrow; odeplot(numratk(a,b),[x(t), y(t)],trange) end proc

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);

[Maple Plot]

>    numfaasi:=trange->display([seq(seq(kayra(a,b,trange),a=-2..2),b=-2..2)],view=[-20..20,-15..15]);

numfaasi := proc (trange) options operator, arrow; display([seq(seq(kayra(a,b,trange),a = -2 .. 2),b = -2 .. 2)],view = [-20 .. 20, -15 .. 15]) end proc

>    numfaasi(-3..3);

[Maple Plot]

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);

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)];

AA := [[0, -2, -2], [0, -1, -2], [0, 0, -2], [0, 1, -2], [0, 2, -2], [0, -2, -1], [0, -1, -1], [0, 0, -1], [0, 1, -1], [0, 2, -1], [0, -2, 0], [0, -1, 0], [0, 0, 0], [0, 1, 0], [0, 2, 0], [0, -2, 1], [...
AA := [[0, -2, -2], [0, -1, -2], [0, 0, -2], [0, 1, -2], [0, 2, -2], [0, -2, -1], [0, -1, -1], [0, 0, -1], [0, 1, -1], [0, 2, -1], [0, -2, 0], [0, -1, 0], [0, 0, 0], [0, 1, 0], [0, 2, 0], [0, -2, 1], [...

>    faasitaso:=trange->DEplot([dys],[x(t),y(t)],t=trange,AA,stepsize=0.1);

faasitaso := proc (trange) options operator, arrow; DEplot([dys],[x(t), y(t)],t = trange,AA,stepsize = .1) end proc

>    faasitaso(-3..3);

[Maple Plot]

>    ?DEplot

>   

>    DEplot([dys],[x(t),y(t)],t=-3..3,x=-3..3,y=-3..3,stepsize=0.1);

[Maple Plot]

>    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);

[Maple Plot]

>   

>    numratk:=(a,b)->dsolve({dys,x(0)=a,y(0)=b},{x(t),y(t)},numeric,maxfun=1000);

numratk := proc (a, b) options operator, arrow; dsolve({dys, x(0) = a, y(0) = b},{x(t), y(t)},numeric,maxfun = 1000) end proc

>    kayra:=(a,b,trange)->odeplot(numratk(a,b),[x(t),y(t)],trange);

kayra := proc (a, b, trange) options operator, arrow; odeplot(numratk(a,b),[x(t), y(t)],trange) end proc

>    numfaasi:=trange->display([seq(seq(kayra(a,b,trange),a=-2..2),b=-2..2)]);

numfaasi := proc (trange) options operator, arrow; display([seq(seq(kayra(a,b,trange),a = -2 .. 2),b = -2 .. 2)]) end proc

>    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]);

[Maple Plot]

>    kuva:=%:

>    display(suuntak,kayra(0,1.8,-3..3));

[Maple Plot]

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));

[Maple Plot]

>   

>    kay:=numfaasi(-3..3):

>    kay;

[Maple Plot]

>   

>    aasi:=(trange,opt1,opt2)->plot([seq(aaratkf(a,trange),a=-20..20)],opt1,opt2);

aasi := proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc

>    print(aasi);

proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc

>    proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc;

proc (trange, opt1, opt2) options operator, arrow; plot([seq(aaratkf(a,trange),a = -20 .. 20)],opt1,opt2) end proc

>   

>