El método de
Bairstow es un método iterativo, basado en el método de Müller y de
Newton Raphson. Dado un polinonio fn(x)
se encuentran dos factores, un polinomio cuadrático f2(x) = x2 – rx – s y fn-2(x). El procedimiento general para el método de
Bairstow es:
La principal diferencia de este método,
respecto a otros, es que permite calcular todas las raíces de un polinomio
(reales e imaginarias).
Para calcular la división de polinomios,
hacemos uso de la división sintética. Así dado
fn(x) = anxn
+ an-1xn-1 + … + a2x2 + a1x
+ a0
Al dividir entre f2(x) = x2 – rx – s, tenemos como resultado
el siguiente polinomio
fn-2(x) = bnxn-2
+ bn-1xn-3 + … + b3x + b2
con un residuo R = b1(x-r) + b0, el residuo será cero solo si b1 y b0 lo
son.
Los términos b, los calculamos utilizamos división sintética, la cual puede
resolverse utilizando la siguiente relación de recurrencia
bn = an
bn-1 = an-1
+ rbn
bi = ai + rbi+1 + sbi+2
Una manera de determinar los
valores de r y s que hacen cero el residuo es utilizar el Método de
Newton-Raphson. Para ello
necesitamos una aproximación lineal de b1 y b0 respecto a r y s la
cual calculamos utilizando la serie de Taylor
donde los valores de r y s están dados y calculamos los incrementos dr y ds que hacen a b1(r+dr, s+ds) y b0(r+dr, s+dr) igual a cero. El sistema de ecuaciones que tenemos que resolver es:
Bairtow muestra que las derivadas parciales pueden obtener haciendo un procedimiento similar a la división sintética, así
cn = bn
cn-1 = bn-1
+ rcn
ci = bi
+ rci+1 + sci+2
donde
Sustituyendo término
Ejemplo 1
Dado el polinomio f5(x) = x5 - 3.5x4 + 2.75x3 + 2.125x2 - 3.875x + 1.25, determinar los valores de r y s que hacen el resido igual a cero. Considere r0 = -1 y s0 = 2.
Solución.
Iteración 1.
La división sintética con el polinomio f2(x) = x2 -x + 2.0 da como resultado
f3(x) = x3 - 4.5x2 + 9.25x - 16.125 Residuo = {30.75, -61.75}
Aplicando el método de Newton tenemos
-43.875 |
16.75 |
|
dr |
|
-30.75 |
108.125 |
-43.875 |
|
ds |
|
61.75 |
de donde
r1 = -1.0 + 2.7636812508572213 =1.7636812508572213
s1 = 2.0 + 5.403374022767796 =7.403374022767796
Iteración 2.
La división sintética con el polinomio f2(x) = x2 -1.7636812508572213x - 7.403374022767796 da como resultado
f3(x) = x3 - 1.7363187491427787x2 +
7.091061199392814x - 1.776754563401905
Residuo = {51.75640698828836, 105.68578319650365}
Aplicando el método de Newton tenemos
27.628006 |
14.542693 |
|
dr |
|
-51.75640 |
208.148405 |
27.62800 |
|
ds |
|
-105.68578 |
de donde
r2 = 1.7636812508572213 - 0.04728019113442016 = 1.7164010597228012
s2 = 7.403374022767796 - 3.469106187802152 = 3.934267834965644
Iteración 3.
La división sintética con el polinomio f2(x)= x2 - 1.7164010597228012x - 3.934267834965644 da como resultado
f3(x) = x3 - 1.7835989402771988x2
+ 3.622896723753395x + 1.3261878347051992
Residuo = {12.654716254544885, 28.1881465309956}
Aplicando el método de Newton tenemos
13.83497 |
7.44182 |
|
dr |
|
-12.65471 |
65.679212 |
13.83497 |
|
ds |
|
-28.18814 |
de donde
r3 = 1.7164010597228012 - 0.11666951305731528 = 1.599731546665486
s3 = 3.934267834965644 - 1.4835870659929915 = 2.4506807689726524
En resumen
k |
r |
s |
Residuo |
|
0 |
-1 |
2 |
30.75 |
-61.75 |
1 |
1.76368 |
7.403374 |
51.756406 |
105.68578 |
2 |
1.71640 |
3.93426 |
12.65471 |
28.18814 |
3 |
1.599731 |
2.450680 |
2.89958 |
8.15467 |
4 |
1.33354 |
2.18666 |
0.760122 |
2.522228 |
5 |
1.11826 |
2.11302 |
0.271940 |
0.607688 |
6 |
1.02705 |
2.02317 |
0.04313 |
0.11185 |
7 |
1.00165 |
2.00153 |
0.00277 |
0.00634 |
8 |
1.00000 |
2.00000 |
1.13930E-5 |
2.67534E-5 |
La solución es:
f3(x) = x3 - 2.53x2
+ 2.25x - 0.625 y f2(x) = x2
- x - 2
Las raíces de f2(x) = x2
- x - 2, son
x1 = 2
x2 = -1
Si repetimos el ejemplo pero ahora considerando
el polinomio f3(x) = x3 - 2.53x2 + 2.25x -
0.625 , podemos calcular el total de las raíces del polinomio original.
Ejemplo 2
Dado el polinomio f5(x) = x5 - 3.5x4 + 2.75x3
+ 2.125x2 - 3.875x + 1.25, determinar las raíces de este
polinomio. Considere r0 = -1 y s0 = -1.
Paso 1.
f5(x)
= x5 - 3.5x4 +
2.75x3 + 2.125x2 - 3.875x + 1.25
f5(x)
=( x3 - 4x2 + 5.25x - 2.5)*( x2 +0.5x - 0.5)
Las raíces de x2 +0.5x - 0.5=0 son
x1 = 0.5
x2 =-1.0
Paso 2.
f3(x) = x3 - 4x2 + 5.25x - 2.5
f3(x) =(x - 2)*(x2 - 2x +1.25)
Las raíces de x2 - 2x +1.25=0 son
x3 = 1.0 + j0.5
x4 =-1.0 - j0.5
f1(x)
=(x - 2)
La raíz de este polinomio es
x5
= 2;
Todas la raíces de f5(x)
son x = [0.5, 1.0, (1.0 + j0.5), (1
- j0.5), 2]
Implementación en Java.
package ejemplos;
/**
* <p>Title: Meétodo de Baritow </p>
* <p>Description: Calcula todas las raices de un polinomio
de grado n</p>
* <p>Copyright:
Copyright (c) 2003</p>
*
<p>Company: UMSNH</p>
*
@author Dr. Felix Calderon Solorio
* @version 1.0
*/
public class ej065 {
public static
void main(String[] args) {
//double
a[] = {-2.5, 5.25, -4, 1};
double a[]
={1.25, -3.875, 2.125, 2.75, -3.5, 1};
int n =
a.length;
double re[]
= new double[n];
double im[]
= new double[n];
Bairstow(a,
-1, -1, re, im);
//Bairstow(a, -1, 2, re, im);
}
static public
void Bairstow(double a[], double r0, double s0, double re[], double im[])
{
int n =
a.length, iter =0;
double b[]
= new double[n], c[] = new double[n];
double ea1
= 1, ea2 = 1, T = 0.00001;
double
r=r0, s=s0,det, ds, dr;
int MaxIter
= 100, i;
for(iter=0;
iter< MaxIter && n>3; iter++)
{
do {
Division_Derivada(a,
b, c, r, s, n);
/*
System.out.println("Solucionando ");
System.out.print("fn(x) = "); imprime(a, n);
System.out.print("fn-2(x) = "); imprime2(b, n);
System.out.println("f2(x) = x2 + " + r + "x + " + s);
System.out.println(c[2] + " " + c[3] + " = " +
-b[1]);
System.out.println(c[1] + " " + c[2] + " = " +
-b[0]);
*/
det =
c[2]*c[2] - c[3]*c[1];
if(det!=0)
{
dr =
(-b[1]*c[2] + b[0]*c[3])/det;
ds =
(-b[0]*c[2] + b[1]*c[1])/det;
/*
System.out.println("*********************************");
System.out.println(r+dr +" = " + r + " + " + dr);
System.out.println(s+ds +" = " + s + " + " + ds);
System.out.println("-----------------------------------");*/
r =
r+dr;
s =
s+ds;
if(r!=0) ea1 = Math.abs(dr/r)*100.0;
if(s!=0) ea2 = Math.abs(ds/s)*100.0;
}
else
{
r =
5*r+1;
s =
s+1;
iter = 0;
}
}
while ((ea1 > T) &&
(ea2 > T));
raices(r, s, re, im, n);
System.out.println("iter " +iter);
System.out.print("fn(x) = "); imprime(a, n);
System.out.print("fn-2(x) = "); imprime2(b, n);
System.out.println("f2(x)
= x2 -(" +r + ")x -(" +s +")");
n = n-2;
for(i=0;
i<n; i++)
a[i] =
b[i+2];
if (n
< 4) break;
}
if(n==3)
{
System.out.println("n = " + n);
r =
-a[1]/a[2];
s =
-a[0]/a[2];
imprime(a, n);
raices(r,
s, re, im, n);
}
else
{
re[n-1] =
-a[0]/a[1];
im[n-1] =
0;
}
for(i=1;
i<re.length; i++)
System.out.println( "X["+i+"]= " + re[i] + " j
" + im[i]);
}
public static
void Division_Derivada(double a[], double b[], double c[], double r, double s,
int n)
{
int i;
b[n-1] =
a[n-1];
b[n-2] =
a[n-2] + r*b[n-1];
c[n-1] =
b[n-1];
c[n-2] =
b[n-2] + r*c[n-1];
for(i=n-3;
i>=0; i--)
{
b[i] =
a[i] + r*b[i+1] + s*b[i+2];
c[i] =
b[i] + r*c[i+1] + s*c[i+2];
}
}
public static
void imprime(double x[], int n)
{
int i;
for (i = n
- 1; i >= 0; i--)
if(x[i]
> 0) System.out.print("+ " +x[i] + "x"+i+" ");
else System.out.print("-
" + -x[i] + "x"+i+" ");
System.out.println("");
}
public static
void imprime2(double x[], int n)
{
int i;
for (i = n
- 1; i >= 2; i--)
if(x[i]
> 0) System.out.print("+ " +x[i] + "x"+(i-2)+"
");
else System.out.print("-
" + -x[i] + "x"+(i-2)+" ");
System.out.println("Residuo = {"+ x[1]+ ", " + x[0]
+ "}");
}
public static
void raices(double r, double s, double re[], double im[], int n)
{
double d =
r*r + 4*s;
if(d >
0)
{
re[n-1] = (r + Math.sqrt(d))/2.0;
re[n-2] =
(r - Math.sqrt(d))/2.0;
im[n-1] =
0;
im[n-2] =
0;
}
else
{
re[n-1] =
r/2.0;
re[n-2] =
re[n-1];
im[n-1] =
Math.sqrt(-d)/2.0;
im[n-2] =
-im[n-1];
}
}
}