AtvirkstineMatrica.wxmx / Atvirkštinė matrica A.Domarkas, VU, Teoriją žr. [], 8-; []. Figure : Toliau pateiksime atvirkštinės matricos apskaičiavimo būdus su CAS Maxima. su komanda invert pavyzdys. [], 8 psl. Rasime maticos A atvirkštinę matricą. (%i) kill(all)$ reset()$ (%i) A:matrix([,-,],[-,,],[,,]); (%o) (%i) invert(a); 7 (%o) arba (%i4) A^^(-); 7 (%o4) Netinka A^(-), nes randa visų elementų atvirkštinius:
AtvirkstineMatrica.wxmx / (%i) A^(-); (%o) pagal formulę su prijungtine matrica Randame matricos determinantą ir prijungtinę adjunktų matricą. Tada A^^(-) =adjoint(a)/determinant(a). Prijungtinė matricos A matrica randama su komanda "adjoint": (%i) Ad:adjoint(A); (%o) 7 7 (%i7) d:determinant(a); (%o7) (%i8) Ad/d; 7 (%o8) Gauso metodas Žr. [], 8-8. Sudarome matricą C, prie matricos A dešinėje pusėje prijungiant vienetinę matricą: (%i) matrix ([A, ident()])$ C:mat_unblocker (%); (%o) Elementariųjų pertvarkių pagalba reikia matricą C pertvarkyti taip, kad kairėje pusėje gautųsi vienetinė matrica. Tada dešinėje pusėje bus ieškomoji vienetinė matrica. Čia elementariaisiais veiksmais laikome, kai matricos eilutė pakeičiama jos ir kitos eilutės, padaugintos iš realaus skaičiaus, skirtumu; dvi eilutės sukeičiamos vietomis; eilutė padauginama iš nenulinio skaičiaus. Naudosime komandą rowop(a, i, j, k), kuri iš matricos A i-osios eilutės atima j-ąją eilutę, padaugintą iš skaičiaus k. Komanda rowswap (A, i, j) matricoje A sukeičia i-ją ir j-ją eilutes. Komandos eilutės dauginamui iš skaičiaus nėra, tačiau nesunku tokią komandą apibrėžti patiems: (%i) rowmul(a,i,k):=expand(rowop(a,i,i,-k+)); (%o) rowmul( A,i,k):=expand( rowop( A,i,i, k+)) Komanda rowmul(a,i,k) matricos A i-ją eilutę padaugina iš skaičiaus k.
AtvirkstineMatrica.wxmx / (%i) rowmul(c,,-); (%o) (%i) rowswap(%,,); (%o) (%i4) rowop(%,,,); (%o4) (%i) rowop(%,,,); (%o) 7 (%i) rowop(%,,,); (%o) (%i7) rowop(%,,,-); (%o7) 7 (%i8) rowop(%,,,); (%o8) 7 (%i) rowmul(%,,); (%o) (%i) rowop(%,,,-7); (%o) (%i) rowmul(%,,); (%o) 78 78
AtvirkstineMatrica.wxmx 4 / (%i) rowop(%,,,-); (%o) 7 (%i) rowmul(%,,/); (%o) 7 (%i4) rowmul(%,,/); (%o4) 7 (%i) rowmul(%,,-/); 7 (%o) (%i) B:submatrix(%,,,); 7 (%o) Gavome atvirkštinę matricą. Patikriname: (%i7) A.B; B.A; (%o7) (%o8) Rankiniu būdu atlikti šiuo veiksmus užtruko per ilgai. Tą patį greitai galima atlikti, naudojantis ciklo operatoriais: (%i) n:length(a); (%o) (%i) r:c$ for k: thru n- do for i:k+ thru n do r:rowop(r,i,k,r[i,k]/r[k,k]); (%o) done
AtvirkstineMatrica.wxmx / (%i) r; (%o) (%i) for k:n thru step - do for i:k- thru step - do r:rowop(r,i,k,r[i,k]/r[k,k]); (%o) done (%i4) r; 7 (%o4) (%i) for i thru n do r:rowmul(r,i,/r[i,i]); (%o) done (%i) r; 7 (%o) (%i7) B:submatrix(r,,,); 7 (%o7) Patikrinimui randame atvirkštinę su invert: (%i8) invert(a); 7 (%o8) Jei gautume dalybą iš, tai šiam atvejui reikėtų patobulinti kodą. 4 Niutono metodas 4. Atvirkštinio skaičiaus radimas Niutono metodu (%i) kill(all)$ Naudojant Niutono metodą skaičių dalybą galima pakeisti daugyba.
AtvirkstineMatrica.wxmx / Niutono metode lygties f(x)= šaknis randama naudojant iteracinį procesą x[n+] = x[n] - f(x[n])/f'(x[n]). Kai f(x) = /x - c, gauname (%i) f(x):=/x-c; (%o) f( x ):= x c Ñ (%i) x[n+]=x[n]-at(f(x)/diff(f(x),x),x=x[n]); (%o) x n + = c x n +x x n n Gavome rekurentinę formulę: (%i) expand(%); (%o) x n + = x n cx n Iteracijoms apskaičiuoti apibrėžiame komandą "iter" : (%i4) iter(x):=*x-c*x^; (%o4) iter( x ):= x cx Pavyzdžiui, apskaičiuosime /pi. Niutono metodu spręsime lygtį /x - pi =. (%i) numer:true$ fpprintprec:$ (%i7) c:%pi; (%o7).44 (%i8) iter(.); (%o8).7 (%i) iter(%); (%o).84 (%i) iter(%); (%o).888 (%i) iter(%); (%o).888 (%i) iter(%); (%o).888 Rezultato patikrinimui apskaičiuojame tiesiogiai (%i) /%pi; (%o).888 4. Atvirkštinė matrica Niutono metodu Didesnių dimensijų atvirkštinių matricų skaičiavimui simboliniai metodai nebetinka. Todėl tam reikia turėti greitesnius skaitinius metodus. Toliau dėstomą metodą galima laikyti hibridiniu skaitiniu-simboliniu metodu. Eilėje uždavinių naudinga turėti grubų pradinį atvirkštinės matricos artinį. Tam gali būti panaudojamas Niutono metodas. Apibendrindami praeitą skaičiavimą matricoms užrašome komandą (%i4) iter(x):=*x-x.a.x; (%o4) iter( X ):= X X. A. X pavyzdys.
AtvirkstineMatrica.wxmx 7 / (%i) A:matrix([,-],[,]); (%o) Pradinę iteraciją imsime A = transpose(a)* epsilon. Darbe [], p. 8, nurodyta, kad esant pakankamai mažam epsilon, iteracinis procesas konverguoja. Be to, reikėtų imti epsilon < (mat_norm(a,inf)*mat_norm(transpose(a),inf))^(-). (%i) (mat_norm(a,inf)*mat_norm(transpose(a),inf))^(-); (%o). (%i7) A:transpose(A)*.; (%o7).... iteracija (%i8) iter(a); (%o8).... iteracija (%i) iter(%); (%o).8.7.7. iteracija (%i) iter(%); (%o).884.44.44.447 4 iteracija (%i) iter(%); (%o).87474.484777.484777.484 iteracija (%i) iter(%); (%o).87487.48748.48748.48748 iteracija (%i) iter(%); (%o).87487.4874.4874.48748 7 iteracija (%i4) iter(%); (%o4).87487.4874.4874.48748
AtvirkstineMatrica.wxmx 8 / Matome, kad iteracijos pradėjo kartotis. Patikrinimui apskaičiuojame (%i) invert(a),numer; (%o).87487.4874.4874.48748 Dabar tai užrašome su ciklu (%i) X:A$ for k thru do X:iter(X); (%o7) done (%i8) X; (%o8).87487.4874.4874.48748 Dabar tai užrašome su ciklu su ciklo pabaigos tikrinimo sąlyga (%i) X:A$ for k while mat_norm(x-iter(x),inf)>^- do X:iter(X); (%o) done (%i) X; (%o).87487.4874.4874.48748 Dabar tai užrašome su ciklu su ciklo pabaigos tikrinimo sąlygai ir iteracijų skaičiumi: (%i) X:transpose(A)*.$ m:$ for k while mat_norm(x-iter(x),inf)>^- do (X:iter(X),m:m+)$ (%i) print("iteraciju skaicius:")$ m; Iteraciju skaicius: (%o) (%i7) print("atvirkstine matrica:")$ X; Atvirkstine matrica: (%o8).87487.4874.4874.48748 Skaičiavimą galite modifikuoti pagal savo norą. Siūlau dar pabandyti tokiais būdais: išvedant tarpines iteracijas; išvedant paklaidas; sudarant vieną komandą, kuri Niutono metodu randa atvirkštinę matricą; įdedant iteracijų skaičiaus apribojimą pavyzdys (%i) A:matrix([,-,],[-,,],[,,]); (%o) (%i4) (mat_norm(a,inf)*mat_norm(transpose(a),inf))^(-); (%o4).44
AtvirkstineMatrica.wxmx / (%i4) X:transpose(A)*.$ m:$ for k while mat_norm(x-iter(x),inf)>^- do (X:iter(X),m:m+)$ (%i44) print("iteraciju skaicius:")$ m; Iteraciju skaicius: (%o4) (%i4) print("atvirkstine matrica:")$ X; Atvirkstine matrica:.74877.44.44 (%o47).4874.88.88... Patikrinimui randame (%i48) invert(a);.74877 (%o48).4874..44.88..44.88. Pavyzdys. Rasime -os eilės atsitiktinės matricos atvirkštinę. (%i4) kill(h)$ h[i,j]:=random(); (%o) h i,j :=random( ) (%i) iter(x):=*x-x.a.x; (%o) iter( X ):= X X. A. X (%i) A:genmatrix(h,,); 4 4 4 8 8 4 4 8 4 44 7 7 4 4 (%o) 8 8 7 78 4 44 4 8 7 8 47 7 8 4 8 8 8 7 87 7 4 88 7 8 7 8 44 (%i) epsilon:(mat_norm(a,inf)*mat_norm(transpose(a),inf))^(-); (%o).8748778 (%i4) X:transpose(A)*epsilon$ m:$ for k while mat_norm(x-iter(x),inf)>^- do (X:iter(X),m:m+)$ (%i7) print("iteraciju skaicius:")$ m; Iteraciju skaicius: (%o8) 8 Atvirkštinės matricos X neišvedame, tik patikriname taip:
AtvirkstineMatrica.wxmx / (%i) round(a.x); (%o) Niutono metodo apibendrinimus ir eksperimentus su Mathematica žr. [4]. Kitus atvirkštinės matricos skaičiavimo būdus rasite [], [] ir [4]. Pabaigai, patikrinkite arba įrodykite teiginį iš [] Figure : Literatūra: [] P.Drungilas, H.Markšaitis, Algebra, I dalis, VU, [] B.Kvedaras, M.Sapagovas, Skaičiavimo metodai, Vilnius, Mintis, 74. [] http://en.wikipedia.org/wiki/invertible_matrix [4] F. Soleymani, A Rapid Numerical Algorithm to Compute Matrix Inversion, International Journal of Mathematics and Mathematical Sciences, Volume (), Article ID 4, pages, http://dx.doi.org/.//4 [] Numerical Recipes in C, Cambridge University Press, [] D.S. Bernstein, Matrix mathematics, Princeton University Press,