jueves, 24 de octubre de 2013

Métodos iterativos para resolver ecuaciones (III): el método de bisección

Esta entrada pertenece a la serie "Métodos iterativos para resolver ecuaciones" (parte I, parte II).

El método de bisección conceptualmente es uno de los más sencillos. Por el teorema de Bolzano sabemos que si una función es continua y encontramos dos abscisas cuyas imágenes tienen signo opuesto, entonces existe por lo menos una abscisa enmedio cuya imagen es nula. O traducido al sentido común, si para ir de un punto que está en una parte del eje X a otro punto que está en la otra parte del eje X tengo que hacerlo sin levantar el bolígrafo del papel, a la fuerza tengo que cortar el eje por lo menos una vez.

Este resultado suele utilizarse en 2º de Bachillerato en ejercicios que piden demostrar que una ecuación (f(x)=0) tiene alguna solución (basta que la función f(x) sea continua y encontrar dos abscisas a y b tales que f(a)·f(b)< 0).

El método de bisección es simplemente ir estrechando el cerco a la solución (léase el entorno en el que se aplica Bolzano), hasta que los extremos del intervalo difieren tan poco como queramos (es decir, cuando alcancemos la precisión deseada). En cada iteración se coge el punto medio del intervalo anterior y se evalúa el signo de la imagen de la función en dicho punto. Si el punto medio no es solución de la ecuación, de los dos intervalos resultantes de partir por la mitad el anterior, nos quedamos el que sigue cumpliendo las condiciones del teorema de Bolzano, es decir, el que conserva la condición de que las imágenes de sus extremos tienen signos opuestos.

Si llevamos a cabo esta idea con la ecuación que aparece en la primera entrada de esta serie

La función es una función continua (por ser polinómica) por tanto sólo nos queda encontrar dos abscisas cuyas imágenes tengan signos opuestos.

Vamos a trabajar con wxMaxima. Definimos el polinomio:
p(x):=x^5+3*x^4−2*x^3−x^2+5*x−3;
Y vamos probando valores hasta encontrar imágenes con signos opuestos:
p(0);
-3
p(1);
3


Entonces ya podemos asegurar que dentro del intervalo (0, 1) existe una solución a dicha ecuación. Tomamos el punto medio, 0.5, y calculamos su imagen:
p(0.5);
−0.78125

El signo es negativo, por lo que el extremo del intervalo anterior que debo mantener es el que tenía imagen positiva, es decir, el 1. Así pues, ahora sé que la solución está en el intervalo (0.5, 1).

Repetimos el proceso unas cuantas veces:
p(0.75);
0.5302734375
Sabemos que la solución está en el intervalo (0.5, 0.75).
 

(0.5+0.75)/2;
0.625
p(%);
−0.200775146484375
Sabemos que la solución está en el intervalo (0.625, 0.75).
 

(0.625+0.75)/2;
0.6875
p(%);
.1387434005737305
Sabemos que la solución está en el intervalo (0.625, 0.6875).

En este punto ya podemos asegurar que una aproximación decimal a las décimas (por truncamiento) de la solución es 0.6, dado que todos los números del intervalo (0.625, 0.6875) cumplen esa condición. Si queremos más cifras decimales de precisión debemos continuar con las iteraciones del procedimiento hasta que los extremos del intervalo coincidan en tantas cifras decimales como precisión queramos en la aproximación decimal de la solución.

Podemos automatizar el método de bisección en wxMaxima de la siguiente manera:

- Definimos la precisión que deseamos:
prec:10^(-4);

- Introducimos los extremos del intervalo en el que queremos aplicar el método:
a:0; b:1;

- Comprobamos que el intervalo introducido cumple que las imágenes de sus extremos tienen signos opuestos y definimos el bucle que calcula el punto medio del intervalo y selecciona el que mantiene la alternancia de signos para continuar con la siguiente iteración, salvo que ese punto medio sea la solución buscada. Las iteraciones continúan hasta que la diferencia entre los extremos del intervalo es menor o igual que la precisión definida.
if p(a)*p(b) < 0 then
while abs(a-b)>prec do (c:(a+b)/2, if p(c)=0 then return(c), if p(a)*p(c) < 0 then b:c else a:c);


- Una vez ejecutado el bucle, si no devuelve la solución exacta, pedimos a wxMaxima que nos muestre el intervalo resultante de la última iteración:
float(a); float(b);
0.66290283203125
0.6629638671875

Por tanto, podemos asegurar que la aproximación decimal (por truncamiento) con cuatro cifras de precisión de la solución de la ecuación es 0.6629.

Observando el dibujo de la función, prueba con otros intervalos para encontrar aproximaciones decimales de las otras funciones.


No hay comentarios: