Harj 7 LV

V3, lokakuu 2002  HA

Alustukset

Tässäpä sattui hankala paikka. Rita  oli miltei epätoivon partaalla, kun GramSchmid t ei toiminut, vaikka syöte

aivan varmasti oli oikea. Onnistuin nyt itsekin kaatumaan samaan seikkaan, vaikka aiemmin en ollut (ja ymmärsin omakohtaisesti

Ritan epätoivon).

Syy selvisi tarkkailemalla sinisiä latausvaroituksia;

"Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value"

?GramSchmidt

paljastaa, että myös linalg:ssa on aivan samanniminen funktio. Nyt leikkisästi riippuu kirjastojen latausjärjesyksestä,

kumpi on voimassa.

Lupaan kirjoittaa tästä palautetta MUG-listalle ensi tilassa (Maple Users' Group).

Kohtuullisen robusti ratkaisu on alla oleva alias-määrittely, jossa viitataan koko nimeen kirjasto mukaanlukien.

Huomaa! Aina voidaan käyttää pitkää nimeä, siis LinearAlgebra[GramSchmidt],  jolloin kirjastoa ei edes tarvitse ladata. (Voidaan ajatella, että LinearAlgebra  on ison perheen

sukunimi ja esim. GramSchmid t etunimi.)

>    restart:

>    alias(GS=LinearAlgebra[GramSchmidt]):

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

>    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

>    # ?GramSchmidt

>   

>    alias(ref=GaussianElimination):

>    alias(TR=Transpose):

>    sarakkeet:=A->[seq(A[1..-1,j],j=1..LinearAlgebra[Dimension](A)[2])]; # Tämä voi olla kätevä.

sarakkeet := proc (A) options operator, arrow; [seq(A[1 .. -1,j],j = 1 .. LinearAlgebra[LinearAlgebra:-Dimension](A)[2])] end proc

>    randV:=n->RandomVector(n,generator=rand(-1000..1000)/1000.);

randV := proc (n) options operator, arrow; LinearAlgebra:-RandomVector(n,generator = .1000000000e-2*rand(-1000 .. 1000)) end proc

>    randM:=(m,n)->RandomMatrix(m,n,generator=rand(-1000..1000)/1000.);

randM := proc (m, n) options operator, arrow; LinearAlgebra:-RandomMatrix(m,n,generator = .1000000000e-2*rand(-1000 .. 1000)) end proc

1.

>    A:=<<-6,-1,3,6,2,-3,-2,1>|<-3,2,6,-3,-1,6,-1,2>|<6,1,3,6,2,3,2,1>|<1,-6,-2,-1,3,2,-3,6>>;

A := Matrix(%id = 135997072)

>    TR(A).A;

Matrix(%id = 138322108)

Tämä on käyttäjän kannalta tehokkain tapa. Siinähän muodostetaan juuri kaikki sisätulot v^T*v , missä v  on

A:n sarakevektori.

Koska saatiin diagonaalimatriisi, on ortogonaalisuus osoitettu.

Nähdään myös, että jokaisen vektorin normi = 10, joten normaaraus saadaan yksinkertaisesti:

>    U:=A/10;

U := Matrix(%id = 134850064)

>    TR(U).U;

Matrix(%id = 138326588)

Tietenkään ortogonaalisen systeemin vektoreilla ei yleensä ole sama normi, joten normeeraus on tehtävä vektoreittain.

>    GS(sarakkeet(A)); # Käytetään nyt riemumielin GS:ää, vaikka ei tässä olekaan tarpeen.

[Vector(%id = 134829864), Vector(%id = 134831912), Vector(%id = 134835288), Vector(%id = 134852640)]

>    GS(sarakkeet(A),normalized);

[Vector(%id = 134854400), Vector(%id = 134769684), Vector(%id = 134771892), Vector(%id = 134780308)]

8, 4

b)

>    TR(U).U,U.TR(U);

Matrix(%id = 135997000), Matrix(%id = 138357344)

Ainakin ne ovat eri kokoiset neliömatriisit. Kokeillaan nyt vielä tällaista:

>    (U.TR(U))^2;

Matrix(%id = 138359948)

