# 数值分析（php实现)一：Lagrange插值

11-11-18        来源：[db:作者]

Lagrange插值就是给出n个已知的点，用多项式函数拟合，求出拟合的函数，进而估算未知点函数值的一种插值过程

<?php

/*

* Lagrange插值

* @wangbin

* */

class Lagrange{

private \$dot = array();

public function __construct(\$array){

\$this->dot = \$array;

}

/*

* 计算lk

* */

private function get_lk(\$x,\$k){

\$num = count(\$this->dot['x']);

\$omiga_xk = 1;

\$omiga_x = 1;

for(\$i = 0;\$i < \$num;\$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;

}

public function get_y(\$x){

\$num = count(\$this->dot['x']);

\$L = 0;

for(\$k = 0;\$k < \$num;\$k++){

\$lk = \$this->get_lk(\$x,\$k);

\$L += (\$this->dot['y'][\$k]*\$lk);

}

return \$L;

}

public function draw(){

\$img = imagecreate(500,500);

imagecolorallocate(\$img,255,255,2);

\$num = count(\$this->dot['x']);

\$max = 0;

for(\$i = 0;\$i < \$num;\$i++) \$max = \$max < \$this->dot['x'][\$i] ? \$this->dot['x'][\$i]:\$max;

\$r = 7;//点的半径

\$step = 0.1;//步长

for(\$i = 0;\$i < \$num;\$i++){

imagefilledellipse(\$img,\$this->dot['x'][\$i],\$this->dot['y'][\$i],\$r,\$r,1);

}

for(\$i = \$this->dot['x'][0]-10;\$i < \$max + 10;\$i += \$step){

\$current_x = \$i;

\$current_y = \$this->get_y(\$current_x);

\$next_x = \$i + \$step;

\$next_y = \$this->get_y(\$next_x);

imageline(\$img,\$current_x,\$current_y,\$next_x,\$next_y,1);

}

imagepng(\$img);

imagedestroy(\$img);

}

}

\$x = new Lagrange(array('x'=>array(10,30,100,120,220),'y'=>array(20,40,240,220,340)));

\$x->draw();

?>