FC2ブログ

# 割線法 Secant Method
# 引数 予想される真の解に近いと思われる値 方程式 ($Solution, \@Equations)
# 戻り値 割線法 ($SecantMethod)
sub SECANTMETHOD{
my ($Solution, $Equations) = @_;
my $SecantMethod = 0;
my $X = $Solution;
my $NextX = 0;
my $PrevX = $Solution * 2;
my $F_X = 0;
my $PrevF_X = 0;
my $Limit = 100;
my $Epsilon = 1.0e-10;
my $Degree = @$Equations - 1;

# 配列数と解の確認
if(($Degree < 0) || ($Solution == 0)){
return 0;
}

# 初回 f($Solution) f($PrevX) $PrevXの値は適当
for(my $j = 0; $j <= $Degree; $j++){
$F_X += $$Equations[$j] * ($X ** ($Degree - $j));
$PrevF_X += $$Equations[$j] * ($PrevX ** ($Degree - $j));
}
$NextX = $X - ($F_X * (($X - $PrevX) / ($F_X - $PrevF_X)));

# 計算
for(my $i = 0; $i <= $Limit; $i++){
# 一つ前
$PrevX = $X;
$X = $NextX;

# f(x)
$PrevF_X = $F_X;
$F_X = 0;
for(my $j = 0; $j <= $Degree; $j++){
$F_X += $$Equations[$j] * ($X ** ($Degree - $j));
}

# 近似解
$NextX = $X - ($F_X * (($X - $PrevX) / ($F_X - $PrevF_X)));
# 割線法 Secant Method
$SecantMethod = $NextX;

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

return $SecantMethod;
}



x^2 - 2 = 0

my $Solution = 1;
my @Equations = (1,0,-2);
my $Secant = &SECANTMETHOD($Solution, \@Equations);
print "$Secant\n";


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

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

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

検索フォーム


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