Ihmeellistä, U*U^T  on sama kuin sen neliö. (Idempotentti.)

c)

Kun lasketaan p = U*U^T*y , niin vektorimuodossa kirjoitettuna saadaan :

        eta[1]*u[1]  + ... + eta[m]*u[m]  ,

  missä eta[k] =< u[k] ,y>, ja u[k]  on U:n k:s sarakevektori,

Mieti tämä läpi kynän ja paperin kanssa.

U:n sarakkeet ovat A:n sarakkeet ortonormeerattuina, joten ne virittävät saman aliavaruuden, joka on (määritelmän mukaan)

A:n sarakeavaruus.

Toinen tapa olisi käyttää ref:iä:

>    y:=randV(8);

y := Vector(%id = 134613892)

>    p:=U.TR(U).y:

>    ref(<A|p>);

Matrix(%id = 135879164)

Luokkaa 10^-16 oleva luku on ilman muuta nolla. Liitännäismatriisin rangi pysyy samana kuin A:n, joten p*epsilon*col(A) :

Tässä siis ref ei ollut tarpeen, koska ortogonaalisuus antoi tiedon suoraan.

p on y:n ortog. projektio aliavaruudella col(A), joten se on yleisen projektiolauseen mukaan sellainen, että

          (y - p) _|_ col(A)

Lasketaan nyt tässä tapauksessa vielä:

>    z:=y-p;

z := Vector(%id = 134622740)

>    TR(z).A;

Vector(%id = 134764864)

Vektorin z sisätulo jokaisen sarakkeen kanssa = 0, joten z on todellakin kohtisuorassa koko aliavaruutta col(A) vastaan

(vrt. teht. 1 AV, "lapsellinen lause").

d) Tämä esitys on avainasemassa moneen asiaan. Me osaamme ainakinnähdä p:n PNS-approksimaationa y:lle.

2.

>    data:=[[4,1.58],[6,2.08],[8,2.5],[10,2.8],[12,3.1],[14,3.4],[16,3.8],[18,4.32]];

data := [[4, 1.58], [6, 2.08], [8, 2.5], [10, 2.8], [12, 3.1], [14, 3.4], [16, 3.8], [18, 4.32]]

>    xd:=map(p->p[1],data);yd:=map(p->p[2],data);

xd := [4, 6, 8, 10, 12, 14, 16, 18]

yd := [1.58, 2.08, 2.5, 2.8, 3.1, 3.4, 3.8, 4.32]

>    van:=VandermondeMatrix(xd);

van := Matrix(%id = 135964044)

>    A:=van[1..-1,2..4];

A := Matrix(%id = 138379012)

>    ATA:=TR(A).A;

ATA := Matrix(%id = 135657148)

>    ATy:=TR(A).<yd>;

ATy := Vector(%id = 135321200)

>    c:=LinearSolve(ATA,ATy);  # Normaaliyhtälöt

c := Vector(%id = 135320740)

>    p:=c[1]*x+c[2]*x^2 + c[3]*x^3;

p := .513216030665380907*x-.334781833438239086e-1*x^2+.101595247630496691e-2*x^3

>    display(plot(data,style=point,symbol=cross,symbolsize=15),plot(p,x=4..18,color=grey));

[Maple Plot]

Tehdään vielä QR-hajotelmalla:

>    vvv:=seq(A[1..-1,j],j=1..3);

vvv := Vector(%id = 138388496), Vector(%id = 138388576), Vector(%id = 138388656)

>    Q:=Matrix(GS([vvv],normalized));

Q := Matrix(%id = 138401812)

>    R:=TR(Q).A;

R := Matrix(%id = 138407096)

>    cqr:=LinearSolve(R,TR(Q).<yd>);

cqr := Vector(%id = 138388736)

>    c;

Vector(%id = 135320740)

Varsin hyvällä tarkkuudella samat.

3. Pariisin lämpötilat

 Ylimmät

Kirjoitetaan matriisi 2-sarakkeiseksi, tehtäväpaperissa on transponoitu näyttösyistä

>   

>    Pariisi:=<<55,55,59,64,68,75,81,81,77,70,63,55>|<39,41,45,46,55,61,64,64,61,54,46,41>>;

