LU分解法で方程式を解く
方程式を LU分解法 (decomposition) で解くことにします。
元連立一次方程式(system of linear equation)の係数行列 A の階数(rank)が n で、正則(nonsingular)である場合には、係数行列 A を下三角行列 L と上三角行列 U の積に分解できます。
連立一次方程式 分解を行う段階で対角要素、 が0になる場合や非常に小さな絶対値を持つことがあります。このような場合には演算不能や大きな誤差を生じる恐れがあるので、これを防止するためにピボット操作を行います。ピボット操作には、行または列を入れ替えて行う部分ピボットティングと、行と列を入れ替えて行う完全ボットティングがあります。ピボット操作については、他書を参考にして下さい。
3行3列の行列を解いてみることにします、Aは係数行列です。
Ax=b
の形式です。根本的には x=inv(A)b でxを求めることになります。
プログラマは以下のようになります。
1. //function [L,U] = ludecomp(A)
2. // LU decomposition
3. // A: matrix to decompose
4. // L: lower triangular matrix
5. // U: upper triangular matrix
6. A=[2 1 1 ; 2 3 1 ; 1 1 3]
7. B=[ 2 4 -1]’
8. [n,n] = size(A);
9. toler = 10^(-9);
10. L = zeros(n,n);
11. U = zeros(n,n);
12. for i=1:n-1
13. if abs(A(i,i))< toler 14. disp('The pivot is too small') 15. else 16. aii= 1 / A(i,i); 17. for j=i+1:n 18. aji = - A(j,i) * aii; 19. A(j,i+1:n) = A(j,i+1:n) + aji * A(i,i+1:n); // 下三角行列 20. end 21. A(i,i+1:n) = aii * A(i,i+1:n); // 上三角行列 22. end 23. end 24. for i=1:n-1 25. L(i,1:i) = A(i,1:i); 26. U(i,i+1:n) = A(i,i+1:n); U(i,i) = 1; 27. end 28. U(n,n) = 1; L(n,1:n) = A(n,1:n); 29. // end of lu decomp 30. y(1) = B(1)/L(1,1); 31. for i=2:n 32. B1 = 0; 33. for k=1:i-1 34. B1=B1+L(i,k)*y(k); 35. nd 36. y(i)= (B(i)-B1)/L(i,i); 37. end 38. x(n) = y(n) /U(n,n); 39. for i=n-1:-1:1 40. y1 = 0; 41. for k=i+1:n 42. y1=y1+U(i,k)*x(k); 43. end 44. x(i)= (y(i)-y1); 45. end 46. x
方程式の解xの値は下のようになります。
–>x =
1.
1.
– 1.
SciNotesに1~46行までを記入して実行すると解が得られます。46行はxの値を表示しています。
行列AとBの数値を変えて実行すると、ある程度の大きさの方程式を解くことができます。本プログラムが、実際に実行したリストを載せておりますので会が得られるはずです。
解が得られない場合には、しっかりとディバックしてみて下さい。
方程式と解くための離散化するためのアルゴリズムは、割愛させていただきました。
他書を参考にしてプログラムと照らし合わせてみて下さい。
関連記事
-
行列をコレスキー分解をする|scilab入門
正定値対称行列を持つ連立一次方程式 Ax=b の場合にガウスの消去法の他にコレス …
-
階乗 prod|scilab入門
階乗の計算には prod を使用します。 例えば 1から10までの階乗を計算する …
-
円周率 π を表す|scilab入門
円周率 π を表す場合には、パーセントの後にpiとし %pi のように表記しま …
-
3次スプライン補間 splin について!
計測したデータを補間して表示させたい場合には、3次スプライン補間 splinを用 …
-
多項式を用いた線形システムの定義 syslin
多項式による伝達関数や線形すステムの定義は、syslinを用いて定義できます。 …
-
2次元プロットにグリッドを追加:xgrid|グラフィック
グラフのデータを比較したいとか、見やすくしたい場合には、グリッドを入れて表示させ …
-
多項式による定義 poly
多項式の計算について。 Silabでは多項式と有理式を定義できます。また、有理式 …
-
ifによる分岐と関係演算子・論理演算子
繰り返し処理に if による分岐と関係演算子・論理演算子 を用いることにします。 …
-
行列演算の基礎計算 |scilab入門
行列演算はScilabの基本となっています。行列を用いることにより数式レベルで扱 …
-
行列に関係演算子を用いた計算とは|scilab入門
行列の要素ごとに関係演算子を適用して無ることにします。 次のような記号を関係演算 …