Imprimir la Raíz Aproximada
En este paso, mejoraremos la implementación del método de Newton para proporcionar una salida más detallada sobre la aproximación de la raíz.
Abre el archivo anterior newton_method.c:
cd ~/project
nano newton_method.c
Actualiza el código para mejorar la salida de la aproximación de la raíz:
#include <stdio.h>
#include <math.h>
// Las definiciones de funciones y métodos anteriores permanecen igual
double f(double x) {
return x * x - 4;
}
double f_derivative(double x) {
return 2 * x;
}
double newton_method(double initial_guess, int max_iterations, double tolerance) {
double x = initial_guess;
printf("Aproximación de la Raíz por el Método de Newton\n");
printf("------------------------------------------------\n");
printf("Valor Inicial: %f\n", x);
printf("Tolerancia: %e\n", tolerance);
printf("Iteraciones Máximas: %d\n\n", max_iterations);
for (int i = 0; i < max_iterations; i++) {
double fx = f(x);
double fpx = f_derivative(x);
if (fabs(fpx) < tolerance) {
printf("Error: La derivada está demasiado cerca de cero.\n");
return x;
}
double x_next = x - fx / fpx;
printf("Iteración %d:\n", i + 1);
printf(" x actual: %f\n", x_next);
printf(" f(x): %f\n", f(x_next));
printf(" |x_next - x|: %e\n\n", fabs(x_next - x));
if (fabs(x_next - x) < tolerance) {
printf("¡Convergencia alcanzada!\n");
return x_next;
}
x = x_next;
}
printf("Se alcanzó el número máximo de iteraciones.\n");
return x;
}
int main() {
double initial_guess = 1.0;
int max_iterations = 10;
double tolerance = 1e-6;
double root = newton_method(initial_guess, max_iterations, tolerance);
printf("Resultados Finales:\n");
printf("-----------------\n");
printf("Raíz Aproximada: %f\n", root);
printf("f(raíz): %f\n", f(root));
printf("Error Absoluto: %e\n", fabs(f(root)));
return 0;
}
Compila y ejecuta el código:
gcc -o newton_method newton_method.c -lm
./newton_method
Salida de ejemplo:
Aproximación de la Raíz por el Método de Newton
------------------------------------------------
Valor Inicial: 1.000000
Tolerancia: 1.000000e-06
Iteraciones Máximas: 10
Iteración 1:
x actual: 2.500000
f(x): 2.250000
|x_next - x|: 1.500000e+00
Iteración 2:
x actual: 2.050000
f(x): 0.202500
|x_next - x|: 4.500000e-01
... (más iteraciones)
¡Convergencia alcanzada!
Resultados Finales:
-----------------
Raíz Aproximada: 2.000000
f(raíz): 0.000000
Error Absoluto: 0.000000e+00
Mejoras clave:
- Se agregó información detallada de la iteración.
- Se mostraron los parámetros iniciales.
- Se mostró el progreso de la convergencia.
- Se imprimieron los resultados finales con el error absoluto.