Foros del Web » Programación para mayores de 30 ;) » Programación General »

Linea de Tendencia Polinomial PHP

Estas en el tema de Linea de Tendencia Polinomial PHP en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 30/07/2008, 10:32
 
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 la misma, espero que les sirva

Saludos =)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:47.