RAÌCES DE ECUACIONESMétodo Müller Ing Yamil Armando Cerquera Rojas –
[email protected] Especialista en Sistemas Universidad Nacional Docente Universidad Surcolombiana Neiva - Huila Contenido Introducción Recuerde que el método de la secante obtiene la raíz dirigiendo una recta hasta el eje x con dos valores de la función. El método de Müller es similar; pero construye una parábola con tres puntos. Este método utilizado para encontrar raíces de ecuaciones con raíces múltiples, y consiste en obtener los coeficientes de la parábola que pasa por tres puntos elegidos. Dichos coeficientes son sustituidos en la fórmula cuadrática para obtener el valor donde la parábola intersecta al eje X; es decir, la raíz estimada. La aproximación se puede facilitar, si se escribe la ecuación de la parábola en una forma conveniente. Una de las mayores ventajas de este método, es que al trabajar con la formula cuadrática es posible localizar tanto raíces reales, como raíces complejas. f 2 ( xi ) = a ( xi − x 2 ) 2 + b( xi − x 2 ) + c Ecuación 1 Si se quiere que esta parábola pase por los tres puntos [ x 0 , f ( x 0 )] , [ x1 , f ( x1 )] , [ x2 , f ( x2 )] , Los coeficientes de la Ecuación 1 se evalúan sustituyendo cada uno de esos tres puntos para dar: f ( x 0 ) = a ( x 0 − x 2 ) 2 + b( x 0 − x 2 ) + c Ecuación 2 f ( x1 ) = a ( x1 − x 2 ) 2 + b( x1 − x 2 ) + c Ecuación 3 f ( x 2 ) = a( x 2 − x 2 ) 2 + b( x 2 − x 2 ) + c Ecuación 4 Observe que se ha eliminado el subíndice 2 de la función por brevedad. Debido a que se tiene tres ecuaciones es posible encontrar los tres coeficientes desconocidos a,b,c. De la Ecuación 4 se tiene que c = f ( x 2 ) . Así el valor de c es la función evaluada en el tercer valor inicial x 2 . Este valor se sustituye en las ecuaciones Ecuación 2 y Ecuación 3 para tener dos ecuaciones con dos incógnitas: f ( x 0 ) − f ( x 2 ) = a ( x0 − x 2 ) 2 + b( x0 − x 2 ) ≡ −a ( x0 − x 2 ) 2 − b( x0 − x 2 ) = f ( x 2 ) − f ( x0 ) Ecuación 5 f ( x1 ) − f ( x 2 ) = a( x1 − x 2 ) 2 + b( x1 − x 2 ) ≡ −a( x1 − x 2 ) 2 − b( x1 − x 2 ) = f ( x 2 ) − f ( x1 ) Ecuación 6 Una manipulación algebraica permite encontrar los coeficientes restantes a y b. La manera de hacer esto consiste en definir las diferencias: h0 = x1 − x0 δ0 = f ( x1 ) − f ( x0 ) x1 − x0 h1 = x 2 − x1 f ( x 2 ) − f ( x1 ) δ1 = x 2 − x1 Estas se sustituyen en la Ecuación 5: − a ( x0 − x 2 ) 2 − b( x0 − x 2 ) = f ( x 2 ) − f ( x0 ) Teniendo h0 = x1 − x0 y h1 = x 2 − x1 , entonces ( x 0 − x 2 ) = −(h0 + h1 ) , por tanto se tiene finalmente: (h0 + h1 )b − (h0 + h1 ) 2 a = h0δ 0 + h1δ1 Y de la Ecuación 6 − a ( x1 − x 2 ) 2 − b( x1 − x 2 ) = f ( x 2 ) − f ( x1 ) , si f ( x 2 ) − f ( x) = δ 1 ( x 2 − x1 ) − b( x1 − x 2 ) − a( x1 − x 2 ) 2 = δ 1 ( x 2 − x1 ) , convierte en: si ( x1 − x2 ) = −h1 , entonces la ecuación se − b(−h1 ) − a (−h1 ) 2 = δ 1 ( x 2 − x1 ) , y reacomodando signos se tiene finalmente: ( h1 ) * b − ( h12 ) * a = h1δ 1 Se han convertido las Ecuación 5 y Ecuación 6 en: (h0 + h1 )b − (h0 + h1 ) 2 a = h0δ 0 + h1δ1 ( h1 ) * b − ( h12 ) * a = h1δ 1 De donde se despeja a y b. El resultado se resume como δ1 − δ 0 h1 − h0 b = ah1 + δ1 c = f ( x2 ) a= Para encontrar la raíz se aplica la fórmula cuadrática de la Ecuación 1, sin embargo debido al error de redondeo potencial, en lugar de usar la fórmula convencional, se usará la fórmula alternativa1, es decir: Si se tiene que encontrar x3 , de f 2 ( x3 ) = a ( x3 − x 2 ) 2 + b( x3 − x 2 ) + c . x3 − x 2 = − 2c b ± b 2 − 4ac O despejando la incógnita x3 = − 2c b ± b 2 − 4ac + x2 La utilizar la formula cuadrática, es posible localizar tanto las raíces reales como las complejas. Esta es la mayor ventaja del método. Cancelación por resta – Fórmula alternativa: Se refiere al redondeo incluido cuando se restan dos números de punto flotante casi iguales. Un caso común donde ocurre es en la determinación de las raíces de una ecuación cuadrática o parábola utilizando la ecuación cuadrática. x1 x2 = − b ± b 2 − 4ac , En los casos donde b 2 >>> 4ac , la diferencia en el numerados 2a puede ser muy pequeña. En tales casos, la precisión doble llega a reducir el problema. Además una formulación alternativa puede usarse para minimizar la cancelación por resta. x1 − 2c = x 2 − b ± b 2 − 4ac Una ilustración del problema y del uso de esta fórmula alternativa se ofrece en el siguiente ejemplo. Calcule el valor de las raíces de una ecuación cuadrática con a=1, b=3000.001 y c=3. Compare el valor calculado con las raíces verdaderas x1 = −0.001 y x 2 = −3000 Si se ejecuta en MatLab el siguiente código » a=1; b=3000.001; c=3; x1=(-b+sqrt(b*b-4*a*c))/(2*a) x2=(-b-sqrt(b*b-4*a*c))/(2*a) 1 Métodos para ingenieros, 5 edición Steven Chapra – Raymond Canale, Mc Graw Hill. Pag. 73), Se tendrá como respuesta lo siguiente x1 = -1.000007614493370e-003 x 2 = -3.000000999999000e+003 Si se realiza en Excel de Microsoft se tendrán los siguientes resultados A B C 1 3000001 3 -1,00001E- =(-B1+(B1^2-4*A1*C1)^0,5)/ 03 (2*A1) =(-B1-(B1^2-4*A1*C1)^0,5)/ -3000.001 (2*A1) x1 =-1,00001E-03 x 2 =-3000.001 Ejercicio de aplicación: Utilice el método de Müller para encontrar las raíces de la ecuación f ( x) = x 3 −13 x −12 , con valores iniciales x 0 = 4,5, x1 = 5.5, x 2 = 5 . Si se gráfica la función, y teniendo en cuenta que es de orden tres, puede visualizar que las raíces son reales y dadas en -3, -1 y 4. Solución: si x 0 = 4,5 f ( x 0 ) = f (4.5) = 20.625 , x1 = 5.5 , f ( x1 ) = f (5.5) = 82.875 x2 = 5 , f ( x 2 ) = f (5) = 48 h0 = x1 − x 0 = 5.5 − 4.5 = 1 h1 = x 2 − x1 = 5 − 5.5 = −0.5 f ( x1 ) − f ( x 0 ) 82.875 − 20.625 δ0 = = = 62.25 x1 − x0 5.5 − 4.5 δ1 = f ( x 2 ) − f ( x1 ) 48 − 82.875 = = 69.75 x 2 − x1 5 − 5.5 Estos valores a su vez se sustituyen en las ecuaciones: δ1 − δ 0 59.75 − 62.25 = = −5 h1 − h0 − 0.5 + 1 b = ah1 + δ1 = −5(−0.5) + 69.75 = 72.25 a= c = f ( x 2 ) = 48 La raíz cuadrática del determinante se evalúa como: b 2 − 4ac = 62.25 2 − 4(15)( 48) = 31.54461 Luego, 62.25 + .54451 > 62.25 − .54451 31 31 denominador de la ecuación x3 = x 2 + x3 = 5 + − 2 * (48) = 3.976487 62.25 + 31.54451 − 2c , se emplea un signo positivo en el , y así se encuentra la nueva raíz. b + b 2 − 4ac Y desarrollando el error relativo: er = −1.023513 * 100% = 25.74% 3.976487 Debido a que el error es demasiado grande todavía, se asignan nuevos valores así: x 0 se remplaza por x1 , x1 se remplaza por x 2 y x 2 se remplaza por x3 , por lo tanto la nueva iteración se realiza con: x 0 = 5,5, x1 = 5, x 2 = 3.976487 , y se repite de nuevo todos los cálculos i xr 0 5.00000 0 1 3.97648 er 25.74000 7 2 4.00105 0 3 4.00000 0 4 4.00000 0 0 0.613900 0 0.026200 0 0.000011 9 Otra forma de obtener la Fórmula de del método de Muller Los tres valores iniciales necesitados son denotados como x k , x k −1 , y x k −2 . La parábola pasa a través de los puntos: [ x k , f ( x k )] , [ x k −1 , f ( x k −1 )] y [ x k −2 , f ( x k −2 )] , si se escribe en la forma de Newton, entonces: y = f ( xk ) + ( x − xk ) f [ xk , xk −1 ] + ( x − xk )( x − xk −1 ) f [ xk , xk −1 , xk −2 ] Donde f ( x k , x k −1 ) y f ( x k , x k −1 , x k −2 ) denotan restas divididas. Esto puede ser escrito como: y = f ( xk ) + w( x − xk ) + f [ xk , xk −1 , xk −2 ]( x − xk ) 2 Donde w = f [ x k , x k −1 ] + f [ x k , x k −2 ] − f [ x k −1 , x k −2 ] La próxima iteración esta dada por la raíz que brinda la ecuación y = 0. 2 f ( xk ) x k +1 = x k − w ± w 2 − 4 f ( x k ) f [ x k , x k −1 , x k −2 ] Algoritmo para MatLab Para encontrar la solución a f ( x) = 0 debe tener tres aproximaciones x 0 , x1 , x 2 Valores de entrada: x 0 , x1 , x 2 ; tolerancia o margen de error TOL; y máximo numero de iteraciones No. Valores de salida: Solución aproximada p o mensaje de fallo. This implementation allows for a switch to complex arithmetic. Los coeficientes son almacenados en el vector A, so el dimension of A may have to be changed. syms('P', 'OK', 'TOL', 'M', 'X', 'FLAG', 'NAME', 'OUP', 'F', 'H'); syms('r','DEL1', 'DEL', 'I', 'B', 'D', 'E', 'J','x','s','N'); TRUE = 1; FALSE = 0; F = zeros(1,4); X = zeros(1,4); H = zeros(1,3); DEL1 = zeros(1,2); fprintf(1,'Este es el método de Mullers.\n'); fprintf(1,'Ingrese el polinomio P(x)\n'); fprintf(1,'Por ejemplo: para entrar x^3-2*x+4 ingrese \n'); fprintf(1,' [ 1 0 -2 4 ] \n'); P = input(' '); OK = TRUE; N = length(P); if N == 2 r = -P(N)/P(N-1); fprintf(1,'El Polinomio es lineal: La raíz es %11.8f\n', r); OK = FALSE; end if OK == TRUE OK = FALSE; while OK == FALSE fprintf(1,'Ingrese tolerancia\n'); TOL = input(' '); if TOL <= 0 fprintf(1,'La Tolerancia debe ser positiva \n'); else OK = TRUE; end end OK = FALSE; while OK == FALSE fprintf(1,'Ingrese el máximo numero de iteraciones – sin punto decimal \n'); M = input(' '); if M <= 0 fprintf(1,'Debe ser un entero positivo \n'); else OK = TRUE; end end fprintf(1,'Ingrese el primer de 3 valores de entrada \n'); X(1) = input(' '); fprintf(1,'Ingrese el segundo de 3 valores de entrada \n'); X(2) = input(' '); fprintf(1,'Ingrese el tercer de 3 valores de entrada \n'); X(3) = input(' '); end if OK == TRUE fprintf(1,'Seleccione output destination\n'); fprintf(1,'1. Screen\n'); fprintf(1,'2. Text file\n'); fprintf(1,'Enter 1 or 2\n'); FLAG = input(' '); if FLAG == 2 fprintf(1,'Input el file name in el form - drive:\\name.ext\n'); fprintf(1,'For example: A:\\OUTPUT.DTA\n'); NAME = input(' ','s'); OUP = fopen(NAME,'wt'); else OUP = 1; end fprintf(OUP, 'MULLERS METHOD\n'); fprintf(OUP, 'El output is i, approximation x(i), f(x(i))\n\n'); fprintf(OUP,'El real and imaginary parts of x(i) are\n'); fprintf(OUP,'followed by real and imaginary parts of f(x(i)).\n\n'); F(1) = polyval(P,X(1)); F(2) = polyval(P,X(2)); F(3) = polyval(P,X(3)); % STEP 1 H(1) = X(2)-X(1); H(2) = X(3)-X(2); DEL1(1) = (F(2)-F(1))/H(1); DEL1(2) = (F(3)-F(2))/H(2); DEL = (DEL1(2)-DEL1(1))/(H(2)+H(1)); I = 3; % STEP 2 while I <= M & OK == TRUE % STEP 3 B = DEL1(2)+H(2)*DEL; D = B*B-4*F(3)*DEL; if abs(DEL) <= 1.0e-20 % test to see if straight line if abs(DEL1(2)) <= 1.0e-20 % straight line - test if horizontal line fprintf(1,'Horizontal Line\n'); OK = FALSE; else % straight line but not horizontal X(4) = (F(3)-DEL1(2)*X(3))/DEL1(2); H(3) = X(4)-X(3); end else % not a straight line D = sqrt(D); % STEP 4 E = B+D; if abs(B-D) > abs(E) E = B-D; end % STEP 5 H(3) = -2*F(3)/E; X(4) = X(3)+H(3); end if OK == TRUE F(4) = polyval(P,X(4)); fprintf(OUP, '%d %f %f %f %f\n',I,X(4),imag(X(4)),F(4),imag(F(4))); end % STEP 6 if abs(H(3)) < TOL % Procedure completed successfully. fprintf(OUP, '\nMethod Succeeds\n'); fprintf(OUP, 'Approximation is within %.10e\n', TOL); fprintf(OUP, 'in %d iterations\n', I); OK = FALSE; else % STEP 7 for J = 1:2 H(J) = H(J+1); X(J) = X(J+1); F(J) = F(J+1); end X(3) = X(4); F(3) = F(4); DEL1(1) = DEL1(2); DEL1(2) = (F(3)-F(2))/H(2); DEL = (DEL1(2)-DEL1(1))/(H(2)+H(1)); end I = I+1; end % STEP 8 if I > M & OK == TRUE % Procedure completed unsuccessfully. fprintf (OUP, 'Method Failed\n'); end if OUP ~= 1 fclose(OUP); fprintf(1,'Output file %s created sucessfully\n',NAME); end end Otro algoritmo para la función de muller function [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT) % Entrada % - F es la función, almacenada como un archivo F.m % - X0, X1, X2 son los valores iniciales % - EPS1 es el criterio de convergencia % - EPS2 es el criterio de exactitud % - MAXIT es el número máximo de iteraciones % Salida % - Xp es el valor de la raíz aproximada % - ITER es el número de iteraciones realizadas % - FLAG es una variable lógica, es 1 si hubo convergencia, caso contrario es 0 for K = 1 : MAXIT F10 = (feval(F, X1) - feval(F, X0)) / (X1 - X0); F21 = (feval(F, X2) - feval(F, X1)) / (X2 - X1); F210 = (F21 - F10) / (X2 - X0); A2 = F210; A1 = F21 - (X2 + X1) * A2; A0 = feval(F, X2) - X2 * (F21 - X1 * A2); D1 = -A1 + sqrt(A1^2 - 4 * A0 * A2); D2 = -A1 - sqrt(A1^2 - 4 * A0 * A2); if (abs(D1) > abs(D2)) X3 = 2 * A0 / D1; else X3 = 2 * A0 / D2; end if (abs(X3 - X0) <= EPS1 | abs(feval(F, X3)) <= EPS2) Xp = X3; ITER = K; FLAG = 1; return; end X0 = X1; X1 = X2; X2 = X3; end disp('Se ha excedido ITER = MAXIT; FLAG = 0; return; el máximo número de iteraciones...' ); Nota. Para usar el programa MULLER, es necesario introducir la función de iteración f(x) en un archivo, por ejemplo F.m, que cumpla con la sintaxis de MATLAB para la creación de funciones, y que pueda ser llamado por MULLER como una cadena de caracteres.