L9maple
Luento ti 15.10.02
Diskreetit dynaamiset systeemit.
Alustukset
> | restart: |
> | with(linalg): with(LinearAlgebra): |
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the assigned name GramSchmidt now has a global binding
> | alias(rref=ReducedRowEchelonForm): alias(ref=GaussianElimination): alias(Diag=DiagonalMatrix,Id=IdentityMatrix): |
> | with(plots): |
Warning, the name changecoords has been redefined
> | #plotdots:=data->display([plot(data,style=point,symbol=circle,symbolsize=17,symbol=circle),plot(data,color=blue)]); |
> | plotdots:=data->display([plot(data,style=point),plot(data,color=blue)]); |
> | # Esim: |
> | #plotdots([[0,0],[1,1],[1,0],[3,2]]); |
> | traje:=proc(A,x0,n) local x,k; x[0]:=x0: for k to n do x[k]:=A.x[k-1]: end do: plotdots(map(convert,[seq(x[k],k=0..n)],list)); end: |
> | trajedot:=proc(A,x0,n) local x,k; x[0]:=x0: for k to n do x[k]:=A.x[k-1]: end do: plot(map(convert,[seq(x[k],k=0..n)],list),style=point); end: |
> | #traje(A,<-3,3>,10); |
1. Yleistä
Lay 5.6
> |
> |
> |
2. Ratkaisujen graafinen kuvaaminen
Ohjelmankehitystä ja Esim. 2
Jos et halua katsella ohjelmankehitystä, klikkaa itsesi tänne.Katsotaan, miten trajektoreita olisi kätevää piirtää.
> | A:=<<.8,0>|<0,.64>>; |
> | lambda[1]:=0.8; lambda[2]:=0.64; |
> | v[1]:=<1,0>; v[2]:=<0,1>; |
> | x[0]:=c[1]*'v[1]' + c[2]*'v[2]'; |
> | x[k]:=c[1]*0.8^k*v[1] + c[2]*0.64^k*v[2]; |
-> 0, kun k ->
Tapa, jolla nollaa lähestyminen tapahtuu, on kiinnostava.
> | xnollat1:=[seq(<-3+j,3>,j=0..6)]; |
> | xnollat2:=seq(<-3+j,-3>,j=0..6); |
> | x[0]:=xnollat1[1]: |
> | n:=10: for k to n do x[k]:=A.x[k-1]: end do: |
> | seq(x[k],k=0..n); |
> | map(convert,[%],list); |
> | plotdots(%); |
> | jono[1]:=seq([x[k]],k=0..5); |
Näiden kokeilujen jälkeen olemme valmiit kirjoittamaan pienen proseduurin.
> | traje:=proc(A,x0,n) local x,k; x[0]:=x0: for k to n do x[k]:=A.x[k-1]: end do: plotdots(map(convert,[seq(x[k],k=0..n)],list)); end: |
> | traje(A,<-3,3>,10); |
> |
> | xnollat1; |
> | yla:=seq(traje(A,xnollat1[k],10),k=1..nops(xnollat1)): |
> | ala:=seq(traje(A,xnollat2[k],10),k=1..nops(xnollat1)): |
> | display(yla,ala,title="Ominaisarvot < 1"); |
Origo on attraktiivinen kiintopiste.
Esim. 2, attraktiivinen kiintopiste
Otetaan sama uudelleen, ilman ohjelmankehitystä.
> | read("c:\\usr\\heikki\\v3\\v302.mpl"): |
> | print(traje); |
> | A:=<<.8,0>|<0,.64>>; |
> | lambda[1]:=0.8: lambda[2]:=0.64: |
> | v[1]:=<1,0>: v[2]:=<0,1>: |
> | x[0]:=c[1]*'v[1]' + c[2]*'v[2]'; |
> | x[k]:=c[1]*0.8^k*v[1] + c[2]*0.64^k*v[2]; |
Pisteet
> | seq(X[k],k=0..10),"o o o"; |
muodostavat dynaamisen systeemin trajektorin .
> | traje(A,<-3,3>,10); |
> | yla:=display(traje(A,<-3,3>,10),traje(A,<0,3>,10),traje(A,<1,3>,10),traje(A,<3,3>,10)): |
> | ala:=display(traje(A,<-3,-3>,10),traje(A,<0,-3>,10),traje(A,<1,-3>,10),traje(A,<3,-3>,10)): |
> | display(yla,ala,title="Ominaisarvot < 1, attraktori"); |
> |
> | display(traje(A,<0,3>,10),traje(A,<0,-3>,10),traje(A,<3,0>,10),traje(A,<-3,0>,10),title="Ominaisvektorit"); |
> | display(%,view=[-1..1,-1..1]); # Näin voi zoomata. |
Siis O on attraktiivinen kiintopiste , kun molemmat ominaisarvot positiivisia ja < 1.
Esim 3, repulsiivinen kiintopiste
> | read("c:\\usr\\heikki\\v3\\v302.mpl"): |
> | A:=<<1.44,0>|<0,1.2>>; |
> | display(traje(A,<.1,0>,10),traje(A,<-.1,0>,10),traje(A,<0,.1>,10), traje(A,<0,-.1>,10),title="Ominaisvektorit, virtaus poispäin O:sta"); |
> | display(%,traje(A,<.1,.1>,10),traje(A,<-.1,.1>,10),traje(A,<-.1,-.1>,10),traje(A,<.1,-.1>,10)); |
> | #xnollat1:=[seq(.1*<-3+j,3>,j=0..6)]: #xnollat2:=seq(.1*<-3+j,-3>,j=0..6):xnollat3:=[.1*<-3,0>,.3*<3,0>]: |
> |
> | #yla:=seq(traje(A,xnollat1[k],10),k=1..nops(xnollat1)):ala:=seq(traje(A,xnollat2[k],10),k=1..nops(xnollat1)): |
> | #xaks:=seq(traje(A,xnollat3[k],10),k=1..nops(xnollat3)): |
> | #display(yla,ala,traje(A,<.1,0>,10),traje(A,<-.1,0>,10),title="Ominaisarvot > 1"); |
Esim. 4, satulapiste
> | read("c:\\usr\\heikki\\v3\\v302.mpl"): |
> | A:=<<2,0>|<0,0.5>>; |
> | display(traje(A,<0.05,2>,10),traje(A,<-.05,2>,10),traje(A,<.1,2>,10), traje(A,<-.1,2>,10),traje(A,<0.05,-2>,10),traje(A,<-.05,-2>,10),traje(A,<.1,-2>,10), traje(A,<-.1,-2>,10),traje(A,<0.05,0>,10),traje(A,<-.05,0>,10),traje(A,<0,.2>,10), traje(A,<0,-2>,10),view=[-5..5,-2..2],title="Ominaisarvot < 1, satulapiste"); |
> | display(trajedot(A,<0.05,0>,10),trajedot(A,<-.05,0>,10),trajedot(A,<0,2>,10), trajedot(A,<0,-2>,10),view=[-5..5,-2..2],title="Ominaisvektorit",axes=frame); |
x-akselilla lähdettiin läheltä O:a, y-akselilla kaukaa. Edellisellä virtaus ulospäin, jälkimmäisellä sisäänpäin.
Voisi olla mukava sellainen
traje
-versio, jossa käytetään
arrow
:ta. Teepä harjoituksissa!
Esim. 6, Kompleksiset ominaisvektorit
> | A:=<<.8,-.1>|<.5,1>>; |
> | (oa,ov):=Eigenvectors(A); |
> | lambda:=oa[1]; w:=ov[1..-1,1]; |
> | u:=map(Re,w); |
> | v:=map(Im,w); |
> | S:=<u|v>; SI:=S^(-1); |
> | alpha:=Re(lambda): beta:=Im(lambda): |
> | R:=<<alpha,-beta>|<beta,alpha>>; |
> | A=S.R.SI; |
> | r:=abs(lambda); |
> | phi:=argument(lambda); |
> | spiraali:=r*<<cos(phi),-sin(phi)>|<sin(phi),cos(phi)>>; |
> | traje(spiraali,<0,2.5>,50);# Uudet muuttujat peruskoordinaatistossa esitettynä. |
> | traje(A,<0,2.5>,50); # Iteroidaan alkuperäisellä matriisilla, kuva saataisiin #edellisestä koordinaatistomuunnoksella, jonka välittää matriisi P. |
3. Täpläpöllöjen selviytymisongelma
> | restart: |
> | with(linalg): with(LinearAlgebra): |
> | read("c:\\usr\\heikki\\v3\\v302.mpl"): |
> | print(traje); |
> | A:=<<0,.18,0>|<0,0,.71>|<.33,0,.94>>; |
> | A,<"juveniles","subadults","adults">; |
> | x[k]=<'j[k]','s[k]','a[k]'>; |
> | (oa,ov):=Eigenvectors(A); |
> | lambda[1]:=oa[1]; |
> | lambda[3]:=oa[3]; |
> | Im(%); |
> | lambda[3]:=Re(lambda[3]); |
> | abs(lambda[1]); |
Kaikkien ominaisarvojen itseisarvot < 1, paha merkki!
> | ![]() |
Jos lähdetään reaalisesta vektorista
, niin
Jne., siten tulokset ovat reaalisia, vaikka ominaisvektorikaavassa laskenta kulkee kompleksilukujen kautta.
Koska ominaisarvojen itseisarvot < 1, niin
-> 0, kun k ->
Malli siis ennustaa täpläpöllöjen tuhoa.
Harjoitustehtävänä (LV6) voidaan katsoa, minkälaista "kuoleman spiraalia" pitkin kuljetaan.
Toisena harjoitustehtävänä katsotaan tilannetta, jossa nuorten pöllöjen pesäaluesiirtymävaiheen henkiinjäämisprosentti on 50, jolloin
A[2,1]=0.3 aiemman 0.18:n sijasta.(Nuorison henkiinjäämisprosentti oman pesän piirissä oli 60.)
> | A:=<<0,.3,0>|<0,0,.71>|<.33,0,.94>>; |
> | A,<"juveniles","subadults","adults">; |
> |
> |
Tästä voit jatkaa harjoitustehtävässä