!ガウス・ジョルダン(Gauss-Jordan)法 N元連立1次方程式(Linear Equations)の解 Ax=b
OPTION ARITHMETIC rational !有理数(分数)
!連立方程式を記述する LET N=3 !変数(元)の数
DATA 2,3, 1, 4 !2*x1 +3*x2 +x3 = 4 DATA 4,1,-3,-2 !4*x1 +x2 -3*x3 = -2 DATA -1,2, 2, 2 ! -x1 +2*x2 +2*x3 = 2
DIM A(N,N+1) !係数のみ配列で記録する MAT READ A
!a11*x1+a12*x2+a13*x3=b1 − (1) !a21*x1+a22*x2+a23*x3=b2 − (2) !a31*x1+a32*x2+a33*x3=b3 − (3) ! !(1)をa11で割る !x1+a12'*x2+a13'*x3=b1' − (1)' ← ピボット !(2)-(1)*a21より ! a22'*x2+a23'*x3=b2' − (2)' !(3)-(1)*a31より ! a32'*x2+a33'*x3=b3' − (3)' ! !(2)'をa22'で割る ! x2+a23''*x3=b2'' − (2)'' ← ピボット !(1)'-(2)'*a12'より !x1 +a13''*x3=b1'' − (1)'' !(3)'-(2)'*a32'より ! a33''*x3=b3'' − (3)'' ! !(3)''をa33''で割る ! x3=b3''' − (3)''' ← ピボット !(1)''-(3)''*a13''より !x1 =b1''' − (1)''' !(2)''-(3)''*a23''より ! x2 =b2''' − (2)''' ! FOR k=1 TO N LET mx=0 LET s=k FOR i=k TO N !絶対値が最大となる行を探す IF ABS(a(i,k))>mx THEN LET mx=ABS(a(i,k)) LET s=i END IF NEXT i IF mx=0 THEN !ピボットが0なら PRINT "解けない。";k STOP END IF IF s>k THEN FOR j=1 TO N+1 !k行とs行を入れ替える LET t=a(k,j) LET a(k,j)=a(s,j) LET a(s,j)=t NEXT j PRINT "(";STR$(k);")式と(";STR$(s);")式を入れ替える" !確認 MAT PRINT a !確認 END IF LET p=a(k,k) !ピボットの選択 PRINT "(";STR$(k);")式 ÷ ";p;"より、x";STR$(k);" の係数を1にする。" !確認 FOR j=k TO N+1 !ピボット行をpで割る(Xkの係数を1にする) LET a(k,j)=a(k,j)/p NEXT j MAT PRINT a !結果を表示する FOR i=1 TO N !各行のXkを掃き出す IF i<>k THEN !ピボット行は除く LET d=a(i,k) !i行のXkの係数 PRINT "(";STR$(i);")式 - (";STR$(k);")式 × ";d;"より、x";STR$(k);" を消去する。" !確認 FOR j=k TO N+1 !Xkの係数を0にする LET a(i,j)=a(i,j)-a(k,j)*d !i行-ピボット行*係数 NEXT j MAT PRINT a !結果を表示する END IF NEXT i PRINT NEXT k
END
|