FC2ブログ

# ガウス・ジョルダン法 Gauss Jordan Elimination
# 引数 方程式 (\@Equations)
# 戻り値 ガウス・ジョルダン法 (@GaussJordanElimination)
sub GAUSSJORDANELIMINATION{
my ($Equations) = @_;
my @GaussJordanElimination = ();
my @TempEquations = @$Equations;
my $Column = $#$Equations;
my $Row = $#{$$Equations[0]};

# 配列数の確認
for(my $i = 1; $i <= $Column; $i++){
if($Row != $#{$$Equations[$i]}){
return 0;
}
}
if($Column != ($Row - 1)){
return 0;
}

# 左上[0][0] == 0 なら入れ替える
if($TempEquations[0][0] == 0){
for(my $i = 1; $i <= $Column; $i++){
if($TempEquations[$i][0] != 0){
($TempEquations[0], $TempEquations[$i]) = ($TempEquations[$i], $TempEquations[0]);
last;
}
}
}

# 計算
for(my $i = 0; $i <= $Column; $i++){
my $RowNumber = $i;
my $PriceI = $TempEquations[$i][$RowNumber];

# 縦列$i番目 横列$j番目 主対角線を1にする
for(my $j = $i; $j <= $Row; $j++){
$TempEquations[$i][$j] = $TempEquations[$i][$j] / $PriceI;
}

# 縦列($i or $j)番目 横列$k番目 主対角線以外の要素を0にする
for(my $j = 0; $j <= $Column; $j++){
next if($i == $j);
my $PriceJ = $TempEquations[$j][$RowNumber];

for(my $k = $RowNumber; $k <= $Row; $k++){
my $Diff = $TempEquations[$j][$k] - ($TempEquations[$i][$k] * $PriceJ);

$TempEquations[$j][$k] = $Diff;
}
}

}

# ガウス・ジョルダン法 Gauss Jordan Elimination
for(my $i = 0; $i <= $Column; $i++){
$GaussJordanElimination [$i] = $TempEquations[$i][$Row];
}

return @GaussJordanElimination ;
}


参考URL
4 ガウス・ジョルダン法
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS