📂 Archivo técnico
Este contenido lo publiqué en un blog anterior durante mis primeros proyectos. Hoy lo conservo aquí como referencia y ejemplo práctico para quienes quieran reforzar la lógica de programación.
Contenido
ToggleMétodo de la bisección en C++
En esta entrada explico de manera detallada como crear un programa en donde se aplica el método de la bisección. Abarco tanto la teoría y la práctica. Para ello resuelvo un ejercicio de principio a fin.

Conceptos previos
Funcion matemática: Una función es una regla que relaciona un conjunto de elementos de entrada (dominio) con otro conjunto de elementos de salida (rango). En el código, se utiliza la función matemática f(x) que devuelve un valor en función del valor de entrada de x. Un ejemplo de función matemática es f(x) = x² + 1.
Intervalo: Es un conjunto de valores de entrada que se utilizan para evaluar una función. En el código, el intervalo [a, b] se utiliza para encontrar la raíz de la función f(x). Un ejemplo de intervalo es [0, 1].
Raíz de una función: La raíz de una función es un valor de entrada que hace que la función sea igual a cero. En el código, se utiliza el método de la bisección para encontrar la raíz de la función f(x). Un ejemplo de raíz de una función es la raíz cuadrada de 4, que es 2.
Método de la bisección: Es un método numérico utilizado para encontrar la raíz de una función. Este método divide un intervalo en dos partes iguales y determina en cuál de ellas se encuentra la raíz. En el código, se utiliza el método de la bisección para encontrar la raíz de la función f(x). Un ejemplo de método de la bisección es encontrar la raíz de la función f(x) = x² – 2 utilizando el intervalo [1, 2].
Precisión: Es la medida de exactitud en un cálculo numérico. En el código, se establece la precisión de salida de los valores de la función utilizando la biblioteca iomanip y la función setprecision. Un ejemplo de precisión es redondear un número decimal a dos decimales.
Tolerancia: Es la medida del error o diferencia aceptable entre el resultado esperado y el resultado obtenido. En el contexto del método de la bisección, la tolerancia se refiere a la precisión deseada en la aproximación de la raíz de una función. Se establece una tolerancia y el algoritmo de la bisección se ejecuta hasta que la aproximación a la raíz de la función sea menor que esa tolerancia.
Capturas de pantalla del tutorial




Código fuente en C++
#include
#include // setprecision
#include
#define PRECISION 6
using namespace std;
double f(double x);
void imprimePuntos(double a, double b);
int main()
{
cout << setprecision(PRECISION); // Establecemos la precisión
double a, b, tolerancia;
cout << "\nCalculo de las raices de una funcion aplicando el metodo de la biseccion" << endl;
cout << "\nIngrese el intervalo inicial [a, b]" << endl;
cout << "\na = ";
cin >> a;
cout << "b = ";
cin >> b;
imprimePuntos(a, b);
cout << "\nEscoja el intervalo adecuado" << endl;
cout << "\na = ";
cin >> a;
cout << "b = ";
cin >> b;
// [a, b]
float xr; // raiz de la función
/*
cout << "\nf(" << a << ") = " << f(a) << endl;
cout << "f(" << b << ") = " << f(b) << endl;
*/
if (f(a) * f(b) > 0) {
cout << "\nNo se puede aplicar el metodo de la biseccion\n";
cout << "porque f(" << a << ") y f(" << b << ") tienes el mismo signo" << endl;
} else {
cout << "Tolerancia = ";
cin >> tolerancia;
cout << "\na\tb\tx\tf(a)\t\tf(b)\t\tf(x)\n" << endl;
do {
xr = (a + b) / 2.0;
cout << a << "\t" << b << "\t" << xr << "\t";
cout << f(a) << "\t" << f(b) << "\t" << f(xr) << endl;
// Vemos si cumple o no cumple
if (abs(f(xr)) <= tolerancia) { // xr sería la raiz de f
cout << "\n\nPara una tolerancia " << tolerancia << " la raiz de f es " << xr << endl;
break;
} else {
if (f(xr) * f(a) > 0) {
a = xr;
} else if (f(xr) * f(b) > 0) {
b = xr;
}
}
} while (1);
}
cin.get();
cin.get();
return 0;
}
double f(double x)
{
return exp(-1 * x) - cos(3 * x) - 0.5;
}
#define INTERVALOS 10
void imprimePuntos(double a, double b)
{
int puntos = INTERVALOS + 1;
double ancho = (b - a) / INTERVALOS;
cout << "\n";
cout << "\tx\tf(x)\n" << endl;
for (int i = 0; i < puntos; i++) {
cout << "\t" << a << "\t" << f(a) << endl;
a = a + ancho;
}
}
Explicación del código
A continuación se explica las partes más importantes del código del método de la bisección en c++:
Líneas 1 a 3: estas líneas son las inclusión de las librerías iostream e iomanip. La primera se utiliza para permitir la entrada y salida de datos por consola, mientras que la segunda se utiliza para establecer la precisión de los números de punto flotante.
Línea 5: esta línea define la precisión utilizada para la salida de los números de punto flotante en el programa.
Líneas 81 a 84: esta sección del código se encarga de definir las funciones utilizadas en el programa. En este caso, solo se define la función f(x) que calcula el valor de una función específica en un punto dado.
Líneas 12 a 78: esta sección del código es la función principal, que es donde se lleva a cabo todo el proceso de cálculo de raíces de la función. Se comienza por establecer la precisión para la salida de los números, y luego se solicita al usuario el intervalo inicial de búsqueda de la raíz.
Líneas 26: se llama a la función “imprimePuntos” que se encarga de mostrar los puntos que forman la función en el intervalo de búsqueda.
Líneas 45 a 50: después de que el usuario haya seleccionado el intervalo adecuado, se define la variable “xr” que almacenará el valor de la raíz encontrada y se verifica si es posible aplicar el método de la bisección.
Líneas 36 a 46: si no es posible aplicar el método, se muestra un mensaje de error, indicando que las evaluaciones de la función en los extremos del intervalo tienen el mismo signo.
Líneas 48 a 73: en caso contrario, se solicita la tolerancia deseada y se inicia el bucle de cálculo de la raíz. Dentro del bucle, se calcula el valor de la función en el punto medio del intervalo actual y se verifica si cumple con la tolerancia deseada. Si es así, se muestra el valor de la raíz y se sale del bucle. En caso contrario, se decide en qué subintervalo se encuentra la raíz y se actualiza el intervalo de búsqueda.
Líneas 86 a 99: la función “imprimePuntos” se encarga de imprimir los puntos que forman la función en el intervalo de búsqueda. Se define la cantidad de puntos que se quieren imprimir (10 en este caso) y se calcula el ancho del intervalo. Luego se itera sobre los puntos y se imprime el valor de la función en cada uno de ellos.
En el código, la tolerancia se utiliza para determinar cuándo se ha encontrado una raíz de la función con suficiente precisión. La tolerancia se define como un valor máximo permitido para el valor absoluto de la función en el punto medio del intervalo. Si el valor absoluto de la función en el punto medio es menor o igual a la tolerancia, entonces se considera que se ha encontrado una raíz con suficiente precisión y se detiene el proceso.
Por ejemplo, en el siguiente fragmento de código, se verifica si el valor absoluto de la función en el punto medio es menor o igual a la tolerancia:
if (abs(f(xr)) <= tolerancia) { cout << "\n\nPara una tolerancia " << tolerancia << " la raiz de f es " << xr << endl; break; }
Si se cumple esta condición, se considera que se ha encontrado una raíz con suficiente precisión y se imprime la raíz encontrada.