Приближённое вычисление интеграла с помощью правила Симпсона на C

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

Введение

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

Практикум состоит из двух основных этапов: определения функции и интервала, а затем использования правила Симпсона с чётным числом подынтервалов для вычисления приближённого интеграла. Это практическое упражнение поможет вам получить практический опыт применения методов численного интегрирования в программировании на языке C.

Определение f(x) и интервала [a, b]

На этом шаге мы подготовим базовые компоненты для реализации правила Симпсона для численного интегрирования на языке C. Мы определим функцию, подлежащую интегрированию, и укажем интервал интегрирования.

Сначала создадим новый файл C в каталоге ~/project:

cd ~/project
nano simpson_integration.c

Теперь напишем начальный код для определения нашей функции и интервала:

#include <stdio.h>
#include <math.h>

// Функция для интегрирования: f(x) = x^2
double f(double x) {
    return x * x;
}

int main() {
    // Определение интервала интегрирования [a, b]
    double a = 0.0;  // Нижняя граница
    double b = 1.0;  // Верхняя граница

    printf("Интегрирование f(x) = x^2 от %f до %f\n", a, b);

    return 0;
}

Рассмотрим код подробнее:

  1. Мы включаем необходимые заголовочные файлы: stdio.h для ввода/вывода и math.h для математических функций.
  2. f(x) определена как простая квадратичная функция x^2, которую мы будем интегрировать.
  3. В main() мы задаём интервал интегрирования от 0 до 1.
  4. Мы выводим интервал для наглядности.

Компилируем и запускаем код для проверки:

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

Пример вывода:

Интегрирование f(x) = x^2 от 0.000000 до 1.000000

Использование правила Симпсона с чётным числом подынтервалов

На этом шаге мы реализуем алгоритм правила Симпсона для приближённого вычисления определённого интеграла нашей функции. Мы добавим функцию интегрирования в нашу существующую программу на C.

Откройте предыдущий файл:

cd ~/project
nano simpson_integration.c

Обновите код, включив реализацию правила Симпсона:

#include <stdio.h>
#include <math.h>

// Функция для интегрирования: f(x) = x^2
double f(double x) {
    return x * x;
}

// Реализация правила Симпсона
double simpsons_rule(double a, double b, int n) {
    double h = (b - a) / n;  // Ширина каждого подынтервала
    double sum = f(a) + f(b);  // Первая и последняя точки

    // Вычисляем сумму для чётных и нечётных точек
    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += (i % 2 == 0 ? 2 : 4) * f(x);
    }

    return (h / 3) * sum;
}

int main() {
    // Определение интервала интегрирования [a, b]
    double a = 0.0;  // Нижняя граница
    double b = 1.0;  // Верхняя граница
    int n = 100;     // Число подынтервалов (должно быть чётным)

    double integral = simpsons_rule(a, b, n);

    printf("Интеграл от f(x) = x^2 от %f до %f\n", a, b);
    printf("Приближение с помощью правила Симпсона с %d подынтервалами: %f\n", n, integral);

    return 0;
}

Компилируем и запускаем код:

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

Пример вывода:

Интеграл от f(x) = x^2 от 0.000000 до 1.000000
Приближение с помощью правила Симпсона с 100 подынтервалами: 0.333333

Рассмотрим реализацию правила Симпсона:

  1. simpsons_rule() принимает границы интервала и число подынтервалов.
  2. h вычисляет ширину каждого подынтервала.
  3. Начинаем с первой и последней точек интервала.
  4. Цикл добавляет взвешенные значения от промежуточных точек.
  5. Чётные точки умножаются на 2, нечётные — на 4.
  6. Конечный результат масштабируется на h/3.

Вывод приближённого значения интеграла

На этом заключительном шаге мы улучшим нашу реализацию правила Симпсона, добавив более подробный вывод и сравнив численное приближение с точным значением интеграла.

Откройте предыдущий файл:

cd ~/project
nano simpson_integration.c

Обновите код, включив более подробный вывод:

#include <stdio.h>
#include <math.h>

// Функция для интегрирования: f(x) = x^2
double f(double x) {
    return x * x;
}

// Точное вычисление интеграла для f(x) = x^2 от a до b
double exact_integral(double a, double b) {
    return (pow(b, 3) - pow(a, 3)) / 3.0;
}

// Реализация правила Симпсона
double simpsons_rule(double a, double b, int n) {
    double h = (b - a) / n;  // Ширина каждого подынтервала
    double sum = f(a) + f(b);  // Первая и последняя точки

    // Вычисляем сумму для чётных и нечётных точек
    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += (i % 2 == 0 ? 2 : 4) * f(x);
    }

    return (h / 3) * sum;
}

int main() {
    // Определение интервала интегрирования [a, b]
    double a = 0.0;  // Нижняя граница
    double b = 1.0;  // Верхняя граница
    int n = 100;     // Число подынтервалов (должно быть чётным)

    // Вычисление приближения и точного интеграла
    double approx_integral = simpsons_rule(a, b, n);
    double exact_value = exact_integral(a, b);
    double error = fabs(exact_value - approx_integral);

    // Вывод подробных результатов
    printf("Результаты приближения интеграла:\n");
    printf("------------------------------\n");
    printf("Функция: f(x) = x^2\n");
    printf("Интервал: [%.2f, %.2f]\n", a, b);
    printf("Число подынтервалов: %d\n\n", n);

    printf("Приближение (правило Симпсона): %.6f\n", approx_integral);
    printf("Точное значение: %.6f\n", exact_value);
    printf("Абсолютная погрешность: %.6f\n", error);
    printf("Относительная погрешность: %.4f%%\n", (error / exact_value) * 100);

    return 0;
}

Компилируем и запускаем код:

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

Пример вывода:

Результаты приближения интеграла:
------------------------------
Функция: f(x) = x^2
Интервал: [0.00, 1.00]
Число подынтервалов: 100

Приближение (правило Симпсона): 0.333333
Точное значение: 0.333333
Абсолютная погрешность: 0.000000
Относительная погрешность: 0.0000%

Ключевые дополнения на этом шаге:

  1. Добавлена функция exact_integral() для вычисления точного значения интеграла.
  2. Вычислены абсолютная и относительная погрешности.
  3. Создан отформатированный вывод, отображающий подробные результаты интегрирования.

Резюме

В этом лабораторном практикуме мы сначала определили функцию для интегрирования, f(x) = x^2, и интервал интегрирования [a, b] = [0, 1]. Затем мы реализовали алгоритм правила Симпсона для приближённого вычисления определённого интеграла функции. Правило Симпсона предполагает деление интервала на чётное число подынтервалов и вычисление взвешенной суммы значений функции в конечных точках и серединах этих подынтервалов. Наконец, мы выведем приближённое значение интеграла, полученное с помощью правила Симпсона.