Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
3.3.2 método de bairstow (1)
1. Método de Bairstow
En análisis numérico, Método de Bairstow es un eficiente algoritmo para
encontrar raíces de un verdadero polinómico del grado arbitrario. El algoritmo
primero apareció en el apéndice de los 1920 que el libro “aplicó la
aerodinámica” cerca Leonard Bairstow. El algoritmo encuentra las raíces
adentro conjugación del complejo pares usando solamente aritmética
verdadera.
Vea algoritmo de la búsqueda del radical para otros algoritmos.
Descripción del método
El acercamiento de Bairstow es utilizar Método del neutonio para ajustar los
coeficientes u y v en cuadrático x2
+ ux + v hasta que sus raíces son también
raíces del polinómico que son solucionadas. Las raíces de la ecuación
cuadrática pueden entonces ser determinadas, y el polinomio se puede dividir
por la ecuación cuadrática para eliminar esas raíces. Este proceso entonces se
itera hasta que el polinomio llega a ser cuadrático o linear, y se han
determinado todas las raíces.
División 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 ecuación cuadrática divide uniformemente el polinomio cuando
Valores de u y v para cuál ocurre el puede ser descubierto escogiendo valores
que comienzan e iterando el método del neutonio en dos dimensiones hasta
convergencia ocurre.
Funcionamiento
El algoritmo de Bairstow hereda la convergencia cuadrática del método del
neutonio, excepto en el caso de factores cuadráticos de la multiplicidad más
arriba de 1, cuando la convergencia puede ser algo lenta.
Ejemplo en MATLAB
% METODO DE BAIRSTOW
% JUAN CARLOS ALDAZ ROSAS (CREDITOS)
% UNIVERSIDAD DE GUADALAJARA
2. 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 ecuación
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 estimación
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:nn')
break
end
while 1%ciclo que nos permitira ir evaluando las raíces 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
3. 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.
4. 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;
5. 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:nn')
constante=z
end
raices=raiz';
sort raices;
raices
6. 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:nn')
constante=z
end
raices=raiz';
sort raices;
raices