トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

プログラミングメモ(クラメールの公式)

クラメールの公式のプログラム
クラーメルとかクラメルとかいろいろブレがあったりするけど
つまり連立方程式解くときに使うあれ
手計算で解くならガウスの消去法の方が楽かもしれないけど
まぁプログラムで解くならこっちでしょう
--------2011/11/29追記-------
ってこともないか
3次までならこっちの方が書くの楽だけどそれ以上ならあっちの方がいい気がする
計算量や精度の話は知らん
--------2013/03/28追記-------
おそらくクラメルの公式の利点は
解なしの判定が容易なのとそれ以外条件判定が不要で計算が単純ってことかな
それも3次までの話でそれ以上だとガウスの消去法の方が有利
--------追記ここまで---------

今回はおまけでクラメールの公式の導出……とは言わないかもしれないけど
まぁそんな数式的なものもつけてみたよ
クラメールの公式を使って連立方程式を解くプログラム
下のコードは三元の場合

public static double[] cramer(double[][] a,double[] b){
double detA=det(a);
if(detA==0.0){
return null;
}
double[] x=new double[3];
for(int ii=0;ii<3;ii++){
double[][] a2=new double[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(j==ii){
a2[i][j]=b[i];
}else{
a2[i][j]=a[i][j];
}
}
}
x[ii]=det(a2)/detA;
}
return x;
}

public static double det(double[][] a){
double a1=a[0][0]*(a[1][1]*a[2][2]-a[1][2]*a[2][1]);
double a2=a[0][1]*(a[1][2]*a[2][0]-a[1][0]*a[2][2]);
double a3=a[0][2]*(a[1][0]*a[2][1]-a[1][1]*a[2][0]);
return a1+a2+a3;
}

これは一応Javaコードだけどほかの言語でも大差ないはず
--------2011/11/29追記-------
中断条件がdetA==1.0とかいうアホなものになってたものを修正
--------追記ここまで---------

あとこれは結構単純化して無駄なことやってるから
書いて動かして理解したらちゃんと自分の使うものに合わせて書き換えてね
それとdouble同士の比較に==使ってもうまくいかないことも多いから
使う精度にもよるけど絶対値と閾値使って判定した方がいいよ

ちなみに3のところを任意の数に変えればcramer自体は任意の未知数に対応できる
今回は任意にすると行列式の計算が面倒だったってだけ
n次の行列式も上三角行列を作って対角要素をって話だけど今回の本質じゃないし
まぁ機会があればってことで




おまけ(本編)
クラメールの公式とはなんぞやという話

まず線形連立方程式は一般化すると次のようになる
式1

で、これを行列表記にすると下のようになる
式2
xを求めたいんだから
式3

ここでAの逆行列は
式4

のようにAの余因子行列をAの行列式で割ったものになる

余因子行列ってのは
式5
式6
のように
行列のある要素の位置する行と列を除いた要素からなる行列の行列式を上のように並べたのも
ちなみに取り除く要素の位置とその余因子が当てはまる位置は転置の関係にあることに注意
あと符号が行と列に応じて変わる

さて、実際にxを求めてみるとxiは
式7

となる
これに対して余因子展開の逆演算をやってやると
式8
とちょうど行列Aのi列をbで入れ替えた形になる
これがクラメールの公式

ちなみにAの行列式が0の時は当然解なし
  1. 2011/11/03(木) 07:32:17|
  2. 雑記
  3. | トラックバック:0
  4. | コメント:0
<<研究の途中経過その2 | ホーム | ヒロインっぽいだれかの立ち絵>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/746-f7688de1
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

トック

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。