lunes, 28 de octubre de 2013

Métodos iterativos para resolver ecuaciones (V): el método de "regula falsi"

Esta entrada pertenece a la serie "Métodos iterativos para resolver ecuaciones" (parte I: introducción, parte II: método de Newton, parte III: método de bisección, parte IV: método de la secante).

Existe otro método iterativo para resolver numéricamente ecuaciones denominado "regula falsi". Una vez entendidos el método de bisección y el método de la secante, el método de "regula falsi" es sencillo de comprender porque se basa en ambos. Por una parte, realiza el mismo proceso de calcular el punto de corte de la secante a la función en dos puntos con el eje X. Una vez hallado el punto de corte, utiliza el criterio de los signos opuestos de las imágenes de las abscisas (del método de bisección) para decidir cuál de las dos abscisas anteriores se mantiene en la nueva iteración junto con la nueva abscisa proveniente del punto de corte calculado.


Conceptualmente no tengo mucho más que añadir, sin embargo sí que quiero compartir algunos detalles de la algoritmia del método. En un principio pensé que escribir el bucle del procedimiento sería poco más que un "copiar y pegar" de los dos procedimientos que ya están implementados en entradas anteriores (bisección y secante). Sin embargo solamente añadir el criterio de los signos opuestos de las imágenes de las abscisas al final del bucle del método de la secante no funciona y a continuación explico la razón.

La razón principal es que con este método, a diferencia del método de bisección, el intervalo en el que trabajamos en las sucesivas iteraciones no tiene por qué estrecharse tanto como se quiera para alcanzar una precisión predefinida. En la figura anterior puede observarse un caso en el que el intervalo se estrecha sólo por uno de los dos extremos. ¿Qué consecuencia tiene esto? Pues que el criterio que estábamos utilizando en métodos anteriores sobre la cercanía de los extremos de los intervalos para decidir cuándo se había alcanzado la precisión deseada no sirve.

Así que introduciendo la comprobación inicial de que las abscisas con las que empezamos tengan imágenes de signo opuesto, entramos en un bucle que se repite mientras los extremos de los intervalos disten más que la precisión definida. Dentro del bucle se calcula el punto de corte de la secante con el eje X y se determina el nuevo intervalo en función de dónde quede la alternancia de signo de las imágenes de las abscisas. Aquí se añade una comprobación más que en caso de cumplirse se sale del bucle: si dos iteraciones consecutivas producen abscisas tan cercanas como se haya definido en la precisión (¿podría esto parar el bucle en algunos casos antes de estar cerca de la solución?).

Las instrucciones en wxMaxima quedan de la siguiente manera:
x[0]:0; x[1]:1;
x[3]:x[0];
prec:10^(-4);
if p(x[0])*p(x[1]) < 0 then while abs(x[1]-x[0])>prec do (x[2]: float(x[0] - p(x[0])*(x[1]-x[0])/(p(x[1])-p(x[0]))), if p(x[2])=0 then return(x[2]), if p(x[0])*p(x[2]) < 0 then x[1]:x[2] else x[0]:x[2], if abs(x[3]-x[2])
float(x[2]);

Que en ejemplo que estamos resolviendo en esta serie

devuelve como solución .6629131443657456

No hay comentarios: