FC2ブログ
最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/NewtonInterpolation1.txt

修正1 3/16
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/NewtonInterpolation2.txt

修正2 3/18
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/NewtonInterpolation3.txt

修正2 5/13

# ニュートン補間法 Newton Interpolation
# 引数 X軸 Y軸 X軸補間 (\@X, \@Y, \@PriceX)
# 戻り値 ニュートン補間法 (@NewtonInterpolation)
sub NEWTONINTERPOLATION{
my ($X, $Y, $PriceX) = @_;
my @NewtonInterpolation = ();
my @ForwardDifference = ($$Y[0]);
my @DiffY = ();
my $DiffX = 0;
my $Sum = 0;
my $CountX = @$PriceX - 1;
my $Count = @$X - 1;

# 配列数の確認
if(($Count < 0) || (@$X != @$Y) || (@$PriceX < 0)){
return 0;
}

# 前進差分
for(my $i = 1; $i <= $Count; $i++){
if($i == 1){
for(my $j = 0; $j <= $Count - $i; $j++){
$DiffY[$j] = ($$Y[$j + 1] - $$Y[$j]) / ($$X[$i + $j] - $$X[$j]);
}
}else {
for(my $j = 0; $j <= $Count - $i; $j++){
$DiffY[$j] = ($DiffY[$j + 1] - $DiffY[$j]) / ($$X[$i + $j] - $$X[$j]);
}
}

# 前進差分
$ForwardDifference[$i] = $DiffY[0];
}

# 計算 Y軸補間
for(my $i = 0; $i <= $CountX; $i++){
$Sum = $ForwardDifference[0];

for(my $j = 1; $j <= $Count; $j++){
$DiffX = 1;

for(my $k = 0; $k < $j; $k++){
$DiffX *= ($$PriceX[$i] - $$X[$k]);
}

$Sum += $ForwardDifference[$j] * $DiffX;
}

# ニュートン補間法 Newton Interpolation
$NewtonInterpolation[$i] = $Sum;
}

return @NewtonInterpolation;
}


参考URL
離散した点を補間してグラフを描画する方法 Lagrange、Newton、Splineなどの各種補間方式の実装

メモ
(Xi, Yi) = (Xi, f(Xi))

一言
X軸の差が均等でないと、Y軸の値が一致しなくなるのはバグ
式の中身がまったく理解できていないのでわからん

追記1
二項係数を使うのをやめた

追記2
引数にX軸の値を代入してY軸の値を計算するようにした

修正3
my @DiffY = @$Y;をやめた
変数の名前を変える
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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