Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/07/2008, 10:44
fer135
 
Fecha de Ingreso: julio-2008
Mensajes: 12
Antigüedad: 15 años, 9 meses
Puntos: 1
Linea de Tendencia Polinomial PHP

Hola, bueno básicamente esta es una forma de resolver la linea de tendencia polinomial.

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-10);

    
// 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;
}
?>
Ejemplo
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 
Si grafican en excel o cualquier otro programa que quieran, podrán ver que la linea de tendencia polinomial del mismo grado es el mismo, espero que les sirva
Saludos =)