Введение
В этом лабораторном практикуме вы научитесь оценивать приближения конечных разностей производных в C. Практикум охватывает следующие шаги:
- Определите математическую функцию
f(x)и задайте шагhдля приближений конечных разностей. - Вычислите прямые и обратные приближения конечных разностей производной
f(x)в заданной точке вычисленияx. - Выведите вычисленные приближения и сравните их с истинной производной.
По завершении этого практикума вы получите глубокое понимание того, как реализовать методы конечных разностей в C и оценить точность приближений.
Определение f(x) и шага h
В этом шаге вы узнаете, как определить математическую функцию и установить шаг для приближений конечных разностей в C.
Сначала создайте новый файл C для вашей программы приближения конечных разностей:
cd ~/project
nano finite_difference.c
Теперь добавьте следующий код для определения функции и шага:
#include <stdio.h>
#include <math.h>
// Определение функции f(x)
double f(double x) {
return x * x; // Пример функции: f(x) = x^2
}
int main() {
// Определение шага h
double h = 0.0001; // Малый шаг для точного приближения
// Точка, в которой нужно вычислить производную
double x = 2.0;
printf("Функция: f(x) = x^2\n");
printf("Шаг h: %f\n", h);
printf("Точка вычисления x: %f\n", x);
return 0;
}
Пример вывода:
Функция: f(x) = x^2
Шаг h: 0.000100
Точка вычисления x: 2.000000
Давайте разберем ключевые компоненты:
Функция
f(x): Мы определили простую квадратичную функцию f(x) = x^2. Вы можете изменить эту функцию, чтобы она представляла любую математическую функцию, которую вы хотите приблизить.Шаг
h: Это малое значение, используемое в приближениях конечных разностей. Меньшее значениеhобычно обеспечивает более точные результаты, но чрезвычайно малые значения могут привести к проблемам с числовой точностью.Точка вычисления
x: Это точка, в которой мы вычислим приближение производной.
Компилируйте программу, чтобы убедиться, что она работает:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Пример вывода:
Функция: f(x) = x^2
Шаг h: 0.000100
Точка вычисления x: 2.000000
Вычисление прямых/обратных разностей
В этом шаге вы научитесь вычислять прямые и обратные приближения конечных разностей производных.
Откройте предыдущий файл и измените код, включив методы приближения производной:
cd ~/project
nano finite_difference.c
Обновите код с вычислениями прямых и обратных разностей:
#include <stdio.h>
#include <math.h>
// Определение функции f(x)
double f(double x) {
return x * x; // Пример функции: f(x) = x^2
}
int main() {
// Определение шага h
double h = 0.0001; // Малый шаг для точного приближения
// Точка, в которой нужно вычислить производную
double x = 2.0;
// Прямое приближение конечных разностей
double forward_diff = (f(x + h) - f(x)) / h;
// Обратное приближение конечных разностей
double backward_diff = (f(x) - f(x - h)) / h;
printf("Прямое приближение конечных разностей: %f\n", forward_diff);
printf("Обратное приближение конечных разностей: %f\n", backward_diff);
return 0;
}
Компилируйте и запустите программу:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Пример вывода:
Прямое приближение конечных разностей: 4.000100
Обратное приближение конечных разностей: 3.999900
Давайте разберем приближения конечных разностей:
Прямая разность: Вычисляет производную, используя точку, следующую за x.
- Формула: (f(x + h) - f(x)) / h
- Приближает скорость изменения, двигаясь вперед.
Обратная разность: Вычисляет производную, используя точку, предшествующую x.
- Формула: (f(x) - f(x - h)) / h
- Приближает скорость изменения, двигаясь назад.
Обратите внимание, что для функции f(x) = x^2 истинная производная равна 2x (что составляет 4 при x = 2). Приближения очень близки к фактическому значению производной.
Вывод приближений
В этом шаге вы улучшите программу, чтобы выводить подробные результаты приближения и сравнивать их с фактической производной.
Откройте предыдущий файл и измените код, включив подробный вывод:
cd ~/project
nano finite_difference.c
Обновите код с подробным выводом приближений:
#include <stdio.h>
#include <math.h>
// Определение функции f(x)
double f(double x) {
return x * x; // Пример функции: f(x) = x^2
}
// Функция фактической производной
double actual_derivative(double x) {
return 2 * x; // Производная от x^2 равна 2x
}
int main() {
// Определение нескольких шагов для сравнения
double step_sizes[] = {0.1, 0.01, 0.001, 0.0001};
int num_steps = sizeof(step_sizes) / sizeof(step_sizes[0]);
// Точка, в которой нужно вычислить производную
double x = 2.0;
// Фактическое значение производной
double true_derivative = actual_derivative(x);
printf("Анализ приближения производной\n");
printf("--------------------------------\n");
printf("Функция: f(x) = x^2\n");
printf("Точка вычисления: x = %f\n", x);
printf("Истинная производная: %f\n\n", true_derivative);
printf("Шаг | Прямая разность | Обратная разность | Ошибка прямой разности | Ошибка обратной разности\n");
printf("-----------------------------------------------------------------------\n");
// Вычисление и вывод приближений для разных шагов
for (int i = 0; i < num_steps; i++) {
double h = step_sizes[i];
// Прямое приближение конечных разностей
double forward_diff = (f(x + h) - f(x)) / h;
// Обратное приближение конечных разностей
double backward_diff = (f(x) - f(x - h)) / h;
// Вычисление абсолютных ошибок
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;
}
Компилируйте и запустите программу:
gcc -o finite_difference finite_difference.c -lm
./finite_difference
Пример вывода:
Анализ приближения производной
--------------------------------
Функция: f(x) = x^2
Точка вычисления: x = 2.000000
Истинная производная: 4.000000
Шаг | Прямая разность | Обратная разность | Ошибка прямой разности | Ошибка обратной разности
-----------------------------------------------------------------------
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
Основные наблюдения:
- По мере уменьшения шага
hприближение становится более точным. - Прямые и обратные разности сходятся к истинной производной.
- Ошибка уменьшается при уменьшении шага.
Резюме
В этом лабораторном практикуме вы изучили, как определить математическую функцию и установить шаг для приближений конечных разностей на языке C. Вы также научились вычислять прямые и обратные приближения конечных разностей производных. Ключевые шаги включали определение функции f(x) и шага h, а также реализацию методов прямой и обратной разности для приближения производной в заданной точке x. Это создаёт основу для понимания и реализации методов конечных разностей в численном анализе и научном вычислении.



