La información para resolver el script la saque de:
http://www.monografias.com/trabajos16/metodos-lineales/metodos-lineales.shtml
Y para resolver la matriz de Gauss-Jordan de:
http://www.phpmath.com/home?op=cat&cid=17
//Por razones anti-spam del foro no puedo colocar links directos aun
Código PHP:
<?php
/**
* @class GaussianElimination.php
*
* Gaussian elimination solver with partial pivoting. Originally
* written in Java by Robert Sedgewick and Kevin Wayne:
*
* @see http://www.cs.princeton.edu/introcs/95linear/GaussianElimination.java.html
*
* Ported to PHP by Paul Meagher
*
* @modified June 12/2007 reimplemented as a GaussianElimination.php class
* @modified March 26/2007 implemented as a function gauss($A, $b)
* @version 0.3
*/
class GaussianElimination {
/**
* Smallest deviation allowed in floating point comparisons.
*/
const EPSILON = 1e-10;
/**
* Implements gaussian elimination solver with partial pivoting.
*
* @param double[][] $A coefficient matrix
* @param double[] $b output vector
* @return double[] $x solution vector
*/
public static function solve($A, $b) {
// number of rows
$N = count($b);
// forward elimination
for ($p=0; $p<$N; $p++) {
// find pivot row and swap
$max = $p;
for ($i = $p+1; $i < $N; $i++)
if (abs($A[$i][$p]) > abs($A[$max][$p]))
$max = $i;
$temp = $A[$p]; $A[$p] = $A[$max]; $A[$max] = $temp;
$t = $b[$p]; $b[$p] = $b[$max]; $b[$max] = $t;
// check if matrix is singular
if (abs($A[$p][$p]) <= EPSILON) die("Matrix is singular or nearly singular");
// pivot within A and b
for ($i = $p+1; $i < $N; $i++) {
$alpha = $A[$i][$p] / $A[$p][$p];
$b[$i] -= $alpha * $b[$p];
for ($j = $p; $j < $N; $j++)
$A[$i][$j] -= $alpha * $A[$p][$j];
}
}
// zero the solution vector
$x = array_fill(0, $N-1, 0);
// back substitution
for ($i = $N - 1; $i >= 0; $i--) {
$sum = 0.0;
for ($j = $i + 1; $j < $N; $j++)
$sum += $A[$i][$j] * $x[$j];
$x[$i] = ($b[$i] - $sum) / $A[$i][$i];
}
return $x;
}
}
/*
$A = array(array(0, 1, 1, 1),
array(2, 4, -2, 3),
array(0, 3, 15, -1),
array(0, 3, 15, -4));
$b = array(4, 2, 36, 10);
$g = new GaussianElimination;
$x = $g->solve($A, $b); */
/*
$x es el vector que tiene los valores de X
$y es el vector con los valores de Y
*/ function tendenciaPolinomial($x,$y,$grado)
{
$tamX=sizeof($x);
$tamY=sizeof($y);
$sumX=array();
$yPrima=array();
$A=array();
$b=array();
$gTotal=2*$grado;
for($i=0;$i<=$gTotal;$i++) //For que crea los valores que van a insertarse en la matriz
{
for($j=0;$j<$tamX;$j++)
{
$xPrima[$i][$j]=pow($x[$j],$i); //El valor de cada multiplicacion
$sumX[$i]+=$xPrima[$i][$j]; //La sumatoria de la multiplicacion
$yAprox[$i]+=$xPrima[$i][$j]*$y[$j]; //La suma de las Y*x
}
//echo "<br> sumX[$i]: ".$sumX[$i];
//echo "<br> yAprox[$i]: ".$yAprox[$i];
}
for($i=0;$i<=$grado;$i++) //Creacion de la matriz
{
for($j=0;$j<=$grado;$j++)
{
$s=$i+$j;
$A[$i][$j]=$sumX[$s];
//echo "[".$A[$i][$j]."] ";
}
//echo "<br>";
}
for($i=0;$i<=$grado;$i++) //Vector de Respuestas
{
$yPrima[$i]=$yAprox[$i];
//echo "[".$yPrima[$i]."]<br>";
}
$g = new GaussianElimination();
$x1 = $g->solve($A, $yPrima);
return $x1;
}
function vectorTendencia($x,$y,$grado)
{
$x1=tendenciaPolinomial($x,$y,$grado);
$tamX=sizeof($x);
$tamX1=sizeof($x1);
$yPrima=array();
for($i=0;$i<$tamX;$i++)
{
for($j=0;$j<$tamX1;$j++)
{
$s2=pow($x[$i],$j); //X^i
$valor=$x1[$j]*$s2; //bi*X^i
$yPrima[$i]+=$valor; //Valor de Yi
}
}
return $yPrima;
}
?>
Código PHP:
$gradoPolinomio=3; //El grado de la funcion
$x=array(0,1,2,3,4,5,6,7,8,9); //Vector con los valores del eje X
$y=array(9.1,7.3,3.2,4.6,4.8,2.9,5.7,7.1,8.8,10.2); //Vector con los valores del eje Y
$y1=vectorTendencia($x,$y,$gradoPolinomio); //Vector de Respuestas
Saludos =)