Método de Whittaker
| ||||||
Método de Whittaker. Es un método de la matemática numérica (por tanto interativo), utilizado para la solución numérica de ecuaciones lineales. Se dice que es un método quasi-Newton por sus semejanzas con el mismo. El método de Newton-Raphson tiene la ventaja de que su convergencia es cuadrática, por tanto es mucho más “rápida” que la lineal que se obtiene con otros métodos como el de Bisección.
Sumario
Descripción del método
El método de Whittaker resuelve el problema presente en el método de Newton pues solamente se evalúa la derivada de la función para el primer punto y se hace este valor constante para las iteraciones restantes.
x_(n+1)= x_n-(f(x_n))/m
donde:
m = f'(x_0)
mientras que el método de Newton realiza las aproximaciones a la solución de la forma:
x_(n+1)= x_n-(f(x_n))/(f'(x_n))
Desventaja
La desventaja de este método reside en que es necesario evaluar la derivada de la función tantas veces como iteraciones se realicen, lo cual es muy costoso desde el punto de vista computacional, y es posible que la derivada se anule o cambie de signo lo que puede provocar la aparición de una tangente horizontal o una aproximación muy alejada de la raíz donde incluso no podría estar definida la función.
El éxito del método de Whittaker radica en la selección de un buen X0 que no anule a m y garantice una rápida convergencia.
Este método no tiene una convergencia cuadrática como el de Newton pero siempre es más rápida que la convergencia lineal del método de Bisección.
Algoritmo
En pseudocódigo
- Entrar X0
- Entrar TE
- xanterior = x
- repeat
- x = xanterior – f(xanterior) / f’(xanterior)
- Error = | x - xanterior |
- xanterior = x
- until Error < TE
- La raíz buscada es x y su error absoluto máximo es Error
- Terminar
Implementación en C++
<span class="co1">//devuelve el valor de la función evaluada en la variable x</span> <span class="kw4">double</span> funcion<span class="br0">(</span><span class="kw4">double</span> x<span class="br0">)</span><span class="br0{</span> <span class="kw4">double</span> res <span class="sy1">=</span> ... <span class="co1">// ecuación que se desea solucionar evaluada en x;</span> <span class="kw1">return</span> res<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// devuelve el valor de la derivada de la función evaluada en la variable x</span> <span class="kw4">double</span> derivada<span class="br0(</span><span class="kw4">double</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw4">double</span> res <span class="sy1">=</span> <span class="co1">// derivada de la ecuación que se desea solucionar evaluada en x;</span> <span class="kw1">return</span> res<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// devuelve el resultado de la ecuación mediante el método de Whittaker.</span> <span class="co1">// recibe una aproximación arbitraria a la solución y el error máximo permitido.</span> <span class="co1">// puede ser necesario devolver el ERROR. </span> <span class="co1">// Considérese el uso de una estructura que contenga el valor de x y el ERROR.</span> <span class="co1">// en este ejemplo solo se devuelve el valor de x.</span> <span class="kw4">double</span> whittaker<span class="br0">(</span><span class="kw4">double</span> x0, <span class="kw4">double</span> eMaximo<span class="br0">)</span><span class="br0">{</span> <span class="kw4">double</span> ERROR <span class="sy1">=</span> <span class="nu0">1000000000</span><span class="sy4">;</span> <span class="co1">// valor muy grande.</span> <span class="kw4">double</span> xAnterior <span class="sy1">=</span> x0<span class="sy4">;</span> <span class="kw4">double</span> m <span class="sy1">=</span> derivada<span class="br0">(</span>x0<span class="br0">)</span><span class="sy4">;</span> <span class="kw4">double</span> x<span class="sy4">;</span> <span class="kw1">while</span><span class="br0">(</span>ERROR <span class="sy1">></span> eMaximo<span class="br0">)</span><span class="br0">{</span> x <span class="sy1">=</span> xAnterior – f<span class="br0">(</span>xAnterior<span class="br0">)</span> <span class="sy2">/</span> m<span class="sy4">;</span> Error <span class="sy1">=</span> <span class="sy3">|</span> x <span class="sy2">-</span> xAnterior <span class="sy3">|</span><span class="sy4">;</span> xAnterior <span class="sy1">=</span> x<span class="sy4">;</span> <span class="br0">}</span> <span class="kw1">return</span> x<span class="sy4">;</span> <span class="br0">}</span> <span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> <span class="kw4">double</span> x0, eMaximo<span class="sy4">;</span> <span class="kw3">cin</span> <span class="sy1">>></span> x0 <span class="sy1">>></span> eMaximo<span class="sy4">;</span> <span class="kw3">cout</span> <span class="sy1"><<</span> whittaker<span class="br0">(</span>x0, eMaximo<span class="br0">)</span><span class="sy4">;</span> <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="br0">}</span>Véase también
Bibliografía
- Colectivo de autores. (2004). Matemática numérica, Volumen 1. La Habana: Editorial Félix Varela. ISBN 959-258-713-2.
