"; 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 ""; } echo "
"; echo $mat[$rw][$cl]; 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 ""; } echo "
"; echo $mat[$rw][$cl]; 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 ""; } echo "
"; echo $mat[$rw][$cl]; echo "
"; } } $row = $row + 1; $col = $col + 1; } echo ""; for($rw = 0; $rw < $maxRow; $rw++){ echo ""; for($cl=0; $cl <$maxCol;$cl++){ echo ""; } echo ""; } echo "
"; echo $mat[$rw][$cl]; 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 "
"; ?>