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

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

WBOY
WBOYOriginal
2016-06-13 13:15:24854browse

数值分析(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();
?>

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn