連立一次方程式の解法(1) 連立二元一次方程式 𝑎11 𝑥1 + 𝑎12 𝑥2 = 𝑏1 𝑎21 𝑥1 + 𝑎22 𝑥2 = 𝑏2 クラメール(Cramer)の公式 𝑥1 = ∆1 ∆ 𝑎11 ∆= 𝑎 21 𝑎12 𝑎22 𝑏1 ∆1 = 𝑏2 𝑥2 = ∆2 ∆ 𝑎12 𝑎22 𝑎11 ∆2 = 𝑎21 元の数が大きくなると行列式の計算は困難 𝑏1 𝑏2 連立一次方程式の解法(2) 連立n元一次方程式 𝑎11 𝑥1 + 𝑎12 𝑥2 + ⋯ + 𝑎1𝑛 𝑥𝑛 = 𝑏1 𝑎21 𝑥1 + 𝑎22 𝑥2 + ⋯ + 𝑎2𝑛 𝑥𝑛 = 𝑏2 ⋮ 𝑎𝑛1 𝑥1 + 𝑎𝑛2 𝑥2 + ⋯ + 𝑎𝑛𝑛 𝑥𝑛 = 𝑏𝑛 第一式をa11で割って、ak1倍して第k式から引く 第二式をa’22で割って、a’k2倍して第k式から引く 以降同様の処理を繰り返す 𝑥1 + 𝑎′12 𝑥2 + ⋯ + 𝑎′1𝑛 𝑥𝑛 = 𝑏′1 𝑥2 + ⋯ + 𝑎′2𝑛 𝑥𝑛 = 𝑏′2 ⋮ 𝑥𝑛 = 𝑏′𝑛 連立一次方程式の解法(3) 𝑥1 + 𝑎′12 𝑥2 + ⋯ + 𝑎′1𝑛 𝑥𝑛 = 𝑏′1 𝑥2 + ⋯ + 𝑎′2𝑛 𝑥𝑛 = 𝑏′2 ⋮ 𝑥𝑛 = 𝑏′𝑛 第n式をan-1,n倍して上の式(第n-1式)から引く 第n式をan-2,n倍し、第n-1式をan-2,n-1倍して 上の式(第n-2式)から引く 以降同様の処理を繰り返す 𝑥1 = 𝑏′′1 𝑥1 = 𝑏′′2 ⋮ 𝑥𝑛 = 𝑏′𝑛 ガウス(Gauss)の消去法 連立一次方程式の解法(4) ガウスの消去法で連立方程式を解く外部関数: gauss.f コマンドプロンプトで次のコマンドを入力 [s2………]$ cp ~takizawa/gauss.f . 半角スペースとピリオドを忘れずに!! [s2………]$ ls でファイルリストを表示、「gauss.f」がコピーされていることを確認 gauss.f の呼び出し利用するメインプログラム(例えば prog10.f)を自分で作成し、 [s2………]$ gfortran prog10.f gauss.f としてプログラムをコンパイル 連立一次方程式の解法(5) ガウスの消去法で連立方程式を解く外部関数: gauss.f 関数の引数 function gsnelm(mat, vec, dim, mxdim) Integer::dim, mxdim, gsnelm double precision::mat(mxdim,mxdim),vec(mxdim) gsnelm → 解が求まったら「0」、解がない時は「0」以外の値を返す関数 dim → 連立方程式の数(元の数) mxdim → メインプログラムで宣言された配列の数(mxdim ≧ dim) mat → 連立方程式の係数(aij)行列を表す二次元配列 vec → 連立方程式の右辺(bk)を表す一次元配列 連立一次方程式の解法(6) ガウスの消去法で連立方程式を解く外部関数: gauss.f メインプログラムの例 連立三元方程式を解く場合 integer::dim,mxdm,gsnelm,rc doubel precision::mat(5,5),vec(5) dim=3 mxdm=5 mat(1,1)=1.0d+0 mat(1,2)=3.0d+0 ・・・ mat(3,3)=2.0d+0 vec(1)=12.0d0 ・・・ rc=gsnelm(mat,vec,dim,mxdm) ・・・ if (rc==0) then print *,’x(1)=‘,vec(1) print *,’x(2)=‘,vec(2) ・・・ endif ・・・ 必ず一致させる!
© Copyright 2025 ExpyDoc