FC2ブログ

# はさみうち法 False Position Method Regula Falsi Method
# 引数 区間X1 区間X2 方程式 ($X1, $X2, \@Equations)
# 戻り値 はさみうち法 ($FalsePositionMethod)
sub FALSEPOSITIONMETHOD{
my ($X1, $X2, $Equations) = @_;
($X1, $X2) = ($X2, $X1) if($X1 > $X2);
my $FalsePositionMethod = 0;
my $X = 0;
my $PrevX = 0;
my $F_x = 0;
my $F_x1 = 0;
my $F_x2 = 0;
my $Limit = 100;
my $Epsilon = 1.0e-20;
my $Degree = @$Equations - 1;

# 配列数の確認
if($Degree < 0){
return 0;
}

for(my $i = 0; $i <= $Degree; $i++){
$F_x1 += $$Equations[$i] * ($X1 ** ($Degree - $i));
$F_x2 += $$Equations[$i] * ($X2 ** ($Degree - $i));
}
# f(x1) <= f(x) <= f(x2) の間に解なし
if(($F_x1 * $F_x2) > 0){
return 0;
}

# 計算
for(my $i = 0; $i <= $Limit; $i++){
# f(x)
$F_x1 = 0;
$F_x2 = 0;
for(my $j = 0; $j <= $Degree; $j++){
$F_x1 += $$Equations[$j] * ($X1 ** ($Degree - $j));
$F_x2 += $$Equations[$j] * ($X2 ** ($Degree - $j));
}

# 近似解
$PrevX = $X;
$X = (($X1 * $F_x2) - ($X2 * $F_x1)) / ($F_x2 - $F_x1);
# 置き換え
$F_x = 0;
for(my $j = 0; $j <= $Degree; $j++){
$F_x += $$Equations[$j] * ($X ** ($Degree - $j));
}
if(($F_x * $F_x1) > 0){
$X1 = $X;
$X2 = $X2;
}else {
$X1 = $X1;
$X2 = $X;
}
# はさみうち法 False Position Method Regula Falsi Method
$FalsePositionMethod = $X;

# 収束判定
last if(abs($X - $PrevX) < $Epsilon);
}

return $FalsePositionMethod;
}



x^2 - 2 = 0

my $X1 = 1;
my $X2 = 2;
my @Equations = (1,0,-2);
my $FalsePosition = &FALSEPOSITIONMETHOD($X1, $X2, \@Equations);
print "$FalsePosition\n";


参考URL
False position method - Wikipedia, the free encyclopedia
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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