我想写一个代码来进行高斯消除,我得到了这个:
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。
我不知道它有什么问题。
答案 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
)