Mostrando entradas con la etiqueta método de bisección. Mostrar todas las entradas
Mostrando entradas con la etiqueta método de bisección. Mostrar todas las entradas

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

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.


martes, 22 de octubre de 2013

Métodos iterativos para resolver ecuaciones (I): introducción

En la Educación Secundaria nos enseñan a encontrar la solución de las ecuaciones de primer grado y también un método para encontrar, en caso de existir, la/s solución/ones de ecuaciones de segundo grado.

Para resolver ecuaciones de orden superior nos enseñan un método de tanteo que utiliza el teorema del resto y el procedimiento de Ruffini

Curiosidades: ¿sabías que también existe una forma analítica de resolver ecuaciones de tercer grado? ¿y también para ecuaciones de cuarto grado? ¿Y sabías que está demostrado que no es posible encontrar métodos de este tipo para ecuaciones de grado mayor que 4?

Supongamos que estamos interesados en conocer la/s solución/ones real/es de la siguiente ecuación:
Pregunta: ¿Por qué podemos estar seguros de que tiene por lo menos una solución real?

Tras probar los valores 1, -1, 3 y -3 mediante el procedimiento de Ruffini podemos concluir que la ecuación no tiene soluciones racionales. (¿No sabes por qué? Aquí la explicación.)

Pedimos a wxMaxima que resuelva directamente la ecuación anterior:
solve(x^5+3*x^4−2*x^3−x^2+5*x−3=0,x);
Seguimos sin respuesta.
(Nota: otros programas dan las soluciones de la ecuación anterior cuando se les pide directamente que la resuelvan, pero lo hacen utilizando los métodos que vamos a comentar a continuación.)

Entonces, es momento de recurrir a otro tipo de métodos (que no se enseñan en ESO) para obtener una aproximación decimal de la/s solución/ones reales de la ecuación: los métodos iterativos.

Dos de los métodos más conocidos (y sencillos) son el método de bisección (una aplicación del teorema de Bolzano que se enseña en 2º de Bachillerato) y el método de Newton (que se enseña en algunos estudios universitarios).

http://ma1.eii.us.es/miembros/ajimenez/AN/TEO/Anima/img_tema1/V9_AN_Tema1_an35.gif

Los métodos anteriores también pueden aplicarse a funciones no polinómicas, pero tienen limitaciones importantes. Por ejemplo el método de bisección exige continuidad para asegurar la convergencia y el método de Newton exige derivabilidad y en algunos casos puede entrar en ciclos que no convergen.

En las próximas entradas de esta serie veremos estos métodos y cómo implementarlos en wxMaxima.


Entradas relacionadas: