Imprimir a Raiz Aproximada
Neste passo, melhoraremos a implementação do método de Newton para fornecer um resultado mais detalhado sobre a aproximação da raiz.
Abra o arquivo newton_method.c anterior:
cd ~/project
nano newton_method.c
Atualize o código para melhorar a saída da aproximação da raiz:
#include <stdio.h>
#include <math.h>
// As definições de função e método anteriores permanecem as mesmas
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("Aproximação da Raiz pelo Método de Newton\n");
printf("-------------------------------------------\n");
printf("Estimativa Inicial: %f\n", x);
printf("Tolerância: %e\n", tolerance);
printf("Número Máximo de Iterações: %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("Erro: Derivada muito próxima de zero.\n");
return x;
}
double x_next = x - fx / fpx;
printf("Iteração %d:\n", i + 1);
printf(" x Atual: %f\n", x_next);
printf(" f(x): %f\n", f(x_next));
printf(" |x_próximo - x|: %e\n\n", fabs(x_next - x));
if (fabs(x_next - x) < tolerance) {
printf("Convergência alcançada!\n");
return x_next;
}
x = x_next;
}
printf("Número máximo de iterações atingido.\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 Finais:\n");
printf("-----------------\n");
printf("Raiz Aproximada: %f\n", root);
printf("f(raiz): %f\n", f(root));
printf("Erro Absoluto: %e\n", fabs(f(root)));
return 0;
}
Compile e execute o código:
gcc -o newton_method newton_method.c -lm
./newton_method
Saída de exemplo:
Aproximação da Raiz pelo Método de Newton
-------------------------------------------
Estimativa Inicial: 1.000000
Tolerância: 1.000000e-06
Número Máximo de Iterações: 10
Iteração 1:
x Atual: 2.500000
f(x): 2.250000
|x_próximo - x|: 1.500000e+00
Iteração 2:
x Atual: 2.050000
f(x): 0.202500
|x_próximo - x|: 4.500000e-01
... (mais iterações)
Convergência alcançada!
Resultados Finais:
-----------------
Raiz Aproximada: 2.000000
f(raiz): 0.000000
Erro Absoluto: 0.000000e+00
Melhorias-chave:
- Informações detalhadas sobre as iterações adicionadas
- Parâmetros iniciais exibidos
- Progresso da convergência mostrado
- Resultados finais impressos com erro absoluto