程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 數值分析(php實現)一:Lagrange插值

數值分析(php實現)一:Lagrange插值

編輯:關於PHP編程

 

在學數值分析,試著用php實現下,有興趣的朋友可以粘下來試試

Lagrange插值就是給出n個已知的點,用多項式函數擬合,求出擬合的函數,進而估算未知點函數值的一種插值過程

插值函數是f(x) = xigma(求和) lk*yk

本類實現了插值後顯示函數圖像的功能

 

<?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);

        }

        header("Content-type: image/png");

        imagepng($img);

        imagedestroy($img);

    }

}

 

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

$x->draw();

?>

 

摘自 pcenshao

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved