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:
- calcula el punto medio del intervalo;
- evalúa la función en ese punto;
- conserva la mitad que mantiene el cambio de signo;
- 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:
- 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
NaNo 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:
Esta forma evita el posible desbordamiento de (a+b)/2 cuando los extremos son muy grandes y tienen el mismo signo.
- 1Evaluar el punto medio.
Calcular
f(m). - 2Comprobar una raíz exacta.
Si
f(m)=0, finalizar. - 3Elegir la mitad izquierda.
Si
f(a)yf(m)tienen signos opuestos, reemplazarbporm. - 4Elegir la mitad derecha.
En caso contrario, reemplazar
aporm. - 5Comprobar la parada.
Evaluar ancho, residuo, iteraciones y posibles fallos.
04 · Garantía central
El invariante de encierro
Un invariante es una propiedad que permanece verdadera durante el algoritmo. En bisección mantenemos:
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.
| n | a | b | m | f(m) | Mitad conservada |
|---|---|---|---|---|---|
| 1 | 1 | 2 | 1.5 | −0.125 | [1.5, 2] |
| 2 | 1.5 | 2 | 1.75 | 1.609375 | [1.5, 1.75] |
| 3 | 1.5 | 1.75 | 1.625 | 0.666016 | [1.5, 1.625] |
| 4 | 1.5 | 1.625 | 1.5625 | 0.252197 | [1.5, 1.5625] |
| 5 | 1.5 | 1.5625 | 1.53125 | 0.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:
Si utilizamos el punto medio del intervalo resultante como aproximación, su distancia a cualquier raíz encerrada no supera la mitad del ancho:
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:
Por lo tanto:
Si en cambio detenemos cuando el ancho completo es menor que 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?
| Criterio | Condición | Qué controla |
|---|---|---|
| Ancho | (b−a)/2 ≤ tolX | Cota absoluta del punto medio |
| Residuo | |f(m)| ≤ tolF | Cumplimiento de la ecuación |
| Raíz exacta representable | f(m) === 0 | Finalización inmediata |
| Máximo | n = maxIteraciones | Presupuesto y seguridad |
| Estancamiento | m === a o m === b | Lí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:
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 | Limitaciones |
|---|---|
| Convergencia garantizada bajo sus condiciones | Más lento que métodos de orden superior |
| Cota de error explícita | Requiere un intervalo con cambio de signo |
| No necesita derivadas | No detecta directamente raíces pares |
| Costo predecible | Solo usa signos, no la forma de la función |
| Implementación sencilla y robusta | Puede 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.
Intervalo de encierro
f(x) = x³ − x − 2 · [1, 2]
La raíz permanece encerrada y el ancho se redujo 32 veces.
Preguntas para explorar
- ¿Qué ocurre con la cota cada vez que agregás una subdivisión?
- ¿El residuo disminuye en todas las iteraciones?
- Compará las tres funciones con la misma cantidad de subdivisiones.
- ¿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.