php的Gauss-Jordan消除代码

时间:2016-03-15 21:15:14

标签: php linear-algebra algebra

我想写一个代码来进行高斯消除,我得到了这个:

function gauss($A, $x) {

    for ($i=0; $i < count($A); $i++) {
        $A[$i][] = $x[$i];
    }
    $n = count($A);

    for ($i=0; $i < $n; $i++) {
        $maxEl = abs($A[$i][$i]);
        $maxRow = $i;
        for ($k=$i+1; $k < $n; $k++) {
            if (abs($A[$k][$i]) > $maxEl) {
                $maxEl = abs($A[$k][$i]);
                $maxRow = $k;
            }
        }


        for ($k=$i; $k < $n+1; $k++) {
            $tmp = $A[$maxRow][$k];
            $A[$maxRow][$k] = $A[$i][$k];
            $A[$i][$k] = $tmp;
        }

        for ($k=$i+1; $k < $n; $k++) {
            $c = -$A[$k][$i]/$A[$i][$i];
            for ($j=$i; $j < $n+1; $j++) {
                if ($i==$j) {
                    $A[$k][$j] = 0;
                } else {
                    $A[$k][$j] += $c * $A[$i][$j];
                }
            }
        }
    }

    $x = array_fill(0, $n, 0);
    for ($i=$n-1; $i > -1; $i--) {
        $x[$i] = $A[$i][$n]/$A[$i][$i];
        for ($k=$i-1; $k > -1; $k--) {
            $A[$k][$n] -= $A[$k][$i] * $x[$i];
        }
    }
if (!in_array(false, $x, true)){
 if($x[0] >= 0 && $x[1] >= 0 && $x[2] >= 0){
return $x;
}
}

}

一切都很好但是当我把这样的值放在一起时:

$A = array(array(1,1,0),array(3,5,4),array(1,0,0));
$x = array(2,30,0);



| 1 1 0 |  2 | 
| 1 0 0 |  0 |
| 3 5 4 | 30 |

结果应为:(0,2,5),但我的函数返回null。

我不知道它有什么问题。

1 个答案:

答案 0 :(得分:1)

刚刚尝试了我之前评论中提到的假设,结果证明是正确的:在返回结果向量之前删除条件将解决您的问题。试试这个little phpfiddle

这里再次修正了代码:

function gauss($A, $x) {

    for ($i=0; $i < count($A); $i++) {
        $A[$i][] = $x[$i];
    }
    $n = count($A);

    for ($i=0; $i < $n; $i++) {
        $maxEl = abs($A[$i][$i]);
        $maxRow = $i;
        for ($k=$i+1; $k < $n; $k++) {
            if (abs($A[$k][$i]) > $maxEl) {
                $maxEl = abs($A[$k][$i]);
                $maxRow = $k;
            }
        }


        for ($k=$i; $k < $n+1; $k++) {
            $tmp = $A[$maxRow][$k];
            $A[$maxRow][$k] = $A[$i][$k];
            $A[$i][$k] = $tmp;
        }

        for ($k=$i+1; $k < $n; $k++) {
            $c = -$A[$k][$i]/$A[$i][$i];
            for ($j=$i; $j < $n+1; $j++) {
                if ($i==$j) {
                    $A[$k][$j] = 0;
                } else {
                    $A[$k][$j] += $c * $A[$i][$j];
                }
            }
        }
    }

    $x = array_fill(0, $n, 0);
    for ($i=$n-1; $i > -1; $i--) {
        $x[$i] = $A[$i][$n]/$A[$i][$i];
        for ($k=$i-1; $k > -1; $k--) {
            $A[$k][$n] -= $A[$k][$i] * $x[$i];
        }
    }
    // be bold and return the $x vector in any case:
    return $x;
}
$A = array(array(1,1,0),array(3,5,4),array(1,0,0));
$rhs = array(2,30,0);
print_r($A);
print_r($rhs);
$x=gauss($A,$rhs);
echo "solution vector:\n";
print_r($x);

这给出了以下输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 1
            [2] => 0
        )

    [1] => Array
        (
            [0] => 3
            [1] => 5
            [2] => 4
        )

    [2] => Array
        (
            [0] => 1
            [1] => 0
            [2] => 0
        )

)
Array
(
    [0] => 2
    [1] => 30
    [2] => 0
)
solution vector:
Array
(
    [0] => -5.92118946467E-16
    [1] => 2
    [2] => 5
)