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

WBOY
Release: 2016-06-13 13:15:24
Original
849 people have browsed it

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

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

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template