Está en la página 1de 16

ECUACIONES POLINOMIALES - 1

- 81 -

5. ECUACIONES POLINOMIALES - 2
En este tema se contina con el estudio de los mtodos que permiten encontrar las soluciones reales e imaginarias de ecuaciones polinomiales de la forma:

P n ( x)=a1 x +a 2 x
5.1. MTODO DE NEWTON-RAPHSON

n1

+a 3 x

(n2)

++an x+a n+1=0

(5.1)

El mtodo de Newton Raphson (al igual que los otros mtodos estudiados en los temas 2 y 3) permite encontrar una de las soluciones reales de una ecuacin polinomial. Si bien es posible emplear directamente los programas elaborados en dichos temas, en el caso especfico de las ecuaciones polinomiales resulta ms eficiente calcular el valor del polinomio y el de su derivada mediante el proceso de divisin sinttica. Algo que resulta particularmente til en para el mtodo de Newton Raphson (que como se sabe requiere el valor de la funcin y el de la derivada). 5.1.1. Divisin sinttica La divisin sinttica es el modo ms eficiente de calcular el valor de un polinomio y el de su derivada. As por ejemplo, si se quiere calcular el valor del siguiente polinomio y el de su derivada para x=2 (x1=2):

P 3 ( x )=x 3+x 2 3x3=0


Se divide el polinomio entre x-2 y el cociente resultante se vuelve a dividir entre x-2:
x1 = 2 1 1 -3 -3 2 1 3 1 5 6 3 6 3 valor de la funcin: f(2)

2 10 13 derivada de la funcin: f'(2)

Como se puede deducir fcilmente, si a son los coeficientes del polinomio original, los coeficientes resultantes de la divisin sinttica: b se calculan con:

b1=a 1 bi =a i+b i1x 1 {i=2 n+1


Donde n es el grado del polinomio.

(5.2)

Puesto que en ocasiones puede ser de utilidad los resultados de la divisin sinttica se elaborar una funcin para este fin y dado que la frmula es muy simple puede ser programada directamente: function b=divsin1(a,x1) n=length(a); b=0; b(1)=a(1); for i=2:n b(i)=a(i)+b(i-1)*x1; end end

- 82 -

Hernn Pearanda V.

Llamando al mdulo con los datos del ejemplo manual se obtiene: >> divsin1([1,1,-3,-3],2) b = [ 1 3 3 3 ] Que son los mismos resultados obtenidos en el ejemplo manual. Llamando nuevamente a divsin1 con los primeros tres elementos del vector resultante se obtiene: >> divsin1(ans(1:3),2) b = [ 1 5 13 ] Que tambin concuerda con los resultados del ejemplo manual. El valor del polinomio puede ser calculado tambin con polyval: >> polyval([1,1,-3,-3],2) y = 3 Es posible tambin calcular el cociente y el residuo con divide: >> syms x >> divide(x^3+x^2-3*x-3,x-2) ans = [ x^2+3*x+3 3 ] En este caso el comando divide trabaja con expresiones simblicas. Para ello es necesario declarar la o las variables simblicas con syms (como se ha hecho). El residuo (el valor de la funcin) es 3 y el cociente (la ecuacin polinomial resultante) es x3+3x+3=0, cuy+os coeficientes son los obtenidos con la divisin sinttica: >> coeff(ans(1),x,2:-1:0) ans = [ 1 3 3 ] Como otro ejemplo, se calcular el valor del siguiente polinomio y el de su derivada para x=3.1:

P 7 (x )=7x7 +3x 4 8x 4+3x9=0


>> a=[7,0,3,-8,0,0,3,-9]; >> divsin1(a,3.1) b = [ 7.0 21.7 70.27 209.837 650.4947 2016.53357 6254.254067000001 19379.1876077 ] >> divsin1(ans(1:7),3.1) b = [ 7.0 43.4 204.81 844.748 3269.2135 12151.09542 43922.649869 ] Entonces el valor del polinomio es P7(3.1)= 19379.1876077 y el de su derivada P'7(3.1)= 43922.649869. Una vez repasado el proceso de divisin sinttica se pasa a modificar el mtodo de Newton Raphson para el caso especfico de las ecuaciones polinomiales. 5.1.2. Algoritmo y cdigo El mtodo de Newton Raphson en si no cambia, slo cambia la forma en la que se calcula el valor de la funcin (del polinomio) y el de su derivada. Dado que en el mtodo de Newton Raphson slo son de inters el residuo de la primera y segunda divisin (el valor de la funcin y su derivada), no es necesario almacenar los coeficientes de los polinomios residuales. Tomando en cuenta la anterior consideracin se ha elaborado el algoritmo se presenta en la siguiente pgina.

ECUACIONES POLINOMIALES - 1

- 83 -

El cdigio respectivo en Jasymca es: function x2=newtonp(a,x1,err,li) c=1; n=length(a); while 1 f=a(1); df=0; for i=2:n df=f+df*x1; f=a(i)+f*x1; end if abs(f)<err x2=x1; return end x2=x1-f/df; printf("%f: %f\n",c,x2); if abs(x1/x2-1)<err return end if c++==li error("error-newtonp: %f\n",x2); end x1=x2; end end Llamando a la funcin con los coeficientes de la ecuacin polinomial:

P 3 ( x )=x 3+2x 2+3x+4=0


Se obtiene: >> newtonp([1,2,3,4],1.1,1e-16,50)

- 84 -

Hernn Pearanda V.

1.0: 0.09809610154125115 2.0: -1.16298515499483 3.0: -1.8460135373217041 4.0: -1.6724823714029426 5.0: -1.6509334625984056 6.0: -1.650629251212898 7.0: -1.6506291914393907 8.0: -1.6506291914393882 x2 = -1.6506291914393882 Como Jasymca puede trabajar con nmeros complejos, es posible encontrar tambin soluciones complejas, para ello simplemente se da un valor inicial adecuado: >> newtonp([1,2,3,4],-0.1+1i,1e-16,50) 1.0: (-0.5099351110123196+1.638434115021929i) 2.0: (-0.21498165769334393+1.4653953736822276i) 3.0: (-0.17170224585665017+1.5529064167209425i) 4.0: (-0.17467056310830922+1.546898529064582i) 5.0: (-0.1746854039107681+1.5468688879510515i) 6.0: (-0.17468540428030588+1.5468688872313963i) 7.0: (-0.17468540428030602+1.5468688872313963i) x2 = -0.17468540428030602+1.5468688872313963i Como se sabe, las soluciones complejas siempre vienen en pares conjugados, por lo que al encontrar una en realidad se han encontrado dos (la otra solucin en este caso es: -0.17468540428030602-1.5468688872313963i). Por lo tanto, si se tienen valores iniciales adecuados es posible encontrar todas las soluciones con el mtodo de Newton Raphson. Dichos valores pueden ser encontrados con el mtodo QD. Otra alternativa consiste en encontrar una solucin (o dos si son complejas) y trabajar luego con el polinomio residual para encontrar otra (u otras dos soluciones), continuando as hasta que el polinomio residual es de segundo o primer grado. No obstante este procedimiento con frecuencia lleva a soluciones errneas debido a que el error cometido al encontrar la primera solucin se propaga a la segunda y de este a la tercera y as sucesivamente, por esta razn en este tema se emplear la primera alternativa. Como de costumbre, una vez probada la funcin se puede suprimir la impresin de resultados intermedios (anteponiendo un % a printf). 5.1.3. Ejemplos 1. Encuentre las soluciones (error=15 dgitos) de la siguiente ecuacin, con el mtodo de Newton Raphson, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 4 12x3+70x2 204x+325=0
Los valores iniciales (error=1e-2) estimados con QD son: >> a=[1,-12,70,-204,325]; x=qd(a,1e-2,100) x = [ 3.894302367447466+3.3101857771760668i 3.894302367447466-3.3101857771760668i 2.105697632552533+2.765893511959711i 2.105697632552533-2.765893511959711i ] Como se sabe que los resultados complejos vienen en pares conjugados, slo es necesario llamar dos veces al mtodo de Newton. Llamando la primera vez con x1, se obtiene:

ECUACIONES POLINOMIALES - 1

- 85 -

>> newtonp(a,x(1),1e-15,100) x2 = 4.000000000000001+3.0i La segunda solucin es el par conjugado de la primera: >> conj(ans) ans = 4.000000000000001-3.0i Para la tercera solucin se emplea como valor inicial x3: >> newtonp(a,x(3),1e-15,100) x2 = 1.9999999999999996+2.9999999999999996i Siendo la cuarta solucin el para conjugado de la tercera: >> conj(ans) ans = 1.9999999999999996-2.9999999999999996i En consecuencia las soluciones (redondeadas a los 15 dgitos considerados en el error) son: x1= x2= x3= x4= 4+3i 4-3i 2+3i 2-3i

En Jasymca para ver los resultados con un determinado nmero de dgitos se emplea la instruccin: format base nmero_de_dgitos Por ejemplo, para ver los resultados en el sistema decimal (10) con 9 dgitos de precisin se escribe: >> format 10 9 A partir de esta orden todos los resultados se muestran con 9 dgitos, por ejemplo al calcular la raz cuadrada de 2 se obtiene: >> sqrt(2) ans = 1.41421356 Es posible calcular las cuatro soluciones con una sola instruccin si se emplea un ciclo while y una condicin if para determinar si el resultado es o no complejo (si tiene o no parte imaginaria), tal como se ha hecho en la siguiente funcin: function r=newtonr(a,x,err,li) r=0; n=length(a)-1; i=0; while ++i<=n r(i)=newtonp(a,x(i),err,li); if imagpart(r(i))~=0 r(i+1)=conj(r(i)); i++; end end end Llamando a esta funcin se obtiene: >> newtonr(a,x,1e-15,100) r = [ 4+3i 4-3i 2+3i 2-3i ] Con roots se obtiene: >> roots(a) ans = [ 4-3i 4+3i 2-3i 2+3i ]

Que son las mismas soluciones calculadas con newton.

- 86 -

Hernn Pearanda V.

2. Encuentre las soluciones (error=12 dgitos) de la siguiente ecuacin, con el mtodo de Newton Raphson, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 5x 6x +12x +34x48=0
Los valores iniciales estimados con QD (error 1e-3) son: >> format 10 12 >> a=[1,-5,-6,12,34,-48]; x=qd(a,1e-3,500) x = [ 5.54285033103 -1.30044111045-1.40865702723i -1.30044111045+1.40865702723i 1.02901594494+3.35328093133i 1.02901594494-3.35328093133i ] Y las soluciones calculadas con newtonr son: >> newtonr(a,x,1e-12,100) r = [ 5.54309263636 -1.66032132377-1.17788017541i -1.66032132377+1.17788017541i 1.38877500559+0.401122418117i 1.38877500559-0.401122418117i ] Con root se obtienen las mismas soluciones: >> roots(a) ans = [ 5.54309263636 -1.66032132377-1.17788017541i -1.66032132377+1.17788017541i 1.38877500559-0.401122418117i 1.38877500559+0.401122418117i ] 3. Encuentre las soluciones (error=9 dgitos) de la siguiente ecuacin, con el mtodo de Newton Raphson, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 87x 7+11x 6+41x5183x 4+231x3 21x 2265x 150=0


Los valores iniciales con QD (error 1e-6: generalmente mientras mayor es el grado mayor debe ser la precisin) son: >> format 10 9 >> x=qd([1,-7,11,41,-183,231,-21,-265,-150],1e-6,200) x = [ 3.38230401 2.90623436+1.35541404i 2.90623436-1.35541404i -3.54726798 1.19912197+1.63926123i 1.19912197-1.63926123i -0.52287435-0.304236547i -0.52287435+0.304236547i ] Y las soluciones calculadas con newtonr son: >> newtonr([1,-7,11,41,-183,231,-21,-265,-150],x,1e-9,100) r = [ 3.38235398 2.64471068+1.64903423i 2.64471068-1.64903423i -3.02427058 1.19912197+1.63926123i 1.19912197-1.63926123i -0.52287435-0.304236547i

ECUACIONES POLINOMIALES - 1

- 87 -

-0.52287435+0.304236547i ] Las soluciones calculadas con roots son: >> roots([1,-7,11,41,-183,231,-21,-265,-150]) ans = [ 2.64471068-1.64903423i 2.64471068+1.64903423i -3.02427058 3.38235398 1.19912197-1.63926123i 1.19912197+1.63926123i -0.52287435-0.304236547i -0.52287435+0.304236547i ] Que son las mismas soluciones slo que no en el mismo orden. Preguntas 1. Para qu sirve el comando syms? 2. Para obtener el valor de un polinomio para un valor de x igual a -7, Entre qu expresin se tiene que dividir el polinomio? 3. Con qu instruccin se obtiene el valor de un polinomio, para un valor dado de la variable independiente, en Jasymca? 4. Con qu instruccin se obtiene el cociente y el residuo de un polinomio en Jasymca? 5. Por qu no es confiable encontrar otras soluciones con el polinomio residual? 6. Qu instruccin se debe escribir en Jasymca para ver los resultados en notacin binaria y con 14 dgitos? 7. Qu instruccin se debe escribir en Jasymca para ver los resultados en notacin hexadecimal con 10 dgitos? 8. Cules son los valores del polinomio y de sus derivada para los polinomios de los ejemplos? 9. Cul es el menor error que se puede emplear en el mtodo QD para obtener valores iniciales adecuados en el ltimo ejemplo? 10.Cules son las soluciones que se obtienen, para los polinomios de los ejemplos, si los errores son: ejemplo 1: 1e-7, ejemplo 2: 1e-10 y ejemplo 3: 1e-15? 5.2. MTODO DE BAIRSTOW

El mtodo de Bairstow permite calcular 2 de las races de una ecuacin polinomial. Para ello se divide el polinomio entre una ecuacin de segundo grado (x2-rx-s) y el mtodo va cambiando los coeficientes del divisor (r y s) hasta que el residuo se hace cero, es decir hasta que se cumple que:

P n ( x) x rxs
2

=Qn2 ( x)( x rx s )=0


2

(5.3)

Entonces la ecuacin de segundo grado puede ser resuelta obtenindose as dos de las races del polinomio. Luego se puede repetir el proceso con el polinomio residual (Qn-2) y continuar as hasta encontrar todas las soluciones, sin embargo y al igual que en el mtodo de Newton Raphson, este procedimiento puede dar lugar a resultados errneos (debido a la propagacin del error), por lo que en general

- 88 -

Hernn Pearanda V.

se prefiere encontrar las soluciones con el polinomio original, empleando valores iniciales adecuados para converger hacia cada para de soluciones. La relacin entre los valores iniciales asumidos (x 1 y x2) y la ecuacin cuadrtica x2-rx-s, se puede deducir fcilmente de la igualdad:

( xx 1 )( x x 2 )= x 2rxs
x 2( x 1+ x 2)x+x 1x 2= x 2rxs
En consecuencia se cumple que:

r =x 1+x 2 s=x 1x 2

(5.4)

Para llevar a cabo la divisin sealada en la ecuacin (5.3), el mtodo ms eficiente es, una vez ms, el de la divisin sinttica, por lo que primero se repasar dicho procedimiento. 5.2.1. Divisin sinttica de segundo grado En la divisin sinttica de segundo grado se divide el polinomio entre la ecuacin cuadrtica: x2-rx-s=0. Para recordar el procedimiento que se sigue en la divisin sinttica se dividir el siguiente polinomio entre x2+x+1 (r=-1, s=-1):

P 4 ( x)=x 4 1.1x 3+2.3x 2+0.5x+3.3=0

Si se denomina b a los coeficientes resultantes de la primera divisin, entonces el residuo es: bn(x-r)+bn+1, donde n es el grado del polinomio. Con los resultados del ejemplo el residuo es: -0.8*(x-1)+0.7 = -0.8*x-0.1. Una segunda divisin sinttica permite calcular las derivadas parciales de la funcin con relacin a los coeficientes r y s de la ecuacin cuadrtica (estos valores son de utilidad en el mtodo de Bairstow):

As, 4/r= 5.5; b4/s = c2, y en general se cumple que:

b =c i1 r b =c s i 2

(5.5)

Analizando las operaciones realizadas, se puede deducir fcilmente las ecuaciones generales para el clculo de los coeficientes b resultantes:

ECUACIONES POLINOMIALES - 1

- 89 -

b1=a 1 b 2=a 2+b1r bi =a i+b i1r +bi 2x {i=2 n residuo=bn( x r )+b n+1=b nx+( b n+1b nr )

(5.6)

Donde n es el grado del polinomio, siendo el residuo de la divisin: (5.7)

Dado que en ocasiones puede resultar til el calcular la derivada sinttica de segundo grado de forma independiente, se ha elaborado una funcin para este fin: function b=divsin2(a,r,s) b=0; b(1)=a(1); b(2)=a(2)+b(1)*r; for i=3:length(a) b(i)=a(i)+b(i-1)*r+b(i-2)*s; printf("b= %f\n",b); end end Llamando a esta funcin con los datos del ejemplo manual, se obtiene para la primera divisin: >> divsin2([1,-1.1,2.3,0.5,3.3],-1,-1) b = [ 1 -2.1 3.4 -0.8 0.7 ] Y para la segunda: >> divsin2(ans(1:4),-1,-1) b = [ 1 -3.1 5.5 -3.2 ] Que concuerdan con los resultados calculados manualmente. 5.2.2. Procedimiento Habiendo repasado el procedimiento para realizar la divisin sinttica de segundo grado, se prosigue con el desarrollo del mtodo de Bairstow. Para que la ecuacin (5.3) se cumpla, el residuo de la divisin (ecuacin (5.7)) debe ser cero. Ello se puede lograr expandiendo los coeficientes b n y bn+1, en series de Taylor, como funciones de los coeficientes r y s:

bn ( r+ r , s+ S )=bn (r , s)+ ( bn ( r , s) ) r+ ( b n (r , s) ) s++=0 r s b n+1 ( r + r , s+ S )=bn +1 (r , s)+ ( bn+1 (r , s) ) r+ ( b n+1( r , s )) s++=0 r s


Donde r y s son los valores que deben sumarse a r y s para que tanto bn como bn+1 sean cero. Por supuesto, no es posible en la prctica resolver este sistema (que es ms complicado an que el problema original), por eso slo se toman los trminos de primer orden con lo que el sistema queda en la forma:

b n b r + n s=0 r s b n+1 b b n+1+ r+ n+1 s=0 r s b n+

(5.8)

Las derivadas parciales de este sistema son los coeficientes resultantes de la segunda divisin sinttica del polinomio, reemplazando las igualdades de la ecuacin (5.5), en ((5.8), se obtiene:

- 90 -

Hernn Pearanda V.

c n1 r+c n 2 s=b n c n r+c n1 s=b n+1

(5.9)

Que es un sistema lineal de dos ecuaciones con dos incgnitas (r y s), cuya solucin es:

r=

b n+1c n2 b nc n1
2

cn 1 c nc n2 b n c n1 r s= c n2

(5.10)

Al sumar estos valores a r y s no se consigue que b n y bn+1 sean cero, pues al haber truncado la serie de Taylor en los trminos de primer orden, los valores de r y s son solo aproximados. Por eso el clculo los valores de r y s que hacen b n y bn+1 cero, se convierte en un proceso iterativo, es decir se deben ir calculando nuevos valores de r y s (r=r+r y s=s+s) hasta que los valores de r y s son cercanos a cero (exactitud) o hasta que los valores de dos iteraciones consecutivas de r y s sean casi iguales (precisin). Para comprender mejor el mtodo, se aplicar manualmente el mismo a la siguiente ecuacin polinomial:

P 4 ( x)=x 41.1x 3+2.3x 2+0.5x+3.3=0


Asumiendo como valores iniciales: x1=0.1+0.1i; x2=0.1-0.1i. Se inicializan variables y se calculan los valores de r y s (ecuacin (5.4)): >> a=[1,-1.1,2.3,0.5,3.3]; x1=0.1+0.1i; x2=conj(x1); >> r=x1+x2, s=-x1*x2 r = 0.2 s = -2.0E-2 n=length(a)-1;

Ahora se calculan los valores de b y c (por divisin sinttica, ecuacin ((5.6))): >> b=divsin2(a,r,s), c=divsin2(b,r,s) b = [ 1 -0.9 2.1 0.938 3.4456 ] c = [ 1 -0.7 1.94 1.34 3.6748 ] Como ni bn (b4) ni bn+1 (b5) son cero se calcula r y s (ecuacin (5.10)): >> dr >> ds dr=(b(n+1)*c(n-2)-b(n)*c(n-1))/(c(n-1)^2-c(n)*c(n-2)) = -0.90004 ds=(-b(n)-c(n-1)*dr)/c(n-2) = -1.1544

Entonces se calculan los nuevos valores de r y s: >> r+=dr, s+=ds r = -0.70004 s = -1.1744 Como estos valores son muy diferentes a los iniciales, se repite el proceso: >> b=divsin2(a,r,s), c=divsin2(b,r,s) b = [ 1 -1.8 2.3857 0.94388 -0.16254 ] c = [ 1 -2.5001 2.9615 1.8068 -4.9054 ] >> dr=(b(n+1)*c(n-2)-b(n)*c(n-1))/(c(n-1)^2-c(n)*c(n-2)) dr = -0.17979

ECUACIONES POLINOMIALES - 1

- 91 -

>> ds=(-b(n)-c(n-1)*dr)/c(n-2) ds = 0.16457 >> r+=dr, s+=ds r = -0.87983 s = -1.0098 Una vez ms bn y bn+1 no son cercanos a cero y los nuevos valores de r y s no son iguales a los anteriores, por lo que el proceso se repite: >> b=divsin2(a,r,s), c=divsin2(b,r,s) b = [ 1 -1.9798 3.0321 -0.16843 0.3863 ] c = [ 1 -2.8597 4.5383 -1.2736 -3.0761 ] >> dr=(b(n+1)*c(n-2)-b(n)*c(n-1))/(c(n-1)^2-c(n)*c(n-2)) dr = -2.0074E-2 >> ds=(-b(n)-c(n-1)*dr)/c(n-2) ds = -9.0754E-2 >> r+=dr, s+=ds r = -0.8999 s = -1.1006 Como an no se cumplen las condiciones el proceso se repite dos veces ms: >> b=divsin2(a,r,s), c=divsin2(b,r,s) b = [ 1 -1.9999 2.9991 2.1286E-3 -2.7133E-3 ] c = [ 1 -2.8998 4.5081 -0.86324 -4.1874 ] >> dr=(b(n+1)*c(n-2)-b(n)*c(n-1))/(c(n-1)^2-c(n)*c(n-2)) dr = -9.6976E-5 >> ds=(-b(n)-c(n-1)*dr)/c(n-2) ds = 5.8329E-4 >> r+=dr, s+=ds r = -0.9 s = -1.1 >> b=divsin2(a,r,s), c=divsin2(b,r,s) b = [ 1 -2 3 -1.4887E-7 8.3432E-7 ] c = [ 1 -2.9 4.51 -0.869 -4.1789 ] >> dr=(b(n+1)*c(n-2)-b(n)*c(n-1))/(c(n-1)^2-c(n)*c(n-2)) dr = -9.81E-8 >> ds=(-b(n)-c(n-1)*dr)/c(n-2) ds = -2.039E-7 >> r+=dr, s+=ds r = -0.9 s = -1.1 Ahora los valores de bn y bn+1 son cercanos a cero y los valores de r y s, de dos iteraciones sucesivas, son iguales (en los 5 dgitos de precisin con los que se muestran los resultados), por lo que el proceso concluye y se pueden calcular dos de las soluciones del polinomio: >> cuad([1,-r,-s]) r = [ -0.45-0.94736i -0.45+0.94736i ]

Una vez comprendido el procedimiento de clculo se puede elaborar el algoritmo y el programa para el mtodo. 5.2.3. Algoritmo y cdigo Puesto que en el mtodo de Bairstow slo son de inters los dos ltimos elementos de la primera divisin sinttica (el residuo) y los tres ltimos

- 92 -

Hernn Pearanda V.

elementos de la segunda (las derivadas parciales), no es necesario almacenar los otros elementos resultantes. El algoritmo del mtodo, que toma en cuenta la anterior consideracin, se presenta en la siguiente pgina y el cdigo respectivo en Jasymca es: function res=bairs(a,x1,x2,err,li) n=length(a); k=1; r=x1+x2; s=-x1*x2; while 1 b1=a(1); b=a(2)+b1*r; c=b1; c1=0; for i=3:n c0=c1; c1=c; c=b+c1*r+c0*s; b0=b1; b1=b; b=a(i)+b1*r+b0*s; end if abs(b1)+abs(b)<err break; end dr=(-b1*c1+b*c0)/(c1*c1-c*c0); ds=(-b1-c1*dr)/c0; rc=r+dr; sc=s+ds; printf("%f: r=%f; s=%f;\n",k,rc,sc); if abs(r/rc-1)+abs(s/sc-1)<err break; end if k++==li error("err-bairs: %f\n",cuad([1,-rc,-sc])); end r=rc; s=sc; end res = cuad([1,-rc,-sc]); end Llamando a esta funcin con la ecuacin del ejemplo manual se obtiene: >> bairs([1,-1.1,2.3,0.5,3.3],0.1+0.1i,0.1-0.1i,1e-12,100) 1: r=-0.70004; s=-1.1744; 2: r=-0.87983; s=-1.0098; 3: r=-0.8999; s=-1.1006; 4: r=-0.9; s=-1.1; 5: r=-0.9; s=-1.1; res = [ -0.45-0.94736i -0.45+0.94736i ] Que son los mismos valores obtenidos en el ejemplo manual. Como de costumbre, una vez probado el correcto funcionamiento del programa, se puede suprimir la impresin de resultados intermedios. 5.2.4. Ejemplos 4. Encuentre las soluciones (error=1e-14) de la siguiente ecuacin, con el mtodo de Bairstow, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 4 3x 2+x5=0
Los valores iniciales estimados con QD (error 1e-3) son:

ECUACIONES POLINOMIALES - 1

- 93 -

- 94 -

Hernn Pearanda V.

>> format 10 14 >> a=[1,0,-3,1,-5]; qd(a,1e-3,100) x = [ -2.13679163034 0.17304474764181-1.0515713160421i 0.17304474764181+1.0515713160421i 1.7907021350564 ] Como Bairstow encuentra las soluciones de 2 en 2, se deben encontrar las soluciones reales por un lado, con x1 y x4, y las complejas por otro, con x2 y x3 (revisar la correccin hecha a las 2 primeras lneas del mtodo qd): >> bairs(a,x(1),x(4),1e-14,100) res = [ -2.1362827747911 1.9499205477422 ] >> bairs(a,x(2),x(3),1e-14,100) res = [ 9.3181113524451E-2+1.0916179909226i 9.3181113524451E-2-1.0916179909226i ] Con roots se obtiene: >> roots(a) ans = [ -2.1362827747911 1.9499205477422 9.3181113524451E-2-1.0916179909226i 9.3181113524451E-2+1.0916179909226i ] Que como se puede observar, son las mismas soluciones calculadas con Bairstow. Cuando el grado del polinomio es impar, una de las soluciones reales debe ser calculada por el mtodo de Newton. El proceso puede ser automatizado separando los valores iniciales reales de los complejos, calculando luego las soluciones reales por un lado y las imaginarias por otro, teniendo el cuidado de calcular una de las soluciones reales por el mtodo de Newton, cuando el grado del polinomio es impar: function r=bairsr(a,x,err,li) n=length(a)-1; xr=0; xi=0; ci=0; cr=0; i=0; while ++i<=n if imagpart(x(i))~=0 xi(++ci)=x(i); xi(++ci)=x(++i); else xr(++cr)=x(i); end end k=1; i=1; if divide(cr,2)(2)~=0 r(i)=newtonp(a,xr(k),err,li); ++i; ++k; end while k<=cr r([i,i+1])= bairs(a,xr(k),xr(k+1),err,li); k+=2; i+=2; end k=1; while k<ci r([i,i+1])=bairs(a,xi(k),xi(k+1),err,li); k+=2; i+=2; end end Empleando esta funcin se obtiene: >> bairsr(a,x,1e-14,100) r = [ -2.1362827747911 1.9499205477422 9.3181113524451E-2+1.0916179909226i 9.3181113524451E-2-1.0916179909226i ] Que son las soluciones encontradas previamente.

ECUACIONES POLINOMIALES - 1

- 95 -

5. Encuentre las soluciones (error=1e-10) de la siguiente ecuacin, con el mtodo de Bairstow, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 7.3x 41.44 x +373.474x +115.908x 4822.15x +6985.17x +5589.66x10901.5=0


Los valores iniciales estimados con QD (error = 1e-3) son: >> format 10 10 >> a=[1,-7.3,-41.44,373.474,115.908,-4822.15,6985.17,5589.66,-10901.5]; >> x=qd(a,1e-3,100) x = [ 6.30050426 -5.499988872 5.099857958 -4.500367486 3.399995441 2.099989918 1.600012358 -1.200003577 ] Las soluciones calculadas con bairsr son: >> bairsr(a,x,1e-10,100) r = [ 6.29999248 -5.499999617 5.100014573 -4.500000029 3.399993894 2.099989819 1.600009938 -1.200001057 ] Y las soluciones calculadas con roots son: >> roots(a) ans = [ 2.099989819 3.399993894 -4.500000029 5.100014573 -5.499999617 6.29999248 -1.200001057 1.600009938 ] Que son los mismos resultados calculados con Bairstow solo que en diferente orden. 6. Encuentre las soluciones (error=1e-7) de la siguiente ecuacin, con el mtodo de Bairstow, estimando los valores iniciales con el mtodo QD y verificando las soluciones con roots.

x 60x +1554x 22680x +203889x 1155420x +4028156x 7893840x+6652800=0


Los valores iniciales estimados con QD (error: 1e-3) son: >> format 10 7 >> a=[1,-60,1554,-22680,203889,-1155420,4028156,-7893840,6652800]; >> x=qd(a,1e-3,100) x = [ 11.01079 9.99954 8.995975 7.996411 6.998061

- 96 -

Hernn Pearanda V.

5.999345 4.999884 3.999993 ] Las soluciones calculadas con bairsr son: >> bairsr(a,x,1e-7,100) r = [ 11 10 9 8 7 6 5 4 ] Y las calculadas con roots: >> roots(a) ans = [ 4-3.482199E-15i 7-1.721713E-15i 5+5.963785E-12i 6+7.585034E-9i 8-2.086635E-13i 11-5.898949E-18i 9+2.516598E-17i 10+1.759684E-18i ] En este caso, las soluciones calculadas con roots no son correctas pues no debera existir la parte imaginaria (si se desprecia la parte imaginaria, pues sus valores son cercanos a cero, entonces se tienen las mismas soluciones obtenidas con bairstow) Preguntas 1. Por qu en las funciones divsin1 y divsin2 no existe la variable n (grado del polinomio), que aparece en las ecuaciones? 2. En el diagrama (y la funcin) bairs cul es la variable empleada como contador de los ciclos? 3. En la funcin bairs n es el grado del polinomio? 4. En la funcin bairsr Cuando es cierta la expresin divide(cr,2) (2)~=0? 5. Por qu se deben calcular por separado las soluciones reales y complejas en el mtodo de Bairstow? 6. En los ejemplos, Cules son las soluciones que se obtienen si los valores iniciales se estiman con un error igual a 1e-9? 7. En los ejemplos, Se obtienen soluciones en todos los casos si en el mtodo de Bairstow se emplea un error igual a 1e-15?