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

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

热度:358   发布时间:2012-09-14 23:00:49.0
数值分析(php实现)二:线性方程组的两个解法
其实这个程序是早就写好的,只不过一直没有时间写上来.
这两个程序都是通过迭代的方法得到线性方程组的解的方法,一个是高斯-塞德尔迭代法,一个是雅可比迭代法
<?php
class 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();
?>

接下来的是雅可比方法,
<?php
class 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();
?>