<?php /****************************/ /* 補間法(ラグランジュ) */ /* coded by Y.Suganuma */ /****************************/ $x = array(3); $y = array(3); // 線形補間 $n = 1; $x[0] = 0.0; $x[1] = 2.0; $y[0] = 0.0; $y[1] = 4.0; printf("線形補間\n"); $x1 = 0.0; for ($i1 = 0; $i1 <= 8; $i1++) { $y1 = Lagrange($n, $x, $y, $x1); printf(" x %f y %f\n", $x1, $y1); $x1 += 0.25; } // 2次補間 $n = 2; $x[0] = 0.0; $x[1] = 1.0; $x[2] = 2.0; $y[0] = 0.0; $y[1] = 1.0; $y[2] = 4.0; printf("2次補間\n"); $x1 = 0.0; for ($i1 = 0; $i1 <= 8; $i1++) { $y1 = Lagrange($n, $x, $y, $x1); printf(" x %f y %f\n", $x1, $y1); $x1 += 0.25; } /**********************************/ /* ラグランジュ補間法 */ /* n : 次数(n=1は線形補間) */ /* x, y : (n+1)個の点の座標 */ /* x1 : 補間したい点のx座標 */ /* return : 補間結果 */ /**********************************/ function Lagrange($n, $x, $y, $x1) { $y1 = 0.0; for ($i1 = 0; $i1 <= $n; $i1++) { $s1 = 1.0; $s2 = 1.0; for ($i2 = 0; $i2 <= $n; $i2++) { if ($i2 != $i1) { $s1 *= ($x1 - $x[$i2]); $s2 *= ($x[$i1] - $x[$i2]); } } $y1 += $y[$i1] * $s1 / $s2; } return $y1; } ?>