Tentti 31.3.2007 

Alustukset 

 

> restart:
 

> with(LinearAlgebra):with(linalg):alias(Inv=MatrixInverse,Diag=DiagonalMatrix,Det=Determinant,Id=IdentityMatrix,ref=GaussianElimination,rref=ReducedRowEchelonForm):
 

Warning, the name GramSchmidt has been rebound 

Warning, the protected names norm and trace have been redefined and unprotected 

>
 

1. 

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

Matrix(%id = 409011896) 

>
 

Katsotaan ensin tulos ja periaate valmiista Maple-funktiota käyttäen. 

 

> <A | Id(3)>,rref(<A|Id(3)>); # A:n viereen 3 x 3-yksikkömatriisi ja rref koko höskälle käyttäen Maplen valmista rref-funktiota
 

Matrix(%id = 409119944), table( [( 2, 3 ) = 0, ( 3, 6 ) = 1/2, ( 3, 1 ) = 0, ( 2, 2 ) = 1, ( 3, 2 ) = 0, ( 1, 4 ) = (-9)/2, ( 2, 5 ) = 4, ( 1, 3 ) = 0, ( 3, 5 ) = -2, ( 1, 5 ) = 7, ( 2, 6 ) = -1, ( 3,... 

Koska vasemmalle saadaan yksikkömatriisi, ts. kaikki sarakkeet ovat tukisarakkeita, on käänteismatriisi olemassa ja se koostuu yllä olevista 

kolmesta viimeisestä rivistä. 

Tehdään laskut nyt vaiheittain (Maplella käsinlaskua simuloiden): 

> AE:=<A | Id(3)>;
 

Matrix(%id = 409308760) 

> AE:=Matrix(swaprow(AE,1,2));  # Vaihdetaan 1. ja 2. rivi
 

Matrix(%id = 409388328) 

> AE[3,1..-1]:=AE[3,1..-1]-4*AE[1,1..-1]: AE; # rivi3:=-4*rivi1+rivi3
 

Matrix(%id = 409388328) 

> AE[3,1..-1]:=AE[3,1..-1]+3*AE[2,1..-1]:AE;  # rivi3:=3*rivi2+rivi3
 

Matrix(%id = 409388328) 

Tästä nähdään, että A:n kaikki sarakkeet ovat tukisarakkeita ja niin ollen käänteismatriisi on olemassa. 

> AE[3,1..-1]:=AE[3,1..-1]/2:AE;  # Skaalataan alin tukialkio 1:ksi.
 

Matrix(%id = 409388328) 

Alhaalta ylös: 

> AE[2,1..-1]:=AE[2,1..-1]-2*AE[3,1..-1]:AE; # rivi2:=-3*rivi3+rivi2
 

Matrix(%id = 409388328) 

> AE[1,1..-1]:=AE[1,1..-1]-3*AE[3,1..-1]:AE; # rivi1:=-3*rivi3+rivi1
 

Matrix(%id = 409388328) 

Päästiin siten samaan tulokseen kuin yllä valmiilla rref-funktiolla ja käänteismatriisi on siten 

> AE[1 .. 3, 4 .. 6]; 1
 

Matrix(%id = 411671556) 

Huomioita:   Tässä ei todellakaan tarvitse laskea yhtään determinanttia, johtopäätös tulee suoraan laskenta-algoritmista. 

Teoriassa voisi esiintyä ratkaisu, jossa johtopäätös olemassaolosta tehdään determinantista. Kyllä sekin hyväksytään, vaikka  

onkin hiukan "huonoa makua" osoittava. 

2 

> A:=<<5,0,0,0>|<-2,3,0,0>|<6,c,5,0>|<-1,0,4,1>>;
 

Matrix(%id = 411718460) 

Koska kyseessä on yläkolmiomatriisi, ovat ominaisarvot matriisin diagonaalialkiot. Jos et sattuisi tätä muistamaan, saat sen suoraan kehittämällä 

det(A-I*lambda); 1n (alideterminantteineen)  ensimmäisen sarakkeen mukaan.  

> p := Determinant(A-lambda*Id(4)); 1
 

(5-lambda)^2*(3-lambda)*(1-lambda) 

>
 

Matriisi (n x n) on diagonalisoituva, jos  sillä on n LRT ominaisvektoria, mikä on yhtäpitävää sen kanssa, että kunkin ominaisrvon algebrallinen ja 

geometrinen kertaluku yhtyvät. Tässä tapauksessa näin on jos ja vain jos ominaisarvon lambda = 5; 1 geometrinen kertaluku yhtyy algebralliseen = 2  

 

Toisin sanoen, laskettava ominaisarvoa lambda = 5; 1 vastaavat ominaisvektorit ja järjestettävä parametrin c avulla tilanne sellaiseksi, että saadaan 

2 LRT ominaisvektoria. 

 

> (lam,V):=Eigenvectors(A);
 

Vector[column](%id = 409412572), Matrix(%id = 409917796) 

> eigenvectors(A);
 

[1, 1, {table( [( 1 ) = 1/4*c+7/4, ( 2 ) = 1/2*c, ( 3 ) = -1, ( 4 ) = 1 ] )}], [5, 2, {table( [( 1 ) = 1, ( 2 ) = 0, ( 3 ) = 0, ( 4 ) = 0 ] )}], [3, 1, {table( [( 1 ) = 1, ( 2 ) = 1, ( 3 ) = 0, ( 4 ) ...
[1, 1, {table( [( 1 ) = 1/4*c+7/4, ( 2 ) = 1/2*c, ( 3 ) = -1, ( 4 ) = 1 ] )}], [5, 2, {table( [( 1 ) = 1, ( 2 ) = 0, ( 3 ) = 0, ( 4 ) = 0 ] )}], [3, 1, {table( [( 1 ) = 1, ( 2 ) = 1, ( 3 ) = 0, ( 4 ) ...
 

Kumpikaan ei ota huomioon mahdollisuutta: c=6, poikkeusarvot on aina ja kaikkialla käsiteltävä erikseen. 

>
 

> A-5*Id(4);   # A - 5*I
 

Matrix(%id = 411308604) 

> M5 := A-5*Id(4); 1
 

Matrix(%id = 409445252) 

Ominaisvektoriyhtälö on siis  M5*v = 0; 1 .  Merkitään B :llä M5:n kanssa riviekvivalenttia matriisia, joka syntyy rivioperaatioilla.  

(Olkoon B yleisnimi tällaisille.) 

> B := M5; 1
 

Matrix(%id = 409445252) 

> B[2, 1 .. -1] := B[2, 1 .. -1]-B[1, 1 .. -1]; -1; B; 1
 

Matrix(%id = 409445252) 

Seuraava rivioperaatio riippuu siitä, onko c-6 = 0; 1 vai ei. Selvyyden vuoksi nollataan ensin alin rivi: 

> B[4, 1 .. -1] := B[4, 1 .. -1]+B[3, 1 .. -1]; -1; B; 1
 

Matrix(%id = 409445252) 

Jos c ei ole 6, on systeemin matriisilla 3 tukialkiota (-2,c-6,4) ja siis yksi vapaa parametri, ja siis 1-ulotteinen ominaisavaruus. 

Jos c=6, on tukialkioita vain 2  (-2 ja 1), joten vapaita parametreja on 2 ja siten ominaisavaruus on 2-ulotteinen. 

Siis matriisi on diagonalisoituva, jos ja vain jos c=6. 

 

Voidaan viedä selvyyden vuoksi loppuun saakka : c=6, lisätään -4*rivi2 kolmanteen riviin: 

> c := 6; -1; B[3, 1 .. -1] := B[3, 1 .. -1]-4*B[2, 1 .. -1]; -1; B; 1
 

Matrix(%id = 409445252) 

Tukialkiot sarakkeissa 2 ja 4, vapaat muuttujat sarakkeissa 1 ja 3. 

>
 

3. 

> restart: with(LinearAlgebra): with(linalg): with(plots):
 

Warning, the name GramSchmidt has been rebound 

Warning, the protected names norm and trace have been redefined and unprotected 

Warning, the name changecoords has been redefined 

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

Matrix(%id = 409460816) 

Aloitetaan laskemalla ominaisarvot ja -vektorit. Sitä laskua en enää näytä, kaikkihan sen osaavat!  

Antaa Maplen laskea valmiilla funktiolla: 

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

Vector[column](%id = 408949340), Matrix(%id = 411114280) 

Siis ominaisarvot ovat -1 ja 3 ja vastaavat ominaisvektorit ovat ov-matriisin sarakkeet: 

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

Vector[column](%id = 411151352) 

Vector[column](%id = 410008560) 

>
 

Yleinen ratkaisu: 

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

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

> y(t); 1
 

Vector[column](%id = 409536708) 

Alkuarvotehtävä: 

> y(0)=<1,3>;
 

Vector[column](%id = 411959116) = Vector[column](%id = 408940416) 

> LinearSolve(ov,<1,3>);  # Ratkaistaan vakiot C1 ja C2:
 

Vector[column](%id = 411959556) 

> ya:=unapply(subs(C1=1/2,C2=5/2,y(t)),t):  # Maple-tekniikkaa, ei tarvitse lukea.
 

> ya(t);   # Alkuarvotehtävän ratkaisu koordinaattimuodossa:
 

Vector[column](%id = 409326796) 

>
 

> Ya:=ya(t):
 

>
 

> plot([Ya[1],Ya[2],t=-2..2],view=[0..5,0..5]);
 

Plot 

> AAratkuva:=%:
 

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

Vector[column](%id = 409543588) 

> YY:=evalm(Ys);
 

table( [( 1 ) = C1/s+1/5*C2*s^3, ( 2 ) = C1/s+C2*s^3 ] ) 

> #YYa:=subs(C1=1/2,C2=1/2,op(YY));
 

> #YYa;
 

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

>
 

> parvikuva:=plot([parvi]):
 

> display(parvikuva,AAratkuva,plot([[1,3]],style=point,symbol=circle,symbolsize=17),arrow([v1,v2]),view=[-5..5,-5..5]);
 

Plot 

> kuva:=%:
 

> with(DEtools):
 

Warning, the previous bindings of the names RationalCanonicalForm and adjoint have been removed and they now have an assigned value 

> DEplot([D(y1)(t)=-2*y1(t)+y2(t),D(y2)(t)=-5*y1(t)+4*y2(t)],
[y1(t),y2(t)],t=-5..2,y1=-5..5,y2=-5..5,color=grey):
 

> display(kuva,%,title="Satula");
 

Plot 

> kuva := %; -1
 

Selityksiä: 

Yleinen ratkaisu: 

y(t) = C1*exp(lambda[1]*t)*v1+C2*exp(lambda[2]*t)*v2; 1  missä 

 

> 'v1'=v1, 'v2'=v2;
 

v1 = Vector[column](%id = 411151352), v2 = Vector[column](%id = 410008560) 

> 'lambda[1]' = lambda[1], 'lambda[2]' = lambda[2]; 1
 

lambda[1] = -1, lambda[2] = 3 

Ominaisvektorilla v[1]; 1  (C2=0) kuljetaan O:a kohti (lambda[1] < 0; 1) ja  ominaisvektorilla v[2] (C1=0) O:sta poispäin (0 < lambda[2]; 1). 

Kyseessä on satulapiste, joka on epästabiili (jo pelkästään ominaisvektorikäytös  kertoo sen). 

Suuntakenttänuolet annetuissa pisteissä lasketaan yksinkertaisesti näin: 

> p1:=<1,0>; s1:=A.p1: s1:=s1/10;#arrow([p1],[s1/10]);
 

Vector[column](%id = 408181784) 

Vector[column](%id = 407247080) 

> p2 := `<,>`(0, 1); 1; s2 := Typesetting:-delayDotProduct(A, p2); -1; s2 := 1/10*s2; 1
 

Vector[column](%id = 414420724) 

Vector[column](%id = 412144304) 

> p3 := `<,>`(-1, 0); 1; s3 := Typesetting:-delayDotProduct(A, p3); -1; s3 := 1/10*s3; 1
 

Vector[column](%id = 412313356) 

Vector[column](%id = 413545172) 

> p4 := `<,>`(0, -1); 1; s4 := Typesetting:-delayDotProduct(A, p4); -1; s4 := 1/10*s4; 1
 

Vector[column](%id = 409959004) 

Vector[column](%id = 415733264) 

> plots[arrow]([[p1, s1], [p2, s2], [p3, s3], [p4, s4]], view = [-1.5 .. 1.5, -1.5 .. 1.5]); 1
plots[arrow]([[p1, s1], [p2, s2], [p3, s3], [p4, s4]], view = [-1.5 .. 1.5, -1.5 .. 1.5]); 1
 

Plot 

Piirrettiin kuhunkin annettuun pisteeseen p derivaatan suuntainen nuoli s, joka saadaan kertomalla s = `.`(A, p); 1, kun kerran y'=A p. Normeerataan tässä jakamalla 10:llä. 

>
 

>
 

 

4. 

>
 

Kriittiset pisteet: Ratkaistaan yhtälöryhmä: "oikeat puolet = 0", ts. 

> yhtaloryhma:={200*x-4*x*y=0,-150*y+2*x*y=0};
 

> solve(yhtaloryhma,{x,y});
 

{200*x-4*x*y = 0, -150*y+2*x*y = 0} 

{y = 0, x = 0}, {x = 75, y = 50} 

Käsin laskien: x = 0, y = 0; 1 nähdään välittömästi ratkaisuksi (sukupuuttoratkaisu). Jos x ei ole 0, saadaan 1. yhtälöstä: y = 50; 1 ja sitten toisesta x = 75; 1. 

Muita mahdollisuuksia ei ole. 

> krp:=<75,50>;   # Hengissä säilymisen kriittinen piste
 

Vector[column](%id = 408691556) 

>
 

Linearisointi: 

> f:=200*x-4*x*y;g:=-150*y+2*x*y;
 

200*x-4*x*y 

-150*y+2*x*y 

> J:=Matrix(jacobian([f,g],[x,y])); # Jacobin matriisi
 

Matrix(%id = 413755104) 

> A:=subs(x=75,y=50,J); # Sijoitetaan kriittinen piste
 

Matrix(%id = 411409752) 

> Eigenvalues(A);
 

Vector[column](%id = 415367208) 

Puhtaasti imaginaariset ominaisarvot, KRP:n tyyppi on siten keskus ja siis stabiili. 

 

Huom: Keskuksen tapauksessa linearisoidun systeemin (O:n) tyyppi ei välttämättä kerro alkuperäisen systeemin (KRP:n) tyyppiä. 

Tässä tapauksessa se on sama, mutta sitä ei tehtävässä pyydetty pohtimaan (keinoja siihen ei kurssilla ole edes opetettu).  

>
 

5. 

Tehtävä on periaatteessa samanlainen kuin kahdessa edellisessä tentissä. Nyt on alkuarvofunktio määritelty paloittain kahdessa osassa. 

Se on tehty edelleenkin mahdollisimman humaanisti integrointivaivoja säästäen. 

Älä välitä ylimääräisistä Maple-komennoista. (Vaikka ovat punaisella, niin älä sinä ala nähdä punaista!) 

> restart; -1
 

> with(plots):setoptions3d(orientation=[-30,50],axes=box):
 

Warning, the name changecoords has been redefined 

> read("c:/usr/heikki/numsym05/maple/ns05.mpl");
 

Ratkaisun muoto on annettu.  

Jotta alkuehto toteutuisi, on B[n]; 1 - kertoimet valittava alkuehtofunktion f sinisarjan kertoimiksi: B[n] = b[n]; 1. 

Tarvitsemme siis sinisarjaa. 

> bn:=(2/L)*int(f(x)*sin(n*Pi*x/L),x=0..L);
 

2*int(f(x)*sin(n*Pi*x/L), x = 0 .. L)/L 

> bn := (2/10)*(Int(100*sin(n*Pi*x/10),x=0..5)+Int(O*sin(n*Pi*x/10),x=5..10));
 

1/5*Int(100*sin(1/10*n*Pi*x), x = 0 .. 5)+1/5*Int(O*sin(1/10*n*Pi*x), x = 5 .. 10) 

> bn := 1/5*int(100*sin(1/10*n*Pi*x), x = 0 .. 5); 1
 

-200*(-1+cos(1/2*n*Pi))/(n*Pi) 

> B := seq(bn, n = 1 .. 40); 1
 

200/Pi, 200/Pi, 200/3/Pi, 0, 40/Pi, 200/3/Pi, 200/7/Pi, 0, 200/9/Pi, 40/Pi, 200/11/Pi, 0, 200/13/Pi, 200/7/Pi, 40/3/Pi, 0, 200/17/Pi, 200/9/Pi, 200/19/Pi, 0, 200/21/Pi, 200/11/Pi, 200/23/Pi, 0, 8/Pi, ...
200/Pi, 200/Pi, 200/3/Pi, 0, 40/Pi, 200/3/Pi, 200/7/Pi, 0, 200/9/Pi, 40/Pi, 200/11/Pi, 0, 200/13/Pi, 200/7/Pi, 40/3/Pi, 0, 200/17/Pi, 200/9/Pi, 200/19/Pi, 0, 200/21/Pi, 200/11/Pi, 200/23/Pi, 0, 8/Pi, ...
200/Pi, 200/Pi, 200/3/Pi, 0, 40/Pi, 200/3/Pi, 200/7/Pi, 0, 200/9/Pi, 40/Pi, 200/11/Pi, 0, 200/13/Pi, 200/7/Pi, 40/3/Pi, 0, 200/17/Pi, 200/9/Pi, 200/19/Pi, 0, 200/21/Pi, 200/11/Pi, 200/23/Pi, 0, 8/Pi, ...
200/Pi, 200/Pi, 200/3/Pi, 0, 40/Pi, 200/3/Pi, 200/7/Pi, 0, 200/9/Pi, 40/Pi, 200/11/Pi, 0, 200/13/Pi, 200/7/Pi, 40/3/Pi, 0, 200/17/Pi, 200/9/Pi, 200/19/Pi, 0, 200/21/Pi, 200/11/Pi, 200/23/Pi, 0, 8/Pi, ...
 

> seq(-1+cos((n*Pi)/2),n=1..10);
 

-1, -2, -1, 0, -1, -2, -1, 0, -1, -2 

Kertoimet ovat siis muotoa: 

 

> 200*(1, 1, 1/3, 0, 1/5, 1/3, 1/7, 0, jne)/Pi; 1
 

200*(1, 1, 1/3, 0, 1/5, 1/3, 1/7, 0, jne)/Pi 

Muodostetaan  yleinen n:s osasumma: 

> lambda:=n-> n*Pi/10; summaf:=(x,t,N)-> sum(B[n]*sin((n*Pi*x)/10)*exp(-lambda(n)^2*t),n=1..N);
 

proc (n) options operator, arrow; 1/10*n*Pi end proc 

proc (x, t, N) options operator, arrow; sum(B[n]*sin(1/10*n*Pi*x)*exp(-lambda(n)^2*t), n = 1 .. N) end proc 

Kysytty 3:n termin summa on siis: 

> summaf(x, t, 3); 1
 

200*sin(1/10*Pi*x)*exp(-1/100*Pi^2*t)/Pi+200*sin(1/5*Pi*x)*exp(-1/25*Pi^2*t)/Pi+200/3*sin(3/10*Pi*x)*exp(-9/100*Pi^2*t)/Pi
200*sin(1/10*Pi*x)*exp(-1/100*Pi^2*t)/Pi+200*sin(1/5*Pi*x)*exp(-1/25*Pi^2*t)/Pi+200/3*sin(3/10*Pi*x)*exp(-9/100*Pi^2*t)/Pi
 

> plot3d(summaf(x,t,3),x=0..10,t=0..20,title="n=3");plot3d(summaf(x,t,20),x=0..10,t=0..20,title="n=20");plot3d(summaf(x,t,40),x=0..10,t=0..20,title="n=40");
 

Plot 

Plot 

Plot 

Huomataan, että n=3 on varsin karkea alkuapproksimaatio, n=20 näyttää Gibbsin ilmiön hyvin selvästi. Toki Gibbsin ilmiö esiintyy isommillakin, 

mutta kokonaisuus näkyy sileämpänä isommalla n:n arvolla. (Gibbs-piikit ovat hyvin lähellä epäjatkuvuuskohtia, eikä 3D-grafiikka välttmättä näytä 

niitä.) Kun aikaa kuluu, niin ratkaisu siliää varsin nopeasti, johtuen exp-termeistä. 

>
 

>
 

>