当前位置: 代码迷 >> PHP >> 数值分析(php兑现)二:线性方程组的两个解法
  详细解决方案

数值分析(php兑现)二:线性方程组的两个解法

热度:77   发布时间:2016-04-29 00:15:37.0
数值分析(php实现)二:线性方程组的两个解法
其实这个程序是早就写好的,只不过一直没有时间写上来.
这两个程序都是通过迭代的方法得到线性方程组的解的方法,一个是高斯-塞德尔迭代法,一个是雅可比迭代法
<?phpclass Gs{    private $matrix;    public function __construct($array){        $this->matrix = $array;    }    public function solve(){        $preX = array();        $nowX = array();        $cishu = 17;        $delta = 0.0001;        $matN = count($this->matrix);        for($i = 0;$i<$matN;$i++){            $preX[$i] = 1;        }        $min = 100000000;        for($n = 0;$n<$cishu;$n++){            for($i = 0;$i<$matN;$i++){//xi                $sum1 = 0;                $sum2 = 0;                for($j = 0;$j < $matN;$j++){                    if($j < $i) $sum1 += ($this->matrix[$i][$j] * $nowX[$j]);                    if($j > $i) $sum2 += ($this->matrix[$i][$j] * $preX[$j]);                }                $nowX[$i] = ($this->matrix[$i][$matN] - $sum1 - $sum2)/$this->matrix[$i][$i];                $tempMin = $nowX[$i] > $preX[$i] ? $nowX[$i]-$preX[$i]:$preX[$i]-$nowX[$i];                if($min > $tempMin) $min = $tempMin;            }             $preX = $nowX;            $str = implode(",",$nowX);            echo ($n+1).":($str)"."<br>";            if($min < $delta) break;        }    }}$a = array(    array(5,2,1,-12),    array(-1,4,2,20),    array(12,-3,10,3));$x = new Gs($a);$x->solve();?>

接下来的是雅可比方法,
<?phpclass Yacobi{    private $matrix;    public function __construct($array){        $this->matrix = $array;    }    public function solve(){        $preX = array();        $nowX = array();        $cishu = 17;        $matN = count($this->matrix);        for($i = 0;$i<$matN;$i++){            $preX[$i] = 1;        }        for($n = 0;$n<$cishu;$n++){            for($i = 0;$i<$matN;$i++){//xi                $sum = 0;                for($j = 0;$j < $matN;$j++){                    if($j != $i) $sum += ($this->matrix[$i][$j] * $preX[$j]);                }                $nowX[$i] = ($this->matrix[$i][$matN] - $sum)/$this->matrix[$i][$i];            }             $preX = $nowX;            $str = implode(",",$nowX);            echo ($n+1).":($str)"."<br>";        }    }}$a = array(    array(5,2,1,-12),    array(-1,4,2,20),    array(12,-3,10,3));$x = new Yacobi($a);$x->solve();?>