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.
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 |
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]);
}
}