Pariisi := Matrix(%id = 136631692)

>    Pariisi:=map(evalf@convert,Pariisi,temperature,degF,degC):

>    Paryla:=Pariisi[1..-1,1]; Parala:=Pariisi[1..-1,2];

Paryla := Vector(%id = 138388816)

Parala := Vector(%id = 138388856)

>    TR(Paryla[1..10]); # Tässä on näköjään näytön raja.

Vector(%id = 138388896)

Sovitetaan aineistoon malli, joka on jaksollinen, jaksona 12.

>    f:=(c,T)->c[1]+c[2]*cos(2*Pi*T/12)+c[3]*sin(2*Pi*T/12);

f := proc (c, T) options operator, arrow; c[1]+c[2]*cos(1/6*Pi*T)+c[3]*sin(1/6*Pi*T) end proc

>   

>    Taulukko:=<<seq(i,i=1..12)>|Paryla>;

Taulukko := Matrix(%id = 135610436)

>    Taulukko[1..10,1..-1];

Matrix(%id = 138428156)

>    T1:=Taulukko[1..-1,1];

T1 := Vector(%id = 138389016)

>    v1:=<seq(1,i=1..12)>;v2:=map(T->cos(2*Pi*T/12),T1);v3:=map(T->sin(2*Pi*T/12),T1);

v1 := Vector(%id = 138389056)

v2 := Vector(%id = 138389136)

v3 := Vector(%id = 138389176)

>    A:=<v1|v2|v3>;

A := Matrix(%id = 138442920)

>    #A:=convert(A,float);

>    A[1..5,1..3];

Matrix(%id = 136041396)

>    ATA:=TR(A).A;

ATA := Matrix(%id = 134963808)

>    ATA.c=TR(A).Paryla: # Normaaliyhtälöt

>    c:=LinearSolve(ATA,TR(A).Paryla);

c := Vector(%id = 138389296)

>    f(c,t);

19.39814814-5.263591437*cos(1/6*Pi*t)-5.204890085*sin(1/6*Pi*t)

>    <<seq(i,i=1..12)>|Paryla>: yladata:=convert(%,listlist);

yladata := [[1, 12.77777778], [2, 12.77777778], [3, 15.], [4, 17.77777778], [5, 20.], [6, 23.88888889], [7, 27.22222222], [8, 27.22222222], [9, 25.], [10, 21.11111111], [11, 17.22222222], [12, 12.77777...
yladata := [[1, 12.77777778], [2, 12.77777778], [3, 15.], [4, 17.77777778], [5, 20.], [6, 23.88888889], [7, 27.22222222], [8, 27.22222222], [9, 25.], [10, 21.11111111], [11, 17.22222222], [12, 12.77777...

Tässä oli näppärä temppu, jolla matriisi saadaan vaakarivien (listojen) listaksi. (Matriisin luonteva tietorakenne

"listakielessä" olisi listojen lista.)

>    display(plot(yladata,style=point),plot(f(c,t),t=1..12,color=grey),title="Pariisin ylimpiin lämpötiloihin sovitettu trig. polynomi");

[Maple Plot]

>   

Alimmat

>    Pariisi:=<<55,55,59,64,68,75,81,81,77,70,63,55>|<39,41,45,46,55,61,64,64,61,54,46,41>>;

Pariisi := Matrix(%id = 135708036)

>    Pariisi:=map(evalf@convert,Pariisi,temperature,degF,degC):

>    Parala:=Pariisi[1..-1,2];

Parala := Vector(%id = 138389376)

>   

Sovitetaan aineistoon malli, joka on jaksollinen, jaksona 12.

>    f:=(c,T)->c[1]+c[2]*cos(2*Pi*T/12)+c[3]*sin(2*Pi*T/12);

f := proc (c, T) options operator, arrow; c[1]+c[2]*cos(1/6*Pi*T)+c[3]*sin(1/6*Pi*T) end proc

>   

>    Taulukko:=<<seq(i,i=1..12)>|Parala>:

>    #Taulukko[1..10,1..-1];

>    T1:=Taulukko[1..-1,1]:

>    v1:=<seq(1,i=1..12)>:v2:=map(T->cos(2*Pi*T/12),T1):v3:=map(T->sin(2*Pi*T/12),T1):

>    A:=<v1|v2|v3>:

>    A:=convert(A,float):

>    #A[1..5,1..3];

>    #ATA:=TR(A).A;

>    #ATA.c=TR(A).Paryla: # Normaaliyhtälöt

>    c:=LinearSolve(ATA,TR(A).Parala);

c := Vector(%id = 138389416)

>   

>    f(c,t);

10.7870370372500002-5.27267256894523940*cos(1/6*Pi*t)-4.70803588168088893*sin(1/6*Pi*t)

>    <<seq(i,i=1..12)>|Parala>: aladata:=convert(%,listlist);

aladata := [[1, 3.888888889], [2, 5.], [3, 7.222222222], [4, 7.777777778], [5, 12.77777778], [6, 16.11111111], [7, 17.77777778], [8, 17.77777778], [9, 16.11111111], [10, 12.22222222], [11, 7.777777778]...
aladata := [[1, 3.888888889], [2, 5.], [3, 7.222222222], [4, 7.777777778], [5, 12.77777778], [6, 16.11111111], [7, 17.77777778], [8, 17.77777778], [9, 16.11111111], [10, 12.22222222], [11, 7.777777778]...

>   

>    display(plot(aladata,style=point),plot(f(c,t),t=1..12,color=grey),title="Pariisin alimpiin lämpötiloihin sovitettu trig. polynomi");

[Maple Plot]

Pahoittelut:  Harjoituksissa (to) esitin matriisin rakentamisen taululla ihan asiallisesti, mutta sen rakentaminen Maplella

meni vikaan, koska ykkössarakkeen sijaan otin epähuomiossa kuukausisarakkeen (1..12). (Näppäimistön äärellä

pääsi unohtumaan se, mitä pitikään rakentaa.)

Kuvat eivät sitten onnistuneet. Valitan joidenkin kohdalla hukkaan mennyttä aikaa.

6.

>    restart:

Warning, the name changecoords has been redefined

>    vasen:=m*diff(y(t),t,t)+c*diff(y(t),t)+k*y(t);

vasen := m*diff(y(t),`$`(t,2))+c*diff(y(t),t)+k*y(t)

>    HY:=vasen=0;

HY := m*diff(y(t),`$`(t,2))+c*diff(y(t),t)+k*y(t) = 0

>    EHY:=vasen=r;

EHY := m*diff(y(t),`$`(t,2))+c*diff(y(t),t)+k*y(t) = r

>    m:=2: k:=2: c:=1:

Lasketaan muutakin kuin "steady state". Olkoon tämä teoriaa kertaava ja täydentävä esimerkkiratkaisu.

1) HY:n yleinen ratkaisu:

>    HY;

2*diff(y(t),`$`(t,2))+diff(y(t),t)+2*y(t) = 0

>    karyht:=2*lambda^2+lambda+2=0;

karyht := 2*lambda^2+lambda+2 = 0

>    lam:=solve(karyht,lambda);

lam := -1/4+1/4*I*15^(1/2), -1/4-1/4*I*15^(1/2)

>    alpha:=Re(lam[1]); beta:=abs(Im(lam[1])); # abs vain siksi, että Maple voi saada päähänsä vaihtaa lam-jonon alkioiden järjestystä eri ajokerroilla.

alpha := -1/4

beta := 1/4*15^(1/2)

HY:n yleinen on siis:

>    yh:=exp(alpha*t)*(A*cos(beta*t)+B*sin(beta*t));

yh := exp(-1/4*t)*(A*cos(1/4*15^(1/2)*t)+B*sin(1/4*15^(1/2)*t))

Siinä se komeilee! Vakiot A ja B määräytyvät alkuehdoista. Mutta, alkuehtoja ei sovelleta HY:öön,  kun yhtälömme  

on EHY . (Jos kyse olisi vapaasta, siis ilman ulkoista voimaa olevasta värähtelystä, niin silloin (ja vain silloin)...)

Joka tapauksessa, olivatpa alkuehdoista saatavat vakiot A ja B mitä tahansa, niin y[h](t)  --> 0, kun t --> infinity .

Siksi  yh:ta sanotaan transientiksi, se edustaa nopeasti nitisyvää alkuvaihetta, joka siis negatiiviseksponenttisen exp-

funktion ansiosta pian kuolee pois.

Katsotaan, miten Maplen dsolve - komentoa käytettäisiin:

>    HY;

2*diff(y(t),`$`(t,2))+diff(y(t),t)+2*y(t) = 0

>    dsolve(HY,y(t));

y(t) = _C1*exp(-1/4*t)*sin(1/4*15^(1/2)*t)+_C2*exp(-1/4*t)*cos(1/4*15^(1/2)*t)

2. EHY:n erikoinen:

>    r:=3*cos(3*t)-2*sin(3*t):

Koska ulkoisen voiman (herätteen) taajuus ei yhdy HY:n ratkaisun taajuuteen, niin "teoriasta" tiedämme jo etukäteen,

että samantaajuinen sin/cos-värähtely johtaa tulokseen. Ts. alla oleva yrite toimii.

>    yp:=a*cos(3*t)+b*sin(3*t);

yp := a*cos(3*t)+b*sin(3*t)

>    vasen;

2*diff(y(t),`$`(t,2))+diff(y(t),t)+2*y(t)

>    yriteyhtalo:=eval(subs(y(t)=yp,vasen))=r;

yriteyhtalo := -16*a*cos(3*t)-16*b*sin(3*t)-3*a*sin(3*t)+3*b*cos(3*t) = 3*cos(3*t)-2*sin(3*t)

>    vas:=lhs(yriteyhtalo): oik:=rhs(yriteyhtalo):

cos-termien kertoimet samat, sin-termien kertoimet samat:

>    kerroinyhtalot:=coeff(vas,cos(3*t))=coeff(oik,cos(3*t)),coeff(vas,sin(3*t))=coeff(oik,sin(3*t));

kerroinyhtalot := -16*a+3*b = 3, -16*b-3*a = -2

>    ab:=solve({kerroinyhtalot},{a,b});

ab := {b = 41/265, a = -42/265}

>    yp:=subs(ab,yp);

yp := -42/265*cos(3*t)+41/265*sin(3*t)

Tätä kutsutaan tasapainotilaratkaisuksi ("steady state") , pitkällä aikavälillä yhtälön ratkaisu on hyvin tarkkaan tämä

(mitä suurempi t, sen tarkempi), alkuarvoista riippumatta.

Kirjoitetaan muotoon: Vaihekulma ja amplitudi.

>    C:=sqrt(a^2+b^2);

C := (a^2+b^2)^(1/2)

>    assign(ab): C;

1/265*13^(1/2)*265^(1/2)

>    delta:=arctan(b,a);

delta := -arctan(41/42)+Pi

>    C:=evalf(C); delta:=evalf(delta);

C := .2214872542

delta := 2.368242100

>    yss:=C*cos(3*t-delta);

yss := .2214872542*cos(3*t-2.368242100)

Alkuehdot:

Muutetaan ratkaisulauseke funktioiksi, jotta alkuehdot olisi kätevä muodostaa.

>    Y:=unapply(yh+yp,t);

Y := proc (t) options operator, arrow; exp(-1/4*t)*(A*cos(1/4*15^(1/2)*t)+B*sin(1/4*15^(1/2)*t))-42/265*cos(3*t)+41/265*sin(3*t) end proc

>    solve({Y(0)=1,D(Y)(0)=0},{A,B});

{A = 307/265, B = -37/795*15^(1/2)}

>    assign(%);

>    Y(t);

exp(-1/4*t)*(307/265*cos(1/4*15^(1/2)*t)-37/795*15^(1/2)*sin(1/4*15^(1/2)*t))-42/265*cos(3*t)+41/265*sin(3*t)

>   

>    Y(0);D(Y)(0);

1

0

>    plot([r,Y(t),yp],t=0..15,color=[red,green,blue],title="Vaimennettu pakkovärähtely",legend=["Heräte (r(t))","Vaste (Y=yh+yp)","Tasapainotila (yp)"]);

[Maple Plot]

>    plot([r,Y(t),yp],t=0..15,color=[red,green,blue],legend=[p,g,oo]);

[Maple Plot]

>