jueves, 21 de enero de 2021

Método de Bisección: Bolzano a lo Bestia

   El método de bisección para la resolución numérica de ecuaciones me parece el más intuitivo, sencillo y fácil de aplicar de entre los denominados métodos iterativos convergentes, es decir, métodos que generan una sucesión de números que se pretende que converja a la solución exacta, entre los que se incluyen el método de la secante, de Newton-Raphson, etc. En su contra, el método que voy a tratar, destaca su lenta capacidad de convergencia, esto es, requiere un número de pasos elevado para alcanzar una solución aproximada, frente a otros métodos más rápidos pero más complejos.

   El Teorema de Bolzano se estudia en secundaria por su sencillez y eficacia en esos niveles ya que tan solo requiere un par de condiciones en la hipótesis para asegurar la tesis. Dice lo siguiente: consideremos una función f continua definida en un intervalo [a, b] de tal manera que f(a)f(b)<0. Esto equivale a decir que la función cambia de signo en el intervalo [a, b], más claro todavía, signof(a) ha de ser distinto de signof(b), cualesquiera que sean a y b. Entonces, se asegura que la función f se anula en algún punto del interior de [a, b], es decir, existe un punto c con la condición a < c <b tal que f(c) = 0.

   Como detalle del método de bisección hay que decir que garantiza al menos una solución en el intervalo tratado pero no asegura nada sobre la existencia de más de un cero en dicho intervalo. El método es tan sencillo como aplicar el Teorema de Bolzano reiteradamente en el intervalo [a, b]. Establece pues, que una primera aproximación a la solución exacta, llamémosla "s", es el punto medio del intervalo x1 = (a + b)/2. Si evaluamos la función f en este punto nos encontramos con tres posibilidades:

1) que f(x1) = 0 (¡solución exacta! ocurrirá muy pocas veces…) con lo que s = x1.

2) f(a)f(x1) < 0, en cuyo caso, aplicando de nuevo el Teorema de Bolzano, la solución se encontrará en el intervalo en el que f cambia de signo, esto es, en [a, x1].

3) f(x1)f(b) < 0, lo que asegura, aplicando Bolzano, que la solución estará en [x1, b].

 En cualquiera de los dos últimos casos, llamamos [a2, b2] al intervalo que contiene la solución (se puede considerar [a, b] = [a1, b1]) y se repite el procedimiento, con lo que x2 = (a2 + b2)/2 sería la nueva aproximación a la solución s y se volverían a ofrecer las tres posibilidades anteriores.

El error absoluto cometido en este proceso iterativo viene dado por |xns| es menor o igual al cociente (bnan)/2 = (bn-1an-1)/22 = … = (b2a2)/2n-1 = (ba)/2n.

Con esta acotación se puede determinar fácilmente el número mínimo de iteraciones del método que es necesario realizar para asegurar que el error absoluto cometido sea menor que una cierta cantidad positiva prefijada e, ya que para que |xns| < e, es suficiente exigir que (ba)/2n < e, lo cual se da siempre que n > Ln ((ba)/e) – Ln(2), siendo Ln el logaritmo neperiano.

De lo anterior se deduce que, fijado un error, se ha de despejar n, que es el número de iteraciones que habrá que calcular. Una vez en este punto, se evalúa f(xn) y obtenemos así un valor tan próximo a cero como el error que hemos prefijado.

Existe muchos métodos de aproximación de soluciones de una ecuación: implícitos, explícitos, Runge-Kutta, Sturm, etc, con diversa complejidad pero, el más sencillo y eficaz (aunque lento) es el que he expuesto en estas líneas. Espero que el lector lo aplique con objetividad, a mí me ayudó mucho.