E128. Интегрирование по формуле Симпсона

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #numerical-methods
Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

Источник: e-maxx.ru/algo, страница PDF 419.

it is required посчитать значение определённого интеграла: Lời giải, описываемое здесь, было опубликовано в одной из диссертаций Томаса Симпсона (Thomas Simpson) в 1743 г.

Формула Симпсона

Пусть

— некоторое натуральное number. Разобьём отрезок интегрирования

на

равных частей:

Теперь посчитаем интеграл отдельно на каждом из отрезков

, а затем сложим все значения.

Итак, пусть мы рассматриваем очередной отрезок

. Заменим функцию

на

нём параболой, проходящей через 3 точки

. Такая парабола всегда существует и единственна. Её можно find аналитически, затем останется только проинтегрировать выражение для неё, и окончательно получаем: Складывая эти значения по всем отрезкам, получаем окончательную формулу Симпсона:

Погрешность

Погрешность, даваемая формулой Симпсона, не превосходит по модулю величины:

Таким образом, погрешность имеет порядок уменьшения как

.

Cài đặt

Здесь

— некоторая пользовательская функция.

double a, b; // Đầu vàoные данные

const int N = 1000*1000; // количество шагов (уже умноженное на 2)

double s = 0;

double h = (b - a) / N;

for (int i=0; i<=N; ++i) {

double x = a + h * i;

s += f(x) * ((i==0 || i==N) ? 1 : ((i&1)==0) ? 2 : 4);

}

s *= h / 3;

C# lời giải

bản nháp tự động, xem lại trước khi gửi
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    double a, b; // входные данные
    const int N = 1000*1000; // количество шагов (уже умноженное на 2)
    double s = 0;
    double h = (b - a) / N;
    for (int i=0; i<=N; ++i) {
            double x = a + h * i;
            s += f(x) * ((i==0 || i==N) ? 1 : ((i&1)==0) ? 2 : 4);
    }
    s *= h / 3;
}

C++ lời giải

đã khớp/gốc
double a, b; // входные данные
const int N = 1000*1000; // количество шагов (уже умноженное на 2)
double s = 0;
double h = (b - a) / N;
for (int i=0; i<=N; ++i) {
        double x = a + h * i;
        s += f(x) * ((i==0 || i==N) ? 1 : ((i&1)==0) ? 2 : 4);
}
s *= h / 3;

Java lời giải

bản nháp tự động, xem lại trước khi gửi
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    double a, b; // входные данные
    const int N = 1000*1000; // количество шагов (уже умноженное на 2)
    double s = 0;
    double h = (b - a) / N;
    for (int i=0; i<=N; ++i) {
            double x = a + h * i;
            s += f(x) * ((i==0 || i==N) ? 1 : ((i&1)==0) ? 2 : 4);
    }
    s *= h / 3;
}

Материал разбит как Thuật toánическая Bài toán: изучить постановку, понять асимптотику и реализовать Thuật toán на выбранном языке.

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.