Está en la página 1de 5

Mtodo de Bairstow

En anlisis numrico, Mtodo de Bairstow es un eficiente algoritmo para


encontrar races de un verdadero polinmico del grado arbitrario. El algoritmo
primero apareci en el apndice de los 1920 que el libro aplic la
aerodinmica cerca Leonard Bairstow. El algoritmo encuentra las races
adentro conjugacin del complejo pares usando solamente aritmtica
verdadera.
Vea algoritmo de la bsqueda del radical para otros algoritmos.
Descripcin del mtodo
El acercamiento de Bairstow es utilizar Mtodo del neutonio para ajustar los
coeficientes u y v en cuadrtico x2 + ux + v hasta que sus races son tambin
races del polinmico que son solucionadas. Las races de la ecuacin
cuadrtica pueden entonces ser determinadas, y el polinomio se puede dividir
por la ecuacin cuadrtica para eliminar esas races. Este proceso entonces se
itera hasta que el polinomio llega a ser cuadrtico o linear, y se han
determinado todas las races.
Divisin larga de un polinomio
por x2 + ux + v rinde un cociente
y un resto cx + d tales que
Las variables c, d, y {bi} son las funciones de u y v. Pueden ser encontrados
recurrentemente como sigue.
La ecuacin cuadrtica divide uniformemente el polinomio cuando
Valores de u y v para cul ocurre el puede ser descubierto escogiendo valores
que comienzan e iterando el mtodo del neutonio en dos dimensiones hasta
convergencia ocurre.
Funcionamiento
El algoritmo de Bairstow hereda la convergencia cuadrtica del mtodo del
neutonio, excepto en el caso de factores cuadrticos de la multiplicidad ms
arriba de 1, cuando la convergencia puede ser algo lenta.

Ejemplo en MATLAB
% METODO DE BAIRSTOW
% JUAN CARLOS ALDAZ ROSAS (CREDITOS)
% UNIVERSIDAD DE GUADALAJARA

clear
clc
z=input ('TECLEE LOS COEFICIENTES DEL POLINOMIO ENTRE CORCHETES:\n');
%z=[1 -3.5 2.75 2.125 -3.875 1.25];
n=length(z);%se define la longitud de la ecuacin
it=0;%se inicia el contador de iteraciones
limit_it=1000;%se define el limite en el numero de iteraciones
tol=.0001;%se define la tolerancia de la estimacin
raiz(1:n-1)=0;
ri=0;
r=2;%se supone el valor de r que es el coeficiente de primer grado
s=2;%se supone el valor de s que es el termino independiente
err=1;%se inicializa el valor del error en r igual a 1
ers=1;%se inicializa el valor del error en s igual a 1
if z(1)==0
fprintf('EL PRIMER COEFICIENTE NO DEBE SER CERO:\n\n')
break
end
while 1%ciclo que nos permitira ir evaluando las races del polinomio
if (n-1>=3);else break,end%condicion si el grado de la raiz es mayor a 3
t=[1 r s];%esta es el polinomio cuadratico de inicio
it=it+1;%se incrementa en 1 la iteracion
[x,y]=deconv(z,t);%se divide la ecuacion entre el polinomio de inicio
length(x);%se define la longitud del polinomio resultante
length(y);%se define la longitud del residuo resultante
x=[x,0,0];%se ajusta la variable x para poder sumarla al residuo
x=[x+y];%suma del cociente mas residuo
c(1)=z(1);%valor de los coeficientes de la funcion a
c(2)=z(2)+(-r*c(1));%evaluar, en virtud de que el coeficiente de mayor

for i=3:n%grado sera equivalente al coeficiente de menor grado


m=n-i;%y en este ciclo se realiza la inversion de ellos
c(n-m)=z(i)+(-r*x(n-m-1))+(-s*x(n-m-2));%algoritmo de inversion
end
d(1)=c(1);%valor de los coeficientes de las derivadas parciales
d(2)=c(2)+(-r*d(1));%valor de los coeficientes de las derivadas parciales
for i=3:(n-1);%se realizan los calculos de los coeficientes
m=n-i;%hasta el grado maximo del polinomio
d(n-m)=c(i)+(-r*d(n-m-1))+(-s*d(n-m-2));%algoritmo de calculo
end
e=[d(n-2),d(n-3);d(n-1),d(n-2)]\[-c(n-1);-c(n)];%calculo del
d_r=e(1);%nuevo valor del coeficientes de primer grado
d_s=e(2);%nuevo valor del termino independiente
if r==0
else
err=d_r/r;%calculo del error para coeficiente de primer grado
end
if s==0
else
ers=d_s/s;%calculo del error para termino independiente
end
r=r-d_r;%valor del coeficiente de primer grado
s=s-d_s;%valor del termino independiente
if ((abs (err))&(abs(ers))<=tol)%si se cumple la condicion de
ri=ri+1;
x1=(-r+sqrt(r^2-4*s))/2;%tolerancia entonces se calcula el valor del
raiz(ri)=x1;
ri=ri+1;
x2=(-r-sqrt(r^2-4*s))/2;%polinomio cuadratico.

raiz(ri)=x2;
xx=[x1,x2]';%valor del polinomio que divide exactamente a la ecuacion
tt=poly(xx);%cambio de variable para efectuar nuevamente la division
[x3,y]=deconv(z,tt);%se efectua la division
z=x3;%se hace cambio de variable
n=length(x3-1);%se determina el grado del polinomio
r=tt(1);
s=tt(2);
end
if (it>limit_it)%condicion de iteraciones
fprintf ('Exceso en el limite de iteraciones. \n');break
end%si hay exceso en el numero de iteraciones se termina el programa
end
if (n-1)==2%si la ecuacion que se introduce es de segundo grado
ri=ri+1;
x1=(-z(2)+sqrt(z(2).^2-4*z(1)*z(3)))/(2*z(1));%se calcula normalmente por
raiz(ri)=x1;
x2=(-z(2)-sqrt(z(2).^2-4*z(1)*z(3)))/(2*z(1));%medio de la formula tradicional
ri=ri+1;
raiz(ri)=x2;
end
if (n-1)==1%si el valor de la ecuacion que se introduce es de primer
if (abs(z(2))>=tol)
ri=ri+1;
x1=-z(2)/z(1);%grado solamente se hace la sustitucion.
else
x1=0;
end
raiz(ri)=x1;

x1;
end
if (n-1)==0%si el valor de la ecuacion que se introduce es una constante
fprintf('El valor que introduciste es una constante igual a:\n\n')
constante=z
end
raices=raiz';
sort raices;
raices

También podría gustarte