En este post te mostraré cómo usar el método de la bisección en C++ para la búsqueda de raíces. Se imprimirá una tabla con todas las iteraciones hasta que el error sea mínimo.
Lo hice con una ecuación o fórmula que puede cambiarse según sea el caso.
Método de la bisección en C++
La verdad es que no soy un matemático, pero sí un programador. El código queda así:
/*
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
Copyright (c) 2020 Luis Cabrera Benito
Licenciado bajo la licencia MIT
El texto de arriba debe ser incluido en cualquier redistribución
===========================================
Método de la bisección en C++
===========================================
*/
#include <iostream>
#include <cmath>
using namespace std;
float resolverEcuacion(float valor) {
// Con la ecuación: X^3 + 4X ^2 -10
return pow(valor, 3) + 4 * (pow(valor, 2)) - 10;
}
int main() {
int iterador = 1;
/*
a = inferior
b = superior
*/
float a = 1;
float b = 2;
float xi_xi = 0;
float ultimo_xi = 0;
printf(
"|-----------------------------------------------------------------------"
"--------------------------------------------\n");
printf(
"| i | a | b | f(a) | f(b) | xi "
" | f(xi) |f(a) * f(xi) | xi-xi_ |\n");
printf(
"|-----------------------------------------------------------------------"
"--------------------------------------------\n");
while (1) {
float fa = resolverEcuacion(a);
float fb = resolverEcuacion(b);
float xi = (a + b) / 2;
float fxi = resolverEcuacion(xi);
float fa_fxi = fa * fxi;
xi_xi = abs(xi - ultimo_xi);
printf(
"|%3d |%12.8f |%12.8f |%12.8f |%12.8f |%12.8f |%12.8f |%12.8f "
"|%12.8f\n",
iterador, a, b, fa, fb, xi, fxi, fa_fxi, xi_xi);
iterador++;
if (fa_fxi > 0) {
a = xi;
} else {
b = xi;
}
ultimo_xi = xi;
if (xi_xi == 0) {
break;
}
}
}
Presta atención a la función resolverEcuacion
pues ahí puedes cambiar la fórmula. Recuerda que la tabla se imprimirá y que el ciclo infinito se romperá cuando xi_xi
sea 0.
Aquí tienes el ejemplo de cómo se ejecuta:
Nota: para alinear los valores e imprimir la tabla utilicé printf.