数値解析を学んでいるので、phpで実装してみます。興味のある方は貼って試してみてください
ラグランジュ補間は、n 個の既知点を与え、それらを多項式関数で近似し、近似された関数を見つけて、未知の点の関数値を推定する内挿プロセスです
補間関数は f(x) = xigma (総和) lk*yk
このクラスは関数画像を補間して表示する機能を実装します
/*
* ラグランジュ補間
* @王ビン
* */
ラグランジュ級{
プライベート $dot = array();
パブリック関数 __construct($array){
$this->dot = $array;
}
/*
* lkを計算します
* */
プライベート関数 get_lk($x,$k){
$num = count($this->dot['x']);
$omiga_xk = 1;
$omiga_x = 1;
for($i = 0;$i
If($i != $k){
$omiga_xk *= ($this->dot['x'][$k]-$this->dot['x'][$i]);
$omiga_x *= ($x - $this->dot['x'][$i]);
}
}
$lk = $omiga_x/$omiga_xk;
return $lk;
}
パブリック関数 get_y($x){
$num = count($this->dot['x']);
$L = 0;
for($k = 0;$k
$lk = $this->get_lk($x,$k);
$L += ($this->dot['y'][$k]*$lk);
}
$L を返す;
}
パブリック関数draw(){
$img = imagecreate(500,500);
Imagecolorallocate($img,255,255,2);
$num = count($this->dot['x']);
$max = 0;
for($i = 0;$i dot['x'][$i] ? ][$i]:$max;
$r = 7;//点の半径
$step = 0.1;//ステップサイズ
for($i = 0;$i
imagefilledellipse($img,$this->dot['x'][$i],$this->dot['y'][$i],$r,$r,1);
}
for($i = $this->dot['x'][0]-10;$i
$current_x = $i;
$current_y = $this->get_y($current_x);
$next_x = $i + $step;
$next_y = $this->get_y($next_x);
イメージライン($img,$current_x,$current_y,$next_x,$next_y,1);
}
header("コンテンツタイプ: image/png");
imagepng($img);
imagedestroy($img);
}
}
$x = 新しいラグランジュ(array('x'=>array(10,30,100,120,220),'y'=>array(20,40,240,220,340)));
$x->draw();
?>
pcenshaoより抜粋