triistr.wxmx / Triįstrižainių lygčių sistemų sprendimas A.Domarkas, VU, Teoriją žr. []; [], 7-7; []. Pradžioje naudosime Gauso algoritmą, kuriame po įstrižaine daromi nuliai. Po to grįždami į viršų virš įstrizainės taip pat gauname nulius. Gauname sistemą su diagonaline matrica iš kurios lengvai užrašome sprendinius. Tam prireiks n- veiksmų su eilutėmis. Kadangi eilutėse yra daug nulių, tai daug kartų teks atlikti veiksmus su nuliais. Vadovėlyje [] rašoma, kad triįstrižainė sistema išsprendžiama maždaug kartų greičiau negu Gauso metodu. Pabandysime patikrinti tai. Naudosime komandą rowop(a, i, j, k), kuri iš matricos A i-osios eilutės atima j-ąją eilutę, padaugintą iš skaičiaus k. Išspręskime testinį uždavinį iš []: Figure : Užrašysime tokių matricų generavimo metodą, kuris tiks bet kuriam n. (%i) h[i,j]:=if i=j then elseif abs(i-j)= then / else $ (%i) M:genmatrix(h,,); (%o) (%i) A:addcol(M,[,,,/]); (%o) Gautoji matrica A yra lygčių sistemos išplėstinė matrica. (%i) makelist(sum(a[j,i]*x[i],i,,)=a[j,], j,, ); (%o) [ x + x =,x + x + x =,x + x + x =, x + x = ] (%i) solve(%); (%o) [[x =,x =,x =,x =]] Darome nulius po įstrižaine:
triistr.wxmx / (%i) A:rowop(A,,,A[,]/A[,]); (%o) (%i7) A:rowop(A,,,A[,]/A[,]); (%o7) (%i) A:rowop(A,,, A[,]/A[,]); (%o) virš įstrižainės: (%i) A:rowop(A,,, A[,]/A[,]); (%o) (%i) A:rowop(A,,, A[,]/A[,]); (%o)
triistr.wxmx / (%i) A:rowop(A,,, A[,]/A[,]); (%o) Gauname sprendinį: (%i) sol:makelist(a[k,]/a[k,k],k,,); (%o) [,,,] Patikriname: (%i) M.sol; (%o) Šį sprendimo būdą nesunku užrašyti su ciklo sakiniais. (%i) A:addcol(M,[,,,/]); (%o) (%i) n:matrix_size(a)[]; (%o) (%i) for k thru n- do A:rowop(A,k+,k,A[k+,k]/A[k,k])$ for k thru n- do A:rowop(A,n-k,n+-k, A[n-k,n+-k]/A[n+-k,n+-k])$ sol:makelist(a[k,n+]/a[k,k],k,,n); (%o) [,,,] Dabar išbandysime sprendimą su lygčių. (%i) n:$ (%i) h[i,j]:=if i=j then elseif i-j= then / elseif j-i= then / else $ (%i) M:genmatrix(h,n,n)$ (%i) d:makelist(random(),k,,n)$ (%i) A:addcol(M,d)$ (%i) fpprintprec:$
triistr.wxmx / (%i) if showtime#false then showtime:false else showtime:all$ Evaluation took. seconds (. elapsed) using bytes. (%i) for k thru n- do A:rowop(A,k+,k,A[k+,k]/A[k,k])$ for k thru n- do A:rowop(A,n-k,n+-k, A[n-k,n+-k]/A[n+-k,n+-k])$ sol:makelist(a[k,n+]/a[k,k],k,,n),numer$ Evaluation took 7. seconds (. elapsed) using 7.7 MB. Evaluation took 7.7 seconds (7.7 elapsed) using. MB. Evaluation took. seconds (. elapsed) using. MB. Matote sprendimo laiką. Su nauju spartesniu ir daugiau atminties turinčiu kompiuteriu rezultai turi būti geresni, bet tai daugiau priklauso nuo sprendimo metodo. Dabar skaičiuojame perkelties metodu (žr. [], p. 7) (%i) numer:true$ Evaluation took. seconds (. elapsed) using bytes. (%i) [a,b,c]:[/,,/]$ Evaluation took. seconds (. elapsed) using bytes. d[i] yra dešiniosios pusės elementai, tie patys kaip ir Gauso metode. (%i) [C[],D[]]:[-c/b,d[]/b]$ for i: thru n do [C[i],D[i]]:[-c/(b+C[i-]*a),(d[i]-D[i-]*a)/(b+C[i-]*a)]$ C[n]:$ for i:n thru step - do x[i]:c[i]*x[i+]+d[i]$ Evaluation took. seconds (. elapsed) using bytes. Evaluation took. seconds (. elapsed) using. MB. Evaluation took. seconds (. elapsed) using bytes. Evaluation took. seconds (. elapsed) using. KB. Matome, kad skaičiavimo laikas sudaro mažą sekundės dalį. Todėl su teiginiu, kad perkelties metodas yra kartų greitesnis už Gauso metodą tenka sutikti. Palyginame pirmuosius sprendinių, gautų abiem metodais. Matome, kad jie sutampa (%i) showtime:false$ (%i) makelist(x[k],k,,); (%o) [.,.,.,.,.77,.,.777,.,.7,.] (%i7) makelist(sol[k],k,,); (%o7) [.,.,.,.,.77,.,.777,.,.7,.] (%i) x[]; (%o). (%i) sol[]; (%o). Perkelties metodas yra realizuotas mano komandoje "solvediag". (%i) kill(all)$ reset()$ fpprintprec:$ ratprint:false$ Triįstrižainių sistemų sprendimiui perkelties metodu([], 7-7) sudarome komandą
triistr.wxmx / (%i) solvediag(a,b,c,d):=block([n,x,a,c,c,d,numer], local(c,d,x), numer:true, n:length(d), if length(b)#n or length(a)#n- or length(c)#n- then error("wrong length of data"), a:cons(,a), c:endcons(,c), [C[],D[]]:[-c[]/b[],d[]/b[]], for i: thru n do [C[i],D[i]]:[-c[i]/(b[i]+C[i-]*a[i]),(d[i]-D[i-]*a[i])/(b[i]+C[i-]*a[i])], C[n]:, for i:n thru step - do x[i]:c[i]*x[i+]+d[i], makelist(x[k],k,,n) )$ Čia naudojami tokie pat pažymėjimai, kaip [], psl. 7. Sąrašas a yra apatinė matricos įstrižainė; sąrašas b yra pagrindinė matricos įstrižainė; sąrašas c yra viršutinė matricos įstrižainė; sąrašas d yra dešinioji sistemos pusė. Turi būti: length(a) = length(c) = n -, lenhth(b) = length(b) = n. Pavyzdys. Naudodamiesi komandą "solvediag" išspręsime testinį uždavinį, nagrinėtą pradžioje. (%i) a:[/, /, /]$ b:[,,, ]$ c:[/, /, /]$ d:[,,,.]$ (%i) solvediag(a,b,c,d); (%o) [.,.,.,.] (%i) ratsimp(%); (%o) [,,,] Daugiau komandos "solvediag" taikymo pavyzdžių rasite failuose KubiniaSplainai.pdf, TriistrizainesSistemos.pdf, Niutono.pdf Užduotys.. Panagrinėkite atvejį, kai kurie pagrindinės įstrižainės elementai yra lygus nuliui, nes šiuo atveju kartais gaunama dalyba iš nulio. Patobulinkite programą šiam atvejui.. Kompiuterinės algebros pagalba raskite čia nagrinėtos matricos n-osios eilės determinantą.. Pavyzdžiui, kai a = [/, /,...], b =[,,...], c = [,,...], tai n-osios eilės determinantas lygus ^(n/)*(sqrt()*sin((%pi*n)/)+cos((%pi*n)/)). (Žr. [], Example..). Pirmuosius determinantus galima patikrinti taip: (%i) kill(all)$ (%i) numer:false$ (%i) h[i,j]:=if i=j then elseif i=j+ then / elseif i=j- then else $ (%i) A(n):= genmatrix(lambda([i,j], h[i,j]), n, n)$
triistr.wxmx / (%i) makelist(a(n),n,,); (%o) [,,,, ] (%i) D(n):=determinant(A(n))$ (%i) makelist(d(k),k,,); (%o) [,,,,, 7,,,, ] (%i7) D(n):=^(n/)*(sqrt()*sin((%pi*n)/)+cos((%pi*n)/)); Ñ Ñ (%o7) D( n ):= n p Ù n Ù n sin +cos / Ñ (%i) makelist(d(k),k,,); (%o) [,,,,, 7,,,,,,7,7,7,,,,,, ] Kaip išvesite šią formulę? Metodą rasite []. Literatūra: [] O.Štikonienė, Skaitinių metodų paskaitos, http://uosis.mif.vu.lt/~olgas/sm/ [] R.Čiegis, V.Būda, Skaičiuojamoji matematika, Vilnius, TEV,7. [] http://en.wikipedia.org/wiki/tridiagonal_matrix_algorithm [] M.E.A. El-Mikkawy, A fast algorithm for evaluating nth order tri-diagonal determinants, Journal of Computational and Applied Mathematics () [] P.Drungilas, H.Markšaitis, Algebra, I dalis, VU,