18.ガウス・ジョルダン法のクラス
連立方程式を解きたくなった
AS3であるスクリプトを書いてたら、3元1次の連立方程式を解きたくなりました。
となれば、3点を通る二次関数を得るでも書いたように、おなじみのガウス・ジョルダン法の出番なのですが、AS3ではまだGJ法を使ったことがないことに気付きました。
どうせならクラスにしておくか、ということでGJ法による解を得るクラスを作ってみました。
ガウス・ジョルダン法で連立方程式を解くクラス
気合入れて(?)作ったものの、別にAS3でもないんじゃない?ってくらいの内容でしたね、、、(^^;
ほとんど、3点を通る二次関数を得るで書いたスクリプトのコピペだったりしますし。
まあせっかくなので、スクリプトを、、、
// gaussjordan.as
// ガウス・ジョルダン法
package {
public class gaussjordan {
public function gaussjordan() {// コンストラクタ
}
public function getvalue(v:Array):Object {
var a:Number,ii:uint,jj:uint,kk:uint,temp:Number;
for (ii=0;ii<3;ii++){
a=v[ii][ii];
for (kk=ii;kk<4;kk++){
v[kk][ii]=v[kk][ii]/a;
}
for(jj=0;jj<3;jj++){
if (jj != ii){
temp=v[ii][jj];
for (kk=ii;kk<4;kk++){
v[kk][jj]=v[kk][jj]-temp*v[kk][ii];
}
}
}
}
return { aa:v[3][0] , bb:v[3][1] , cc:v[3][2] };
}
}
}
// ガウス・ジョルダン法
package {
public class gaussjordan {
public function gaussjordan() {// コンストラクタ
}
public function getvalue(v:Array):Object {
var a:Number,ii:uint,jj:uint,kk:uint,temp:Number;
for (ii=0;ii<3;ii++){
a=v[ii][ii];
for (kk=ii;kk<4;kk++){
v[kk][ii]=v[kk][ii]/a;
}
for(jj=0;jj<3;jj++){
if (jj != ii){
temp=v[ii][jj];
for (kk=ii;kk<4;kk++){
v[kk][jj]=v[kk][jj]-temp*v[kk][ii];
}
}
}
}
return { aa:v[3][0] , bb:v[3][1] , cc:v[3][2] };
}
}
}
ちなみに、使う場合はこんな感じで呼び出し側を記述します。
var kai:Object;
var h:Array;
h=[
[?,?,?],//行列の一番左の列
[?,?,?],//行列の二番目の列
[?,?,?],//行列の三番目の列
[?,?,?],//y
];
var gj:gaussjordan = new gaussjordan();
kai=gj.getvalue(h);//このメソッドで解を得ます
tf.appendText("aa = "+kai.aa+"\n");//tfはテキストフィールド
tf.appendText("bb = "+kai.bb+"\n");
tf.appendText("cc = "+kai.cc+"\n");
var h:Array;
h=[
[?,?,?],//行列の一番左の列
[?,?,?],//行列の二番目の列
[?,?,?],//行列の三番目の列
[?,?,?],//y
];
var gj:gaussjordan = new gaussjordan();
kai=gj.getvalue(h);//このメソッドで解を得ます
tf.appendText("aa = "+kai.aa+"\n");//tfはテキストフィールド
tf.appendText("bb = "+kai.bb+"\n");
tf.appendText("cc = "+kai.cc+"\n");