新しく発言する  EXIT  インデックスへ

ガウスの消去法連立1次方程式の解Ax=b


  ガウスの消去法 連立1次方程式の解 Ax=b 山中和義 2007/11/25 10:21:25 
  !ガウス・ジョルダン(Gauss-Jordan)法N元... 山中和義 2007/11/25 10:22:50 
Re: ガウスの消去法 連立1次方程式の解 Ax=b  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2007/11/25 10:22:50
!ガウス・ジョルダン(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
  │└FullBASICなら逆行列による計算がお手軽です... 山中和義 2007/11/25 10:28:23 
  ヤコビ反復法(Jacobi) 山中和義 2008/09/29 10:28:16 
  │└ガウス・ザイデル反復法(Gauss-Seidel) 山中和義 2008/09/29 10:32:12 
  !共役勾配法(conjugategradientmethod)N元... 山中和義 2008/10/06 20:58:41 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。