Introdução
Neste laboratório, você aprenderá a avaliar aproximações de diferenças finitas de derivadas em C. O laboratório cobre os seguintes passos:
- Definir uma função matemática
f(x)e configurar o tamanho do passohpara as aproximações de diferenças finitas. - Calcular as aproximações de diferenças finitas progressivas e regressivas da derivada de
f(x)num ponto de avaliação dadox. - Imprimir as aproximações calculadas e compará-las com a derivada verdadeira.
No final deste laboratório, você terá uma compreensão sólida de como implementar métodos de diferenças finitas em C e avaliar a precisão das aproximações.
Definir f(x) e o Tamanho do Passo h
Neste passo, você aprenderá a definir uma função matemática e configurar o tamanho do passo para aproximações de diferenças finitas em C.
Primeiro, crie um novo arquivo C para o seu programa de aproximação de diferenças finitas:
cd ~/project
nano finite_difference.c
Agora, adicione o seguinte código para definir a função e o tamanho do passo:
#include <stdio.h>
#include <math.h>
// Define a função f(x)
double f(double x) {
return x * x; // Função de exemplo: f(x) = x^2
}
int main() {
// Define o tamanho do passo h
double h = 0.0001; // Tamanho de passo pequeno para aproximação precisa
// Ponto no qual avaliar a derivada
double x = 2.0;
printf("Função: f(x) = x^2\n");
printf("Tamanho do passo h: %f\n", h);
printf("Ponto de avaliação x: %f\n", x);
return 0;
}
Saída de exemplo:
Função: f(x) = x^2
Tamanho do passo h: 0.000100
Ponto de avaliação x: 2.000000
Vamos decompor os componentes-chave:
Função
f(x): Definimos uma função quadrática simples f(x) = x^2. Você pode modificar esta função para representar qualquer função matemática que deseje aproximar.Tamanho do passo
h: Este é um valor pequeno usado em aproximações de diferenças finitas. Umhmenor geralmente fornece resultados mais precisos, mas valores extremamente pequenos podem levar a problemas de precisão numérica.Ponto de avaliação
x: Este é o ponto no qual calcularemos a aproximação da derivada.
Compile o programa para garantir que ele funciona:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Saída de exemplo:
Função: f(x) = x^2
Tamanho do passo h: 0.000100
Ponto de avaliação x: 2.000000
Calcular Diferenças Progressivas/Regressivas
Neste passo, você aprenderá a calcular aproximações de diferenças finitas progressivas e regressivas de derivadas.
Abra o arquivo anterior e modifique o código para incluir os métodos de aproximação da derivada:
cd ~/project
nano finite_difference.c
Atualize o código com os cálculos de diferenças progressivas e regressivas:
#include <stdio.h>
#include <math.h>
// Define a função f(x)
double f(double x) {
return x * x; // Função de exemplo: f(x) = x^2
}
int main() {
// Define o tamanho do passo h
double h = 0.0001; // Tamanho de passo pequeno para aproximação precisa
// Ponto no qual avaliar a derivada
double x = 2.0;
// Aproximação da Diferença Progressiva
double forward_diff = (f(x + h) - f(x)) / h;
// Aproximação da Diferença Regressiva
double backward_diff = (f(x) - f(x - h)) / h;
printf("Aproximação da Diferença Progressiva: %f\n", forward_diff);
printf("Aproximação da Diferença Regressiva: %f\n", backward_diff);
return 0;
}
Compile e execute o programa:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Saída de exemplo:
Aproximação da Diferença Progressiva: 4.000100
Aproximação da Diferença Regressiva: 3.999900
Vamos decompor as aproximações de diferenças finitas:
Diferença Progressiva: Calcula a derivada usando o ponto à frente de x
- Fórmula: (f(x + h) - f(x)) / h
- Aproxima a taxa de variação movendo-se para frente
Diferença Regressiva: Calcula a derivada usando o ponto atrás de x
- Fórmula: (f(x) - f(x - h)) / h
- Aproxima a taxa de variação movendo-se para trás
Observe que, para a função f(x) = x^2, a derivada verdadeira é 2x (que é 4 em x = 2). As aproximações estão muito próximas do valor real da derivada.
Print the Approximations
In this step, you will enhance the program to print detailed approximation results and compare them with the actual derivative.
Open the previous file and modify the code to include comprehensive output:
cd ~/project
nano finite_difference.c
Update the code with detailed approximation printing:
#include <stdio.h>
#include <math.h>
// Define the function f(x)
double f(double x) {
return x * x; // Example function: f(x) = x^2
}
// Actual derivative function
double actual_derivative(double x) {
return 2 * x; // Derivative of x^2 is 2x
}
int main() {
// Define multiple step sizes for comparison
double step_sizes[] = {0.1, 0.01, 0.001, 0.0001};
int num_steps = sizeof(step_sizes) / sizeof(step_sizes[0]);
// Point at which to evaluate the derivative
double x = 2.0;
// Actual derivative value
double true_derivative = actual_derivative(x);
printf("Derivative Approximation Analysis\n");
printf("--------------------------------\n");
printf("Function: f(x) = x^2\n");
printf("Evaluation Point: x = %f\n", x);
printf("True Derivative: %f\n\n", true_derivative);
printf("Step Size | Forward Diff | Backward Diff | Forward Error | Backward Error\n");
printf("-----------------------------------------------------------------------\n");
// Compute and print approximations for different step sizes
for (int i = 0; i < num_steps; i++) {
double h = step_sizes[i];
// Forward Difference Approximation
double forward_diff = (f(x + h) - f(x)) / h;
// Backward Difference Approximation
double backward_diff = (f(x) - f(x - h)) / h;
// Calculate absolute errors
double forward_error = fabs(forward_diff - true_derivative);
double backward_error = fabs(backward_diff - true_derivative);
printf("%9f | %11f | %12f | %11f | %12f\n",
h, forward_diff, backward_diff, forward_error, backward_error);
}
return 0;
}
Compile and run the program:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Example output:
Derivative Approximation Analysis
--------------------------------
Function: f(x) = x^2
Evaluation Point: x = 2.000000
True Derivative: 4.000000
Step Size | Forward Diff | Backward Diff | Forward Error | Backward Error
-----------------------------------------------------------------------
0.100000 | 4.100000 | 3.900000 | 0.100000 | 0.100000
0.010000 | 4.010000 | 3.990000 | 0.010000 | 0.010000
0.001000 | 4.001000 | 3.999000 | 0.001000 | 0.001000
0.000100 | 4.000100 | 3.999900 | 0.000100 | 0.000100
Key observations:
- As step size
hdecreases, the approximation becomes more accurate - Forward and backward differences converge to the true derivative
- Error reduces with smaller step sizes
Resumo
Neste laboratório, você aprendeu a definir uma função matemática e a configurar o tamanho do passo para aproximações de diferenças finitas em C. Também aprendeu a calcular aproximações de diferenças finitas progressivas e regressivas de derivadas. Os passos-chave abordados incluem a definição da função f(x) e do tamanho do passo h, bem como a implementação dos métodos de diferença progressiva e regressiva para aproximar a derivada em um ponto de avaliação x dado. Isso fornece uma base para entender e implementar técnicas de diferenças finitas em análise numérica e computação científica.



