首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php的Gauss消除码

php的Gauss消除码
EN

Stack Overflow用户
提问于 2016-03-15 21:15:13
回答 1查看 1K关注 0票数 0

我想写一个代码来进行高斯消去,我得到了以下信息:

代码语言:javascript
复制
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;
}
}

}

一切都没问题,但当我把这样的值放在这里时:

代码语言:javascript
复制
$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。

我不知道这有什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-16 07:14:44

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

在这里,再次更正代码:

代码语言:javascript
复制
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);

这提供了以下输出:

代码语言:javascript
复制
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
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36022304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档