Método de Bairstow Gabriela Bello Cruz Octubrer 04, 2019 Contents 1 Introducción 1 2 Marco Teórico 3 3 Metodologı́a 7 4 Conclusion 10 i Chapter 1 Introducción El método de Bairstow es un algoritmo eficiente de búsqueda de las raı́ces de un polinomio real de grado arbitrario, de alguna manera se relaciona con los métodos de Müller y de Newton-Raphson. Este algoritmo se diferencia de otros métodos porque encuentra tanto las raı́ces reales como las imaginarias (en parejas complejas conjugadas), utilizando únicamente aritmética real. Ha sido declarado como uno de los métodos de obtención de raı́ces más eficientes, pues converge de manera rápida. Los problemas surgen al momento de introducir polinomios de grado alto, funciones trascendentales o con coeficientes complejos. También, si se le da una precisión pequeña, puede tener divergencia. Además este método sólo funciona para resolver polinomios, por lo que funciones trigonométricas o exponenciales no son candidatas para resolverse con este método. (Figure 1.1) 1 Figure 1.1: Diagrama de flujo del Método Bairstow 2 Chapter 2 Marco Teórico Para poder encontrar raı́ces con este método necesitamos conocer el grado del polinomio a resolver, cuáles son sus coeficientes y dos factores, r y s, los cuales son necesarios para efectuar la división sintética. Es un método abierto, pues necesita dos estimaciones iniciales pero no necesariamente estas encierran alguna raı́z. Este método se basa en la deflación, es decir, la reducción del grado del polinomio. Con bairstow, se va reduciendo el polinomio dos grados mediante divisiones sintéticas dobles. Por ejemplo el polinomio general [2.1]. fn (x) = a0 + a1 x + a2 x2 + ... + an xn (2.1) Se divide entre el factor x − t para dar un segundo polinomio que es de un grado menor: fn–1 (x) = b1 + b2 x + b3 x2 + ... + bn xn−1 (2.2) Con un residuo R = b0 , donde los coeficientes se calculan por la relación de recurrencia. bn = an (2.3) bi = ai + bi+1 t (2.4) para i = n − 1 a 0 (2.5) Observe que si t es una raı́z del polinomio original, el residuo b0 serı́a igual a cero. Para permitir la evaluación de raı́ces complejas, el método de Bairstow divide el polinomio entre un factor cuadrático x2 –rx–s. Si esto se hace con la ecuación [2.1], el resultado es un nuevo polinomio. fn–2 (x) = b2 + b3 x + ... + bn–1 xn−3 + bn xn−2 3 (2.6) con un residuo: R = b1 (x–r) + b0 (2.7) Como con la división sintética normal, se utiliza una relación de recurrencia simple para realizar la división entre el factor cuadrático: bn = an (2.8) bn−1 = an−1 + rbn (2.9) El factor cuadrático se introduce para permitir la determinación de las raı́ces complejas. Esto se relaciona con el hecho de que, si los coeficientes del polinomio original son reales, las raı́ces complejas se presentan en pares conjugados. Si x2 –rx–s es un divisor exacto del polinomio, las raı́ces complejas pueden determinarse con la fórmula cuadrática. Ası́, el método se reduce a determinar los valores de r y s que hacen que el factor cuadrático sea un divisor exacto. En otras palabras, se buscan los valores que hacen que el residuo sea igual a cero. La inspección de la ecuación [2.7] nos lleva a concluir que para que el residuo sea cero, b0 y b1 deben ser cero. Como es improbable que los valores iniciales para evaluar r y s conduzcan a este resultado, debemos determinar una forma sistemática para modificar los valores iniciales, de tal forma que b0 y b1 tiendan a cero. Para lograrlo, el método de Bairstow usa una estrategia similar a la del método de Newton-Raphson. Como tanto b0 como b1 son funciones de r y s, se pueden expandir usando una serie de Taylor, ası́: b1 (r + ∆r, s + ∆s) = b1 + δb1 δb1 ∆r + ∆s δr δs (2.10) b0 (r + ∆r, s + ∆s) = b0 + δb0 δb0 ∆r + ∆s δr δs (2.11) Donde los valores del lado derecho se evalúan en r y s. Observe que se han despreciado los términos de segundo orden y de orden superior. Esto representa una suposición implı́cita de que –r y –s son suficientemente pequeños para que los términos de orden superior puedan despreciarse. Otra manera de expresar esta suposición es que los valores iniciales son adecuadamente cercanos a los valores de r y s en las raı́ces. Los incrementos, ∆r y ∆s, necesarios para mejorar nuestros valores iniciales, se estiman igualando a cero las ecuaciones [2.10][2.11] para dar: δb1 δb1 ∆r + ∆s = −b1 δr δs (2.12) δb0 δb0 ∆r + ∆s = −b0 δr δs (2.13) 4 Si las derivadas parciales de las b, pueden determinarse, hay un sistema de dos ecuaciones que se resuelve simultáneamente para las dos incógnitas, ∆r y ∆s. Bairstow demostró que las derivadas parciales se obtienen por división sintética de las b en forma similar a como las b mismas fueron obtenidas: cn = bn (2.14) cn−1 = bn–1 + rcn (2.15) ci = bi + rci+1 + sci+2 para i = n–2 a 1 (2.16) δb0 δb1 δb1 0 donde δb δr = c1 , δs = δr = c2 y δs = c3 . Ası́, las derivadas parciales se obtienen por la división sintética de las b. Entonces, las derivadas parciales se sustituyen en las ecuaciones [2.12] y [2.13] junto con las b para dar c2 ∆r + c3 ∆s = −b1 (2.17) c1 ∆r + c2 ∆s = −b0 (2.18) Estas ecuaciones se resuelven para ∆r y ∆s, las cuales, a su vez, se emplean para mejorar los valores iniciales de r y s. En cada paso, se estima un error aproximado en r y s: |a,r | = | ∆r |100% r (2.19) |a,s | = | ∆s |100% s (2.20) y Cuando ambos errores estimados caen por debajo de un criterio especificado de terminación s , los valores de las raı́ces se determinan mediante x= r± √ En este punto, existen tres posibilidades: 5 r2 + 4s 2 (2.21) 1. El cociente es un polinomio de tercer grado o mayor. En tal caso, el método de Bairstow se aplica al cociente para evaluar un nuevo valor de r y s. Los valores anteriores de r y s pueden servir como valores iniciales en esta aplicación. 2. El cociente es cuadrático. Aquı́ es posible evaluar directamente las dos raı́ces restantes con la ecuación [2.21]. 3. El cociente es un polinomio de primer grado. evalúa simplemente como x=− 6 s r En este caso, la raı́z restante se (2.22) Chapter 3 Metodologı́a Emplee el método de Bairstow para determinar las raı́ces del polinomio: f (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 3.85x + 1.25 (3.1) Utilice como valores iniciales r = s = 1 e itere hasta un nivel de s = 1% A continuación está el código en Python donde r y s son estimaciones iniciales, roots= matrı́z vacı́a, a= vector de coeficiente creciente y g= grado del poliomio. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import cmath import matplotlib . pyplot as plt import numpy as np def bairstow (a ,r ,s ,g , roots ) : if (g <1) : return None if ( g ==1) : roots . append ( float ( - a [0]) / float ( a [1]) ) return None if ( g ==2) : D = ( a [1]**2.0) -(4.0) *( a [2]) *( a [0]) X1 = ( - a [1] - cmath . sqrt ( D ) ) /(2.0* a [2]) X2 = ( - a [1] + cmath . sqrt ( D ) ) /(2.0* a [2]) roots . append ( X1 ) roots . append ( X2 ) return None n = len ( a ) b = [0]* len ( a ) c = [0]* len ( a ) b [n -1] = a [n -1] b [n -2] = a [n -2] + r * b [n -1] i = n - 3 while (i >=0) : b [ i ] = a [ i ] + r * b [ i +1] + s * b [ i +2] i = i - 1 c [n -1] = b [n -1] c [n -2] = b [n -2] + r * c [n -1] i = n - 3 while (i >=0) : 7 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 c [ i ] = b [ i ] + r * c [ i +1] + s * c [ i +2] i = i - 1 Din = (( c [2]* c [2]) -( c [3]* c [1]) ) **( -1.0) r = r + ( Din ) *(( c [2]) *( - b [1]) +( - c [3]) *( - b [0]) ) s = s + ( Din ) *(( - c [1]) *( - b [1]) +( c [2]) *( - b [0]) ) if ( abs ( b [0]) >1E -8 or abs ( b [1]) >1E -8) : return bairstow (a ,r ,s ,g , roots ) if (g >=3) : Dis = (( - r ) **(2.0) ) -((4.0) *(1.0) *( - s ) ) X1 = ( r - ( cmath . sqrt ( Dis ) ) ) /(2.0) X2 = ( r + ( cmath . sqrt ( Dis ) ) ) /(2.0) roots . append ( X1 ) roots . append ( X2 ) return bairstow ( b [2:] , r ,s ,g -2 , roots ) k = 0 g = 5 roots = [] a = [1 , -3.5 ,2.75 ,2.125 , -3.85 ,1.25] r = -1 s = r bairstow (a ,r ,s ,g , roots ) print ( " \ nFound Roots = > \ n " ) for r in roots : print ( " R " + str ( k ) + " = " + str ( r ) ) k += 1 plt . figure () plt . plot ( roots ) plt . show () Al correr el programa se muestran los siguientes resultados 1 2 3 4 5 6 7 Found Roots = > R0 R1 R2 R3 R4 = = = = = ( -1.0013105159178937+0 j ) (0.5022753327571223+0 j) ( 0 . 81 2 2 6 4 4 5 29 8 1 9 8 4 1 - 0 . 3 9 2 5 2 07 8 2 8 5 2 3 25 5 6 j ) (0.8122644529819841+0.39252078285232556 j) 1 .9 54 50 62 77 19 74 74 8 8 Figure 3.1: Gráfica 9 Chapter 4 Conclusion El método de Bairstow tiene ventajas como el que nos permite encontrar raı́ces reales e imaginarias, más de una y que no necesita más que nuestros dos valores iniciales s y r, a diferencia del de Newton-Raphson, por ejemplo, que necesita la derivada de la función a evaluar. Ha sido declarado como uno de los métodos de obtención de raı́ces más eficientes, pues converge de manera rápida. Los problemas surgen al momento de introducir polinomios de grado alto, funciones trascendentales o con coeficientes complejos. También, si se le da una precisión pequeña, puede tener divergencia. Además este método sólo funciona para resolver polinomios, por lo que funciones trigonométricas o exponenciales no son candidatas para resolverse con este método. 10