FC2ブログ

# 二分法 Bisection Method
# 引数 区間X1 区間X2 方程式 ($X1, $X2, \@Equations)
# 戻り値 二分法 ($BisectionMethod)
sub BISECTIONMETHOD{
my ($X1, $X2, $Equations) = @_;
($X1, $X2) = ($X2, $X1) if($X1 > $X2);
my $BisectionMethod = 0;
my $F_x1 = 0;
my $F_x2 = 0;
my $PrevMiddle = 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++){
# 中間点
my $F_m = 0;
my $Middle = ($X1 + $X2) / 2;

# f(Middle)
for(my $j = 0; $j <= $Degree; $j++){
$F_m += $$Equations[$j] * ($Middle ** ($Degree - $j));
}

# 置き換え
$X1 = $Middle if((($F_m > 0) && ($F_x1 > 0)) || (($F_m < 0) && ($F_x1 < 0)));
$X2 = $Middle if((($F_m > 0) && ($F_x2 > 0)) || (($F_m < 0) && ($F_x2 < 0)));

# 二分法 Bisection Method
$BisectionMethod = $Middle;

# 収束判定
last if(abs($Middle - $PrevMiddle) < $Epsilon);
$PrevMiddle = $Middle;
}

return $BisectionMethod;
}



x^2 - 2 = 0

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


参考URL
二分法 - Wikipedia
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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