Raices de Polinomios

Anuncio
Raices de Polinomios
Jorge Eduardo Ortiz Triviño
[email protected]
http://www.docentes.unal.edu.co/jeortizt/
Definición
Un polinomio de grado n es una expresión de la forma:
P(x) = anxn + an-1xn-1 + ... +a1x + a0
Donde an <> 0
Teorema (teorema fundamental del álgebra): Si P(x) es un
polinomio de grado n >= 1, entonces P(x) = 0 tiene al menos
una raíz (posiblemente compleja).
Corolario
Si P(x) es un polinomio de grado n >= 1, entonces existen
constantes únicas x1, x2, ... xk, posiblemente complejas, y
enteros positivos m1, m2, ..., mk, tales que:
k
m
i 1
i
n
y
P( x)  an x  x1 
m1
x  x2 m ...x  xk m
2
k
Método de Horner
Sea
P(x) = anxn + an-1xn-1 + ... +a1x + a0
Si bn = an y
bk = ak + bk+1x0 para k = n – 1, n – 2, ..., 1, 0
Por tanto b0 = P(x0). Más aún, si
Q(x) = bnxn–1 + bn-1xn-2 + ... +b2x + b1
Entonces
P(x) = (x – x0) Q(x) + b0
Regla de Horner
Teorema del resto:
P(a) es el resto de la división de P(x) por (x  a)
P(x) = Q(x)(x-a) + R(x); grado(R(x))= 0; P(a) = R
Consecuencia: P’(a) es el valor del cociente anterior en x = a
P’(x) = Q’(x)(x-a) + Q(x) ; P’(a) = Q(a)
Algoritmo de Horner:
qn-1 = an
for k = n-2, n-3, … , 0 do
bk = ak+1+aqk+1
end
P(a) = a0+aq0
Aplicaciones del
algoritmo de Horner
 Cálculo del cociente y el resto de dividir un polinomio
P(x) por (x-a): Q(x) y R con
P(x)= Q(x)(x-a)+R.
 Evaluación de un polinomio P(x) en un valor real a: P(a).
 Deflacción de un polinomio: si a es raíz de P(x), P(x) es
divisible por (x-a) y Q(x) = P(x)/(x-a) es una deflacción.
 Método de Newton para polinomios
P( x )
n
x
 x 
n 1
n
P' ( x )
n
Ejemplo
P(x) = x4 - 5x3 + 4x2 - 3x + 2
1
5
4
1
2
3
6
2
2
3
2
 4  14
 7  12
Cociente
Resto = p(2)
p'(2)
Q(x) = x3 - 3x2 - 2x - 7
1
3
2
1
2
1
2 8
 4  15
2
7
Paso de Newton
x  p(x)/p'(x) =
2  12/15 = 6/5
Acotación de raíces reales
P(x)=anxn+an-1xn-1+…+a1x+a0, an 0
 Cota general (Mc Laurin): Sean A = max{|an-1|, …, |a1|,
|a0|}, M = {|an/a0|, …, |a1/a0|}, y sea r con P(r) = 0, entonces
1/(1+M) < |r| < 1+(A/|an|)
 Regla de Newton: Un número natural k es cota superior de
las raíces positivas de P(x) si
P(k)0, P’(k)0, …, P(n-1(k)0, P(n(k)>0.
 Regla de Laguerre: k es cota superior de las raíces positivas
de P(x) si al dividir P(x) por (x-k) todos los coeficientes del
cociente son 0 y el resto es >0.
Recuento de raíces reales
P(x)=anxn+an-1xn-1+…+a1x+a0, an 0
v(c1, c2, …, cn) = nº de cambios de signo en la suc. sin ceros
Regla de los signos de Descartes:
v(an,an-1, …, a0)  nº raíces reales positivas (mod 2)
 Regla de Sturn: Si P(x) no tiene raíces multiples y P(a)  0,
P(b)  0 para ciertos a, b , a<b. Entonces el número de raíces
reales de P(x) en el intervalo (a, b) coincide con
v(P0(a), …, Pm(a)) - v(P0(b), …, Pm(b)),
siendo P0(x) = P(x), P1(x) = P’(x),
P2(x) = - R2(x) con P(x)=P’(x)Q2(x)+R2(x), …,
Pk(x) = - Rk(x) con Pk-2(x)=Pk-1(x)Qk(x)+Rk(x), …, Pm(x)=cte.
Ejercicios
Evaluar:
P(x) = 2x4 – 3x2 + 3x – 4
en x0 = –2
P(x) = 7x5 + 6x4 – 6x3 + 3x – 4
en x0 = 3
P(x) = – 5x6 + 3x4 + 2x2 – 4x
en x0 = –1
Método de Horner en C
double horner(double p[],int n, double x){
double y = p[0];
int i;
for(i = 1; i<n; i++){
y = x*y + p[i];
}
return y;
}
double eval(double p[],int n, double x){
double s = 0;
int i;
for(i = 0; i<n; i++){
s = s + p[i]*pow(x,n-i-1);
}
return s;
}
Ejercicio
• Implementar el método de Horner en C++.
Evaluación de la derivada
Dado que:
P(x) = (x – x0) Q(x) + b0
donde
Q(x) = bnxn–1 + bn-1xn-2 + ... +b2x + b1
Derivando
P’(x) = Q(x)+(x – x0)Q’(x)
En x = x0,
P’(x0) = Q(x0)
Método de Newton para polinomios
Se puede aplicar el método de Newton para polinomios
evaluando el polinomio y su derivada mediante el método de
Horner.
El esquema sería
Pxn 
Pxn 
xn 1  xn 
 xn 
P' xn 
Qxn 
Newton para polinomios en C
double NewtonPol(double p[],int n,double x0,double ee,
int ni){
int i=0;
double f,df,x = x0,error;
while(i<ni){
hornerDer(p,n,x,f,df);
x = x0 - f/df;
error = fabs((x-x0)/x);
if(error<=ee)
return x;
i++;
x0 = x;
}
std::cout << "No solución en " << i << " pasos\n";
return x;
}
Método de Müller
Utiliza tres aproximaciones: x0, x1, x2.
Determina la siguiente aproximación x3 encontrando la
intersección con el eje x de la parábola definida por los
puntos (x0,f(x0)), (x1,f(x1)), (x2,f(x2)).
f
x0 x1
x2 x3
Método de Müller
Se considera el polinomio
P(x) = a(x – x2)2 + b(x – x2) + c
Se puede encontrar a, b y c resolviendo
f(x0) = a(x0 – x2)2 + b(x0 – x2) + c
f(x1) = a(x1 – x2)2 + b(x1 – x2) + c
f(x2) = a(x2 – x2)2 + b(x2 – x2) + c
Método de Müller
Se llega a
c  f ( x2 )
2
2

x0  x2   f ( x1 )  f ( x2 )  x1  x2   f ( x0 )  f ( x2 )
b
x0  x2 x1  x2 x0  x1 

x1  x2  f ( x0 )  f ( x2 )  x0  x2  f ( x1 )  f ( x2 )
a
x0  x2 x1  x2 x0  x1 
Método de Müller
Para minimizar el error al resolver la cuadrática P(x) = 0, se
calcula x3 con
x3  x2 
2c
b  signo(b) b 2  4ac
El proceso se reinicia tomando ahora x1, x2, y x3.
Ejemplo
P(x) = 16x4 – 40x3 + 5x2 + 20x + 6
x0 =
0.5
x1 = -0.5
x2 =
0.0
i
xi
P(xi)
3
-0.555556 + ( -0.598352)i
-29.400701 + (
3.898725)i
4
-0.435450 + ( -0.102101)i
1.332225 + (
1.193097)i
5
-0.390631 + ( -0.141852)i
0.375058 + (
0.670168)i
6
-0.357698 + ( -0.169926)i
-0.146750 + (
0.007446)i
7
-0.356051 + ( -0.162856)i
-0.001840 + ( -0.000538)i
8
-0.356062 + ( -0.162758)i
0.000002 + ( -0.000001)i
Ejemplo
x0 =
2.5
x1 =
2.0
x2 =
2.3
i
xi
3
1.960592 + (
0.000000)i
-0.611310 + (
0.000000)i
4
1.970564 + (
0.000000)i
0.007455 + (
0.000000)i
5
1.970447 + (
0.000000)i
0.000029 + (
0.000000)i
x0 =
0.5
x1 =
1.0
P(xi)
x2 =
1.5
i
xi
P(xi)
3
1.287855 + (
0.000000)i
-1.376275 + (
0.000000)i
4
1.237459 + (
0.000000)i
0.126945 + (
0.000000)i
5
1.241605 + (
0.000000)i
0.002193 + (
0.000000)i
6
1.241677 + (
0.000000)i
-0.000001 + (
0.000000)i
Método de Bairstow
El enfoque de Bairstow es el de utilizar el Método de Newton
para ajustar los coeficientes r y s en la cuadrática x2 – rx + s
hasta que sus raíces sean también raíces del polinomio que se
quiere resolver.
Con estos coeficientes se determina la cuadrática
correspondiente que se utiliza para simplificar la expresión,
eliminando estas raíces del conjunto buscado.
El proceso se repite hasta que el polinomio se convierta en uno
cuadrático o lineal, momento en que todas las raíces quedan
determinadas.
La División Larga de un polinomio
n
Px    ai x i
i 0
por x2 – rx – s resulta en un cociente de la forma
n
Qx    bi x i
i 0
y un residuo b1(x – r) + b0 tal que
 n2 i 
Px   x  rx  s   bi x   b1 x  r   b0
 i 2


2

Se utiliza la división sintética para obtener la división entre el factor
cuadrático:
bn = an
bn–1 = an–1 + rbn
bi = ai + rbi+1 + sbi+2 (i = n – 2,…, 0)
El método se reduce a determinar los valores de r y s que hacen que el factor
cuadrático sea un divisor exacto.
Se utiliza el método de Newton-Raphson. Se calculan incrementos Dr y Ds
para acercarse a la solución.
b1
b
Dr  1 Ds  b1
r
s
b0
b
Dr  0 Ds  b2
r
s
Las derivadas parciales se calculan por un proceso de división sintética
similar al utilizado para calcular las b’s.
cn = bn
cn–1 = bn–1 + rcn
ci = bi + rci+1 + sci+2 (i = n – 2,…, 1)
Donde:
b1
b
, c3  1
r
s
b
b
c1  0 , c2  0
r
s
c1 
Se resuelven las ecuaciones para Dr y Ds y se emplean para mejorar r y s.
Tarea
Escriba un programa en C amigable para el usuario que utilice la
función bairstow() para encontrar las raíces de un polinomio.
Deberá pedir el grado del polinomio, los coeficientes, los valores
iniciales para la función bairstow, el error esperado y el número
de iteraciones máximo.
Deberá dar como salida una lista de las raíces del polinomio y/o
una indicación de error.
Descargar