";
for($row = 0; $row < $maxRow; $row++){
echo "
";
for($col=0; $col <$maxCol;$col++){
echo "| ";
echo $mat[$row][$col];
echo " | ";
}
echo "
";
}
echo "";
$row = 0;
$col = 0;
while ($row <= $maxRow && $col <= $maxCol){
$maxi = $row; //$maxi is pivot point
for($k=$row; $k < $maxRow; $k++){
if(abs($mat[$k][$col]) > abs($mat[$maxi][$col])){
$maxi = $k;
}
}
echo "Found pivot in row ".($maxi+1)." col ".($col+1)."
";
if($mat[$maxi][$col] != 0){
//swap rows i and maxi, but do not change the value of i
echo "Swap ".($row+1)." with row ".($maxi+1)."
";
$swap = $mat[$maxi];
$mat[$maxi] = $mat[$row];
$mat[$row] = $swap;
echo "";
for($rw = 0; $rw < $maxRow; $rw++){
echo "";
for($cl=0; $cl <$maxCol;$cl++){
echo "| ";
echo $mat[$rw][$cl];
echo " | ";
}
echo "
";
}
echo "
";
//Now A[i,j] will contain the old value of A[maxi,j].
//divide each entry in row i by A[i,j]
$divFactor = $mat[$row][$col];
echo "Div row ".($row+1)." by ".$divFactor."
";
for($z=0; $z < $maxCol; $z++){
$mat[$row][$z] = $mat[$row][$z] / $divFactor;
}
echo "";
for($rw = 0; $rw < $maxRow; $rw++){
echo "";
for($cl=0; $cl <$maxCol;$cl++){
echo "| ";
echo $mat[$rw][$cl];
echo " | ";
}
echo "
";
}
echo "
";
//Now A[i,j] will have the value 1.
for($u=$row+1; $u < $maxRow; $u++){
//Do not perform operations where the col has 0
if($mat[$u][$col] == 0){
continue;
}
$multFactor = $mat[$u][$col];
echo "Multiply row ".($row+1)." by ".$multFactor." and subtract from row ".($u+1)."
";
// row u - (A[u,j] * row i)
for($z=0; $z < $maxCol; $z++){ //
$mat[$u][$z] = $mat[$u][$z] - ( $multFactor * $mat[$row][$z]);
}
//Now A[u,j] will be 0, since A[u,j] - A[i,j] * A[u,j] = A[u,j] - 1 * A[u,j] = 0.
echo "";
for($rw = 0; $rw < $maxRow; $rw++){
echo "";
for($cl=0; $cl <$maxCol;$cl++){
echo "| ";
echo $mat[$rw][$cl];
echo " | ";
}
echo "
";
}
echo "
";
}
}
$row = $row + 1;
$col = $col + 1;
}
echo "";
for($rw = 0; $rw < $maxRow; $rw++){
echo "";
for($cl=0; $cl <$maxCol;$cl++){
echo "| ";
echo $mat[$rw][$cl];
echo " | ";
}
echo "
";
}
echo "
";
echo "Performing Back sub
";
return $mat;
}
function backsub($mat){
$rowMax = count($mat);
$colMax = count($mat[0])-1;
$lastCol = array();
$zeroCol = array();
for($i=0; $i < $rowMax;$i++){
$lastCol[$i] = $mat[$i][$colMax];
$zeroCol[$i] = 0;
}
for($row=$rowMax-1; $row >= 0; $row--){
$zeroCol[$row] = $lastCol[$row];
for($j=$row+1; $j < $rowMax; $j++){
$zeroCol[$row] = $zeroCol[$row] - ($mat[$row][$j] * $zeroCol[$j]);
}
if($mat[$row][$col] != 0){
$zeroCol[$row] = $zeroCol[$row]/$mat[$row][row];
}
}
return $zeroCol;
}
/* Matrix format
(just an example, not solvable)
5x + 4y = 3z
4x + 2y = z
$A = array(
array(5,4),
array(4,2)
);
$Y = array(
array(3),
array(1)
);
*/
/* Test matrix 1
(See Hess Law example)
-4 6 0 1
0 10 -4 1
-----------
1 1 -1 0
$A = array(
array(-4,6,0,1),
array(0,10,-4,1)
);
$Y = array(
array(1),
array(1),
array(-1),
array(0)
);
//Expected value is [-1/4, 1/4, 0]
//wolfram solution:
// http://www95.wolframalpha.com/input/?i=Solve+{w%2Cx}.{{-4%2C6%2C0%2C1}%2C+{0%2C10%2C-4%2C1}}%3D{1%2C1%2C-1%2C0}
*/
/* Test Matrix 2
$A = array(
array(-1,0,-1,1,1,0,0),
array(0,-1/2,0,0,0,1,-1/2),
array(0,0,1/2,0,-1,2,-1)
);
$Y = array(
array(1),
array(1),
array(3/2),
array(-1),
array(-2),
array(0),
array(0)
);
//Expected value is [-1, -2, 1], works.
*/
/* Test Matrix 3
see: http://journal.suteki.nu/2009/05/17/finding-an-algorithm-to-solve-hess-law/
for more info
*/
$A = array(
array(1,0,0,-3,-1,3,0),
array(0,2,3,0,-1,0,0),
array(0,0,1,0.5,0,0,-1),
array(0,0,0,0,0,-1,1)
);
$Y = array(
array(-2),
array(4),
array(0),
array(3),
array(0),
array(0),
array(0)
);
//Expected is [-2,2,-6,-6], which is correct
//Wolfram solution:
// http://www95.wolframalpha.com/input/?i=Solve+{w,x,y,z}.{{1,0,0,-3,-1,3,0},+{0,2,3,0,-1,0,0},+{0,0,1,0.5,0,0,-1},{0,0,0,0,0,-1,1}}%3D{-2,4,0,3,0,0,0}
$Z = leastSquares($A,$Y);
echo "Answer";
echo "";
print_r($Z);
echo "
";
?>