Raíces no lineales · Tema 09

Método de bisección

Cómo encerrar una raíz en un intervalo y reducir sistemáticamente su ancho hasta obtener una aproximación con una cota de error conocida.

01 · Punto de partida

Reducir la incertidumbre a la mitad

Supongamos que una función continua toma un valor negativo en a y uno positivo en b. Sabemos que existe al menos una raíz entre ambos puntos. El método de bisección utiliza esa garantía de una forma sencilla:

  1. calcula el punto medio del intervalo;
  2. evalúa la función en ese punto;
  3. conserva la mitad que mantiene el cambio de signo;
  4. repite el procedimiento.

Cada iteración reduce a la mitad el intervalo que encierra la raíz. No necesita derivadas, una estimación inicial muy precisa ni una forma particular de la función.

02 · Condiciones de aplicación

¿Cuándo podemos utilizar bisección?

Necesitamos un intervalo inicial [a,b] que satisfaga:

a < b,    f continua en [a,b],    f(a)·f(b) < 0
Intervalo válido
Los extremos son finitos, están ordenados y pertenecen al dominio.
Continuidad
La función no presenta saltos, huecos ni asíntotas dentro del intervalo.
Cambio de signo
Los valores de los extremos tienen signos opuestos.
Evaluaciones finitas
El algoritmo debe poder calcular la función sin producir NaN o infinitos.

Si f(a)=0 o f(b)=0, ya encontramos una raíz en un extremo y podemos finalizar antes de iterar.

03 · Procedimiento

El algoritmo paso a paso

Sea m el punto medio:

m = a + (b − a) / 2

Esta forma evita el posible desbordamiento de (a+b)/2 cuando los extremos son muy grandes y tienen el mismo signo.

  1. 1
    Evaluar el punto medio.

    Calcular f(m).

  2. 2
    Comprobar una raíz exacta.

    Si f(m)=0, finalizar.

  3. 3
    Elegir la mitad izquierda.

    Si f(a) y f(m) tienen signos opuestos, reemplazar b por m.

  4. 4
    Elegir la mitad derecha.

    En caso contrario, reemplazar a por m.

  5. 5
    Comprobar la parada.

    Evaluar ancho, residuo, iteraciones y posibles fallos.

[a,b]→m = punto medio→evaluar f(m)→conservar una mitad

04 · Garantía central

El invariante de encierro

Un invariante es una propiedad que permanece verdadera durante el algoritmo. En bisección mantenemos:

f(an) · f(bn) ≤ 0

y la raíz buscada permanece dentro de [aₙ,bₙ], suponiendo continuidad. Después de evaluar m, elegimos exactamente la mitad que conserva esta propiedad.

Este invariante aporta dos ventajas:

  • la aproximación nunca abandona la región garantizada;
  • el ancho del intervalo proporciona una cota de error aunque el residuo sea difícil de interpretar.
function signosOpuestos(x, y) {
  return (x < 0 && y > 0) || (x > 0 && y < 0);
}

console.log(signosOpuestos(-2, 4)); // true
console.log(signosOpuestos(-2, -1)); // false

Comparar signos directamente es preferible a comprobar x*y < 0, porque el producto podría desbordarse o subdesbordarse.

05 · Ejemplo manual

Resolver x³−x−2=0

Elegimos [1,2] porque f(1)=−2 y f(2)=4.

Primeras iteraciones de bisección.
nabmf(m)Mitad conservada
1121.5−0.125[1.5, 2]
21.521.751.609375[1.5, 1.75]
31.51.751.6250.666016[1.5, 1.625]
41.51.6251.56250.252197[1.5, 1.5625]
51.51.56251.531250.059113[1.5, 1.53125]

La raíz está cerca de 1.52138. La tabla no necesita conocerla: en cada fila solo utiliza signos y el punto medio.

06 · Precisión garantizada

Cota del error

Si el ancho inicial es L₀=b₀−a₀, después de n subdivisiones:

Ln = L₀ / 2n

Si utilizamos el punto medio del intervalo resultante como aproximación, su distancia a cualquier raíz encerrada no supera la mitad del ancho:

|mn − r| ≤ Ln/2 = L₀/2n+1

Esta cota es independiente de la forma de la curva. No necesita conocer la derivada ni el valor exacto de la raíz.

Convención de conteo

Algunos libros llaman x₁ al punto medio inicial y escriben una cota L₀/2ⁿ. Aquí n cuenta intervalos ya actualizados; por eso el punto medio posterior tiene cota L₀/2ⁿ⁺¹. Ambas expresiones son compatibles si se declara la convención.

07 · Costo predecible

Calcular cuántas iteraciones necesitamos

Si queremos que el error del punto medio sea como máximo ε, imponemos:

L₀ / 2n+1 ≤ ε

Por lo tanto:

n ≥ ⌈log₂(L₀/(2ε))⌉

Si en cambio detenemos cuando el ancho completo es menor que tolAncho:

n ≥ ⌈log₂(L₀/tolAncho)⌉
function divisionesParaError(longitudInicial, errorMaximo) {
  if (!(longitudInicial > 0) || !(errorMaximo > 0)) {
    throw new Error("Los valores deben ser positivos");
  }
  return Math.max(
    0,
    Math.ceil(Math.log2(longitudInicial / (2 * errorMaximo)))
  );
}

console.log(divisionesParaError(1, 1e-6)); // 19

Después de 19 subdivisiones de un intervalo de longitud 1, la cota del punto medio es menor o igual que 10⁻⁶.

08 · Criterios prácticos

¿Cuándo detener la bisección?

Criterios y su interpretación.
CriterioCondiciónQué controla
Ancho(b−a)/2 ≤ tolXCota absoluta del punto medio
Residuo|f(m)| ≤ tolFCumplimiento de la ecuación
Raíz exacta representablef(m) === 0Finalización inmediata
Máximon = maxIteracionesPresupuesto y seguridad
Estancamientom === a o m === bLímite de precisión del intervalo

El ancho ofrece una garantía sobre x; el residuo controla f(x). Una implementación puede aceptar cualquiera de ellos o exigir ambos, según la aplicación.

09 · Código reutilizable

Implementación robusta en JavaScript

function biseccion(funcion, inicio, fin, opciones = {}) {
  const {
    toleranciaX = 1e-10,
    toleranciaF = 1e-10,
    maxIteraciones = 100,
    guardarHistorial = false
  } = opciones;

  if (!(inicio < fin)) throw new Error("El intervalo debe estar ordenado");
  if (!(toleranciaX > 0) || !(toleranciaF > 0)) {
    throw new Error("Las tolerancias deben ser positivas");
  }

  let a = inicio;
  let b = fin;
  let fa = funcion(a);
  let fb = funcion(b);
  const historial = [];

  if (!Number.isFinite(fa) || !Number.isFinite(fb)) {
    throw new Error("La función no es finita en los extremos");
  }
  if (fa === 0) return crearResultado(a, true, "extremo_izquierdo", 0);
  if (fb === 0) return crearResultado(b, true, "extremo_derecho", 0);
  if (!signosOpuestos(fa, fb)) {
    throw new Error("Los extremos no encierran un cambio de signo");
  }

  for (let iteracion = 1; iteracion <= maxIteraciones; iteracion++) {
    const medio = a + (b - a) / 2;
    const fm = funcion(medio);
    const cotaError = (b - a) / 2;

    if (!Number.isFinite(fm)) {
      return crearResultado(medio, false, "valor_no_finito",
        iteracion, { a, b, residuo: Math.abs(fm), historial });
    }
    if (guardarHistorial) {
      historial.push({ iteracion, a, b, medio, fm, cotaError });
    }
    if (fm === 0) {
      return crearResultado(medio, true, "raiz_exacta",
        iteracion, { a, b, residuo: 0, cotaError, historial });
    }
    if (cotaError <= toleranciaX || Math.abs(fm) <= toleranciaF) {
      return crearResultado(medio, true, "tolerancia",
        iteracion, { a, b, residuo: Math.abs(fm), cotaError, historial });
    }
    if (medio === a || medio === b) {
      return crearResultado(medio, false, "estancamiento",
        iteracion, { a, b, residuo: Math.abs(fm), cotaError, historial });
    }

    if (signosOpuestos(fa, fm)) {
      b = medio;
      fb = fm;
    } else {
      a = medio;
      fa = fm;
    }
  }

  const medio = a + (b - a) / 2;
  return crearResultado(medio, false, "maximo_iteraciones",
    maxIteraciones, {
      a, b, residuo: Math.abs(funcion(medio)),
      cotaError: (b - a) / 2, historial
    });
}

function crearResultado(valor, convergio, motivo, iteraciones, datos = {}) {
  return { valor, convergio, motivo, iteraciones, ...datos };
}

function signosOpuestos(x, y) {
  return (x < 0 && y > 0) || (x > 0 && y < 0);
}

La función valida precondiciones, evita productos para comparar signos, calcula el medio con una forma segura y conserva diagnósticos.

10 · Ejecutar y verificar

Resolver la ecuación cúbica

const funcion = x => x ** 3 - x - 2;

const resultado = biseccion(funcion, 1, 2, {
  toleranciaX: 1e-12,
  toleranciaF: 1e-12,
  maxIteraciones: 100,
  guardarHistorial: true
});

console.log(resultado.valor);
console.log(resultado.residuo);
console.log(resultado.cotaError);
console.log(resultado.iteraciones);
console.table(resultado.historial.slice(0, 6));

La aproximación obtenida es cercana a 1.5213797068. La verificación debe incluir:

  • un residuo pequeño;
  • una cota de intervalo compatible con la tolerancia;
  • convergio === true;
  • un motivo esperado, no un máximo o estancamiento.

11 · Análisis del método

Convergencia lineal y costo

Bisección tiene convergencia lineal con factor 1/2 respecto del ancho:

Ln+1 = ½ Ln

Cada iteración gana aproximadamente un bit de precisión. Para ganar una cifra decimal se necesitan cerca de log₂(10) ≈ 3.32 iteraciones.

Fortalezas y limitaciones de bisección.
FortalezasLimitaciones
Convergencia garantizada bajo sus condicionesMás lento que métodos de orden superior
Cota de error explícitaRequiere un intervalo con cambio de signo
No necesita derivadasNo detecta directamente raíces pares
Costo predecibleSolo usa signos, no la forma de la función
Implementación sencilla y robustaPuede ser engañado por discontinuidades si no se verifica continuidad

12 · Casos problemáticos

Cuándo bisección no es apropiada

La función no cambia de signo

Puede no haber una raíz o existir una raíz de multiplicidad par. Bisección no tiene un intervalo garantizado para comenzar.

Existe una discontinuidad dentro del intervalo

Los signos opuestos pueden encerrar una asíntota. El intervalo se reducirá hacia ella sin encontrar un cero.

La función devuelve NaN o Infinity

El dominio no fue respetado o existe una singularidad. El algoritmo debe finalizar con diagnóstico.

El intervalo contiene varias raíces

Bisección conservará alguna región con cambio de signo, pero no enumera todas las soluciones y la raíz final puede depender de las subdivisiones.

La raíz es tangente

Una raíz par no altera el signo; hace falta otro mecanismo para localizarla.

13 · Exploración interactiva

Laboratorio: recorrer las subdivisiones

Elegí una función y mové el número de iteraciones. El gráfico resalta el intervalo que conserva el cambio de signo y marca su punto medio.

EXPERIMENTO 09

Intervalo de encierro

f(x) = x³ − x − 2 · [1, 2]

Los resultados numéricos aparecen debajo.
Intervalo actual[1,5; 1,53125]
Punto medio1,515625
Cota del error0,015625
Residuo0,03405

La raíz permanece encerrada y el ancho se redujo 32 veces.

Preguntas para explorar

  1. ¿Qué ocurre con la cota cada vez que agregás una subdivisión?
  2. ¿El residuo disminuye en todas las iteraciones?
  3. Compará las tres funciones con la misma cantidad de subdivisiones.
  4. ¿Por qué el ancho permite una garantía aunque el residuo no disminuya de forma monótona?

14 · Contexto algorítmico

Bisección y búsqueda binaria

Ambos algoritmos dividen un intervalo a la mitad, pero resuelven problemas diferentes:

Bisección numérica

Raíz de una función continua

Conserva el subintervalo donde los valores de la función mantienen un cambio de signo.

Búsqueda binaria

Elemento en una colección ordenada

Conserva la mitad donde puede encontrarse el objetivo según una comparación de orden.

La estructura “dividir y descartar una mitad” es común, pero las precondiciones, invariantes y criterios de parada no son intercambiables.

15 · Comprensión

Confusiones frecuentes

«El punto medio con menor residuo siempre define la mitad correcta»

La mitad se elige por el cambio de signo, no comparando magnitudes de residuos.

«Bisección encuentra todas las raíces del intervalo»

Conserva una cadena de intervalos con cambio de signo. Para enumerar raíces primero debemos aislarlas en intervalos separados.

«Un cambio de signo garantiza convergencia hacia una raíz»

También necesitamos continuidad. Una asíntota puede conservar signos opuestos indefinidamente.

«El residuo siempre se reduce a la mitad»

Lo que se reduce exactamente a la mitad es el ancho del intervalo. El residuo depende de la forma de la función.

«Calcular el medio como (a+b)/2 siempre es seguro»

La suma puede desbordarse. a + (b-a)/2 suele ser una forma más segura cuando los extremos tienen el mismo orden.

16 · Práctica guiada

Ejercicios

Ejercicio 1: verificar precondiciones

Determiná si bisección puede aplicarse a f(x)=x²−3 en [1,2], [−2,2] y [2,3].

Ver solución

En [1,2], f(1)=−2 y f(2)=1: sí. En [−2,2] ambos extremos valen 1: no cumple cambio de signo aunque contiene dos raíces. En [2,3] ambos valores son positivos: no.

Ejercicio 2: realizar iteraciones

Aplicá tres subdivisiones a f(x)=x²−2 comenzando en [1,2].

Ver solución razonada

m₁=1.5, f(m₁)>0: queda [1,1.5]. m₂=1.25, f(m₂)<0: queda [1.25,1.5]. m₃=1.375, f(m₃)<0: queda [1.375,1.5]. Su punto medio es 1.4375 y la cota es 0.0625.

Ejercicio 3: cantidad de subdivisiones

Partiendo de un intervalo de longitud 8, ¿cuántas subdivisiones garantizan una cota del punto medio menor o igual que 10⁻⁵?

Ver solución

n ≥ ceil(log₂(8/(2×10⁻⁵))) = ceil(log₂(400000)) = 19.

Ejercicio 4: detectar una falsa aplicación

Un programa aplica bisección a f(x)=1/(x−2) en [1,3]. Explicá el problema.

Ver solución

Los extremos tienen signos opuestos, pero la función no es continua en 2. El intervalo encierra una asíntota, no una raíz. La primera evaluación del punto medio produce una división por cero.

Ejercicio 5: modificar la política

Adaptá la implementación para exigir simultáneamente la cota de x y el residuo.

Ver una posible modificación
const cotaAceptable = cotaError <= toleranciaX;
const residuoAceptable = Math.abs(fm) <= toleranciaF;

if (cotaAceptable && residuoAceptable) {
  return crearResultado(medio, true, "ambas_tolerancias",
    iteracion, {
      a, b,
      residuo: Math.abs(fm),
      cotaError,
      historial
    });
}

17 · Síntesis

Ideas para recordar

  • Bisección requiere continuidad y un intervalo cuyos extremos tengan signos opuestos.
  • Cada iteración conserva la mitad que mantiene encerrada una raíz.
  • El ancho del intervalo se divide exactamente por dos en cada subdivisión.
  • El punto medio tiene una cota de error igual a la mitad del ancho actual.
  • La cantidad necesaria de iteraciones puede calcularse antes de comenzar.
  • El residuo y la cota del intervalo miden aspectos diferentes.
  • El método es robusto y predecible, pero converge linealmente.
  • Discontinuidades y raíces pares requieren análisis o métodos diferentes.

En el próximo tema estudiaremos el método de falsa posición, que conserva el intervalo con cambio de signo pero reemplaza el punto medio por una interpolación lineal.