Lineaarialgebra a, kevät 2018 Harjoitusta 3, ratkaisuista with(linalg); (1) Tehtävä 1. Nuukailua ja merkintöjä A := matrix([[4,-2,-2,3], [5,2,5,2], [6,1,3,4], [1,-2,3,8], [2,-4,5,2]]): B := matrix([[1,2], [3,-3], [2,7], [5,2]]): C := matrix([[3,2,5], [2,-3,1]]): print(a,b,c); (1.1) Tarvitaan A:sta 2. rivi, koko B ja C:stä 3. sarake, tämä voidaan tehdä kahdella tavalla: a) (A(2, :) B) C(:, 3) tai b) A(2, :) ( B C(:, 3)), Maplessa näin eka := evalm(row(a,2)) &* evalm(b) &* evalm(col(c,3)); evalm (eka); # &* on matriisien kertominen dyadisena 198 (1.2) toka := evalm(row(a,2)) &* (evalm(b) &* evalm(col(c,3))); evalm(toka);
b) toka tulo ensin: yhteenlaskuja ja kertolaskuja: [4*1*1 + 1*3*1, 4*2*1 + 1*4*1]; 198 Tarvitaan tarkasti ottaen eri määrät laskutoimituksia laskettaessa eka tulo ensin tai toinen tulo ensin: Kerrottaessa m x n kertaa n x r on mnr kertolaskua ja m(n-1)r yhteenlaskua, joten a) eka tulo ensin: yhteenlaskuja ja kertolaskuja kpl (tässä listana) [1*3*2 + 1*1*1, 1*4*2 + 1*2*1]; Siis eka tulo ensin on parempi. Erona on se, että kohdassa a) kerrotaan matriisin B sarakkeita, kohdassa b) kerrotaan matriisin B riveillä. Lopuksi: Tarkastus suoraan brutaalisti: evalm(a &* B&* C)[2,3]; 198 (1.3) (1.4) (1.5) (1.6) Tehtävä 2. Symmetrisyyden ja yläkolmio-ominaisuuden säilyminen restart; with(linalg): a) Testataan symmetrisyysosaa vaikkapa satunnaismatriiseilla A := randmatrix(2,2,symmetric): B := randmatrix(2,2, symmetric): print(a,b); (2.1) evalm(a &* B); # tulo symmetrinen? (2.2) Siis edes 2 x 2-matriiseille ei pidä paikkaansa. VASTAUS: EI. Toki voidaan konstruoida sopivat yksinkertaisemmatkin symmetriset matriisit, joiden tulo ei ole symmetrinen. Muodostetaan vaikkapa ensin matriisi, joka halutaan tulokseksi, esimerkiksi eisymmetrinen C := matrix([[0,1],[0,0]]); (2.3) Sitten valitaan symmetriset matriisit A ja B, joiden tulo on C: A := matrix([ [0,1], [1,0]]): # vaihtaa vasemmalta kertoessa toisen matriisin
rivit! B := matrix([ [0,0], [0,1]]): print(a, B, multiply(a,b)); # A &* B = C (2.4) b) Testataan mielivaltaisilla 4x4-yläkolmiomatriiseilla (huomaa "mielivaltaisen" yläkolmiomatriisin määrittelytapa!) restart; with(linalg): A := matrix(4,4,(i,j) - if (ij) then 0 else a[i,j] fi): B := matrix(4,4,(i,j) - if (ij) then 0 else b[i,j] fi): print(a,b); (2.5) evalm(a &*B); (2.6) Esimerkin perusteella näyttäisi vastaus saattavan olla myönteinen. Kannattaa siis aloittaa todistuksen pohtiminen: 1. Mikä erottaa alakolmioalkion muista matriisissa C = AB? Rivi-indeksi on suurempi kuin sarakeindeksi, eli alkiot ovat, missä. 2. Miten määräytyy tulossa C = AB alkio, joka on alakolmiossa? Vastaus: pistetulona, esim. row(a,3) &* col(b,2) = evalm(row(a,3) &* col(b,2)); # missä siis i k (tässä 3 2) (2.7) 3. Mikä siis vie tulomatriisissa alakolmion nollaksi? Riittää näyttää, että arvoilla pistetulot ovat nollia. Mutta alussa luvut ovat nollia niin kauas (diagonaalille asti), että loppupuolen luvut ovat nollia (heti diagonaalialkiosta eteenpäin); pistetulossa siis kaikki yhteenlaskettavat ovat nollia.
Tehtävä 3. Matriisien ja ominaisuuksia restart; with(linalg): Testataan aluksi symmetrisyyttä erikoistapauksessa 2 x 3: alkiot := x - ((i,j) - x[i,j]); (3.1) A := matrix(2,3,alkiot(a)): print(a); (3.2) AAT:=evalm(A &* transpose(a));ata:=evalm(transpose(a) &* A); (3.3) equal(aat, transpose(aat)),equal(ata, transpose(ata)); (3.4) Kokeilumme vaikuttaa siis viittaavan siihen, että väite olisi totta. Mitenkäs todistetaan? Näyttämällä transpoosin laskusääntöjen avulla, että ja ovat molemmat itsensä transpooseja, ts. toteuttavat symmetrisyysehdon. Malliksi eka: = =. Perustele! (Lauseen 3.3.1 tietyillä kohdilla) Tehtävä 4. Laskutoimitusten määristä restart; with(linalg): a) Yhteen- ja kertolaskuja: a := factor([m*(n-1)*r + m*(r-1)*1, m*n*r + m*r*1]); b) Yhteen- ja kertolaskuja: b := factor([n*(r-1)*1 + m*(n-1)*1, n*r*1 + m*n*1]); c) Tapaukset m = n = r = 10, 50 ja 100 ja a) vastaan b) matrix(3,5, [ 10,op(subs({m= 10,n= 10,r= 10},[op(a),op(b)])), 50,op(subs({m= 50,n= 50,r= 50},[op(a),op(b)])), 100,op(subs({m=100,n=100,r=100},[op(a),op(b)]))]); (4.1) (4.2) (4.3)
(4.3) Osassa seuraavista on temppuiltu Maplella, eikä sittenkään kaikilta osin ole saatu vastauksia ideaalisessa muodossa; lukijalle jää vielä "tulkintatyötä". Tehtävä 5. Lisää laskutoimitusten määristä restart; with(linalg): a) Tavat ryhmitellä suluilla ovat: T1. ((Ax) )B, joissa tarvittujen kertolaskuja määrät ovat alla T2. (Ax)( B) T3. A(x )B T4. A(x( B)) T1 := n*n*1 + n*1*n + n*n*n: T2 := n*n*1 + 1*n*n + n*1*n: T3 := n*1*n + n*n*n + n*n*n: T4 := 1*n*n + n*1*n + n*n*n: matrix(4,2,[1,t1,2,t2,3,t3,4,t4]) = map(factor, matrix(4,2, [1,T1,2,T2,3,T3,4,T4])); (5.1) b) Toinen edullisin, sillä laskutoimitusten määrä on verrannollinen dimensioiden neliöön, kun taas kolmas on huonoin, sillä laskutoimitusten määrä on verrannollinen kuutioon. Tämä näkyy hyvin seuraavista: c) Tapaukset n = 10, 50 ja 100 matrix(3,5, [10,op(subs({n = 10},[T1,T2,T3,T4])), 50,op(subs({n = 50},[T1,T2,T3,T4])), 100,op(subs({n =100},[T1,T2,T3,T4]))]); (5.2) Tehtävä 6. Gauss-Jordanin reduktion matriisiversiolla restart; with(linalg): Muunnetaan yhtälöryhmä Ax = b laajennettuun matriisimuotoon: A := matrix([[0,1,-3,2],[1,-1,2,3],[2,2,1,2]]); # kerroinmatriisi b := vector([2,4,2]); # tunnettu pystyvektori
(6.1) Maplessa laajennettu matriisi tehdään niin, että viimeiseksi sarakkeeksi tulee tuo vektori b: LA := augment(a,b); (6.2) Matriisien alkeisoperaatioilla LA redusoituun porrasmuotoon: Tässä % viittaa viimeksi laskettuun tulokseen, ja jos menee vikaan, kannattaa aloittaa uudestaan tuosta LA:n määrittelystä! swaprow(%,1,2); # vaihdetaan 1. ja 2. rivi (6.3) addrow(%,1,3,-2); # %:ssa 1. rivi 3:nteen (-2)-kertaisena (6.4) addrow(%,2,3,-4); (6.5) mulrow(%,1,1): mulrow(%,2,1): mulrow(%,3,1/9); # skaalataan porrasmuotoon (6.6) addrow(%,3,1,-2); addrow(%,3,2,3); # 3. rivi tukena
(6.7) U := addrow(%,2,1,1); # 2. rivi tukena, nimetään U:ksi jatkoa varten (6.8) Tämä on jo redusoitu porrasmuoto, josta ratkaisut saadaan helposti takaisinsijoituksella. Tässä temppuilemme kuitenkin Maplella mallin vuoksi: muunnetaan takaisin yhtälöryhmäksi käskyllä geneqns (generate equations), jonka syntaksi on geneqns(m, x, d), missä M = kerroinmatriisi, x haluttujen tuntemattomien nimet ja d tunnettu vektori. Poimitaan nyt siis tunnetuksi vektoriksi d matriisin U viimeinen sarake ja kerroinmatriisiksi muu osa: d := col(u,5); # d:ksi U(:,5) (6.9) M := submatrix(u, 1..3, 1..4); # M:ksi U(:,1:4) (6.10) geneqns(m, x, d); (6.11) Nähdään helposti edeltä, että : on vapaa, muut johtavia, ja ne voidaan ratkaista ja vielä sijoittaa ratkaisu := solve(%,{x[1], x[2], x[3]}); (6.12) subs(x[4] = t, ratkaisu); (6.13)
Tästä ratkaisut :, t in R. Tehtävä 7. Suoran yhtälön vektori, parametri- ja koordinaattimuodot restart; with(linalg): p := vector([5,3,-2]): q := vector([6,-2,3]): print(p,q); (7.1) r := evalm(p) + t*evalm((q-p)); # vektorimuoto: [x[1],x[2],x[3]] = evalm(r); # parametrimuoto vektoriyhtälönä: r := evalm(r): seq(solve(r[i] = x[i],t), i = 1..3); # t ratkaistuna kustakin, koordinaattimuoto: merkitään samoiksi (Maplessa ei voi oikein kaksoisyhtälöitä kirjoittaa) (7.2) (7.3) (7.4) Tehtävä 8. Yhtälöryhmä suoran ja tason leikkauspisteen laskemista varten restart; with(linalg): Nyt pitää hokata, että vaikka ilmaistaessa suora ja taso erikseen, voidaan käyttää samoja parametreja, mutta silloin kun niistä muodostetaan yhtälö, niin s olisi pidettävä eri roolissa kummassakin tapauksessa. Tämähän on käytännössä mahdotonta, kun aletaan laskea! Kuitenkin sekä suoralla että tasossa pitäisi pystyä liikkumaan parametrien avulla toisistaan riippumatta, mutta jos molemmissa on s, niin liikkumalla suoralla luku s muuttuu ja samalla piste tasollakin muuttuu! Vaihdetaan siis suoran parametriksi u: r := vector([6,-5,2]) + u*vector([4,-2,3]); x := vector([4,3,2]) + s*vector([4,-3,2]) + t*vector([-6,2, -3]); (8.1) Nyt muodostetaan yhtälö r(u) = x(s,t) ja siitä koordinaateittain yhtälöryhmä. Maplessa on lisäpaketti student, jossa on joitain hyödyllisiä lisäkäskyjä kuten equate (pistä samoiksi, hajota yhtälöiksi); ladataan sekin vielä with(student); (8.2) equate(r,x); # kysytyn yhtälöryhmän eräs muoto (8.3)
(8.3) Huomaa, että emme tässä (Maplessa siis) ole yllä määritelleet symboleja r ja x funktioiksi, joten emme voi oikeasti käyttää merkintöjä r(u) ja x(s,t)! Voimme kuitenkin temppuilla kaikki tuntemattomat samalle puolelle näin (mutta vakiotkin menee samalla): yhtalot := equate(x-r, vector([0,0,0])); # kysytyn yhtälöryhmän toinen muoto (8.4) param := solve(yhtalot, {u,s,t}); (8.5) Nyt tämä vastaus on sopivassa muodossa sijoituskäskylle subs evalm(subs(param,r)), evalm(subs(param,x)); # Sama piste saadaan suoralla ja tasossa! (8.6)