# PHP Gauss

unknown
php
3 years ago
3.4 kB
1
Indexable
Never
```<?php
// PHP program to demonstrate working
// of Guassian Elimination method

\$N = 3; // Number of unknowns

// function to get matrix content
function gaussianElimination(\$mat)
{
global \$N;

/* reduction into r.e.f. */
\$singular_flag = forwardElim(\$mat);

/* if matrix is singular */
if (\$singular_flag != -1)
{
print("Singular Matrix.\n");

/* if the RHS of equation corresponding to
zero row is 0, * system has infinitely
many solutions, else inconsistent*/
if (\$mat[\$singular_flag][\$N])
print("Inconsistent System.");
else
print("May have infinitely many solutions.");

return;
}

/* get solution to system and print it using
backward substitution */
backSub(\$mat);
}

// function for elementary operation
// of swapping two rows
function swap_row(&\$mat, \$i, \$j)
{
global \$N;
//printf("Swapped rows %d and %d\n", i, j);

for (\$k = 0; \$k <= \$N; \$k++)
{
\$temp = \$mat[\$i][\$k];
\$mat[\$i][\$k] = \$mat[\$j][\$k];
\$mat[\$j][\$k] = \$temp;
}
}

// function to print matrix content at any stage
function print1(\$mat)
{
global \$N;
for (\$i=0; \$i<\$N; \$i++, print("\n"))
for (\$j=0; \$j<=\$N; \$j++)
print(\$mat[\$i][\$j]);

print("\n");
}

// function to reduce matrix to r.e.f.
function forwardElim(&\$mat)
{
global \$N;
for (\$k=0; \$k<\$N; \$k++)
{
// Initialize maximum value and index for pivot
\$i_max = \$k;
\$v_max = \$mat[\$i_max][\$k];

/* find greater amplitude for pivot if any */
for (\$i = \$k+1; \$i < \$N; \$i++)
if (abs(\$mat[\$i][\$k]) > \$v_max)
{
\$v_max = \$mat[\$i][\$k];
\$i_max = \$i;
}

/* if a prinicipal diagonal element is zero,
* it denotes that matrix is singular, and
* will lead to a division-by-zero later. */
if (!\$mat[\$k][\$i_max])
return \$k; // Matrix is singular

/* Swap the greatest value row with current row */
if (\$i_max != \$k)
swap_row(\$mat, \$k, \$i_max);

for (\$i = \$k + 1; \$i < \$N; \$i++)
{
/* factor f to set current row kth element to 0,
* and subsequently remaining kth column to 0 */
\$f = \$mat[\$i][\$k]/\$mat[\$k][\$k];

/* subtract fth multiple of corresponding kth
row element*/
for (\$j = \$k + 1; \$j <= \$N; \$j++)
\$mat[\$i][\$j] -= \$mat[\$k][\$j] * \$f;

/* filling lower triangular matrix with zeros*/
\$mat[\$i][\$k] = 0;
}

//print(mat); //for matrix state
}
//print(mat);	 //for matrix state
return -1;
}

// function to calculate the values of the unknowns
function backSub(&\$mat)
{
global \$N;
\$x = array_fill(0, \$N, 0); // An array to store solution

/* Start calculating from last equation up to the
first */
for (\$i = \$N - 1; \$i >= 0; \$i--)
{
\$x[\$i] = \$mat[\$i][\$N];

/* Initialize j to i+1 since matrix is upper
triangular*/
for (\$j = \$i + 1; \$j < \$N; \$j++)
{
/* subtract all the lhs values
* except the coefficient of the variable
* whose value is being calculated */
\$x[\$i] -= \$mat[\$i][\$j] * \$x[\$j];
}

/* divide the RHS by the coefficient of the
unknown being calculated */
\$x[\$i] = \$x[\$i] / \$mat[\$i][\$i];
}

print("\nSolution for the system:\n");
for (\$i = 0; \$i < \$N; \$i++)
print(number_format(strval(\$x[\$i]), 6)."\n");
}

// Driver program

/* input matrix */
\$mat = array(array(3.0, 2.0,-4.0, 3.0),
array(2.0, 3.0, 3.0, 15.0),
array(5.0, -3, 1.0, 14.0));

gaussianElimination(\$mat);

// This code is contributed by mits
?>
```