Raíz de polinomios

Raíz de polinomios

 

Es esta sección se analizará los métodos para encontrar las raíces de ecuaciones polinomiales de la forma general

 

fn(x) = a0 + a1x+ a2x2 + ... + anxn.

 

Evaluación de polinomios

 

Consideremos como ejemplo el siguiente polinomio.

 

f3(x) = a0 + a1x+ a2x2 + a3x3.

 

En este caso los coeficientes del polinomio los podemos poner en un vector de datos dado como a = [a0, a1, a2, a3], y realizar la evaluación polinomial utilizando ciclos. Adicionalmente necesitamos de una función que nos permita calcular la potencias de x.

 

Manipulando el polinomio, podemos dar una forma eficiente de realizar la evaluación. Así el mismo polinomio, lo podemos representar como:

 

f3(x) = a0 + x(a1+ x(a2 + xa3))

 

Note que ahora ya no tenemos potencia de x y su implementación resulta mas eficiente.

 

Ejemplo.

 

Consideremos el siguiente polinomio f3(x) = 1+2x+3x2, el cual deseamos evaluar en x = 20. Para implementarlo hacemos

 

n

p = p*x + a[i];

 

2

p = 0*20+3

p = 3

1

p = 3*20+2

p = 62

0

p = 62*20+1

p = 1241

 

Cálculo de derivadas.

 

Cuando se buscan los ceros de una función, como es el caso del método de Newton, es necesario no solo hacer la evaluación del polinomio sino calcular también su derivada. En este caso la derivada de cualquier polinomio la podemos calcular como:

 

fn(x) = anxn + an-1xn-1 + an-2xn-2 + … + a2x2+ a1x + a0 

 

f’n(x) = nanxn-1 + (n-1)an-1xn-2 + (n-2)an-2xn-3 + … + 2a2x+ a1

 

Note que el polinomio f’n(x) es un polinomio de menor grado. Así por ejemplo considerando el polinomio f3(x) = 1+2x+3x2,  tenemos que su derivada es:

 

n

df = df*x + a[i+1]*(i+1)

df

1

df = 0*20+3*2

6

0

pf = 6*20+2*1

122

 

Deflación polinomial.

 

Suponga que conoce, una de las raíces de un polinomio, podemos realizar la división de este polinomio para obtener un polinomio de grado menor. Así por ejemplo si tenemos

 

fn(x) = a0 + a1x+ a2x2 + ... + anxn.

 

Y una de sus raíces es s, entonces podemos escribir

 

fn(x) =(x-s)*(a’0 + a’1x+ a’2x2 + ... + a’n-1xn-1).

 

En este caso el residuo de la división es cero y podemos calcular un polinomio de grado n-1. Para un polinomio de orden 3 tenemos que

 

 

a3x2

(a2-a3s) x

a1-(a2-a3s)s

 

x+s

a3x3

+a2x2

+ a1x

+a0

 

-a3x2

- a3 s x2

 

 

 

0

(a2-a3s) x2

+ a1x

+a0

 

 

-(a2-a3s) x2

-(a2-a3s)sx

 

 

 

0

(a1-(a2-a3s)s)x

+a0

 

 

 

-(a1-(a2-a3s)s)x

-(a1-(a2-a3s)s)s

 

 

 

 

a0-(a1-(a2-a3s)s)s

 

La división sintética, es una manera de hacer lo mismo, pero de forma compacta. Así tenemos:

 

x+s

a3

a2

a1

a0

 

 

- a3 s

-(a2- a3 s)s

-(a1-(a2-s a3)s)s

 

a3

a2- a3 s

a1-(a2- a3 s)s

a0-(a1-(a2- a3 s)s)s

 

Ejemplo.

 

Dado el polinomio f5(x) = x5 - 7x4 – 3x3 + 79x2 – 46x –120 encontrar la división sintética con el monomio (x-4).

 

x-4

1

-7

-3

79

-46

-120

 

 

4

-12

-60

76

120

 

1

-3

-15

19

30

0

 

El polinomio resultante, en este caso, es f4(x) = x4 - 3x3 – 15x2 + 19x +30. Note que el residuo es cero.

 

Implementación en Java.

 

/**

 * <p>Title: Evaluacion polinomial</p>

 * <p>Description: Realiza la evaluacion de polinomios asi como el calculo de

 * derivadas y division sintetica</p>

 * <p>Copyright: Copyright (c) 2004</p>

 * <p>Company: UMSNH</p>

 * @author Dr. Felix Calderon Solorio

 * @version 1.0

 */

 

public class ej057 {

  public static void main(String[] args) {

 

    double a[] = {-120, -46, 79, -3, -7, 1};

    double b[] = new double [a.length];

 

    System.out.println(EvaluaPolinomio(a, 1));

    System.out.println(EvaluaDerivada(a, 1));

    DivisionSintetica(a, b, -4);

  }

 

  public static double EvaluaPolinomio(double a[], double x)

  {

    int n = a.length, i;

    double p = 0;

 

    for(i=n-1; i>=0; i--)

      p = p*x + a[i];

 

    return p;

  }

  public static double EvaluaDerivada(double a[], double x)

  {

    int n = a.length, i;

    double df = 0;

 

    for(i=n-2; i>=0; i--)

      df = df*x + a[i+1]*(i+1);

 

    return df;

  }

  public static void DivisionSintetica(double a[], double b[], double s)

  {

    int n = a.length, i;

 

    b[n-1] = a[n-1];

 

    for(i=n-2; i>=0; i--)

      b[i] = a[i] - b[i+1] * s;

 

    for(i=n-1; i>0; i--)

      System.out.print(b[i] + " ");

 

    System.out.println( "residuo = " +  b[0]);

 

  }

}

 

Regresar.