Вычисление приближений конечных разностей на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь оценивать приближения конечных разностей производных в C. Практикум охватывает следующие шаги:

  1. Определите математическую функцию f(x) и задайте шаг h для приближений конечных разностей.
  2. Вычислите прямые и обратные приближения конечных разностей производной f(x) в заданной точке вычисления x.
  3. Выведите вычисленные приближения и сравните их с истинной производной.

По завершении этого практикума вы получите глубокое понимание того, как реализовать методы конечных разностей в 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

Давайте разберем ключевые компоненты:

  1. Функция f(x): Мы определили простую квадратичную функцию f(x) = x^2. Вы можете изменить эту функцию, чтобы она представляла любую математическую функцию, которую вы хотите приблизить.

  2. Шаг h: Это малое значение, используемое в приближениях конечных разностей. Меньшее значение h обычно обеспечивает более точные результаты, но чрезвычайно малые значения могут привести к проблемам с числовой точностью.

  3. Точка вычисления 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

Давайте разберем приближения конечных разностей:

  1. Прямая разность: Вычисляет производную, используя точку, следующую за x.

    • Формула: (f(x + h) - f(x)) / h
    • Приближает скорость изменения, двигаясь вперед.
  2. Обратная разность: Вычисляет производную, используя точку, предшествующую 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

Основные наблюдения:

  1. По мере уменьшения шага h приближение становится более точным.
  2. Прямые и обратные разности сходятся к истинной производной.
  3. Ошибка уменьшается при уменьшении шага.

Резюме

В этом лабораторном практикуме вы изучили, как определить математическую функцию и установить шаг для приближений конечных разностей на языке C. Вы также научились вычислять прямые и обратные приближения конечных разностей производных. Ключевые шаги включали определение функции f(x) и шага h, а также реализацию методов прямой и обратной разности для приближения производной в заданной точке x. Это создаёт основу для понимания и реализации методов конечных разностей в численном анализе и научном вычислении.