5.3 KiB
title | localeTitle |
---|---|
Simpson's Rule | Правило Симпсона |
Правило Симпсона
В численном анализе правило Симпсона является методом численного интегрирования (численная аппроксимация определенных интегралов) .
Правило Симпсона аппроксимирует интегрирование формы,
где,
f(x)
называется подынтегральным выражениемa
= нижний предел интеграцииb
= верхний предел интеграции
Правило Симпсона 1/3
Как показано на диаграмме выше, подынтегральное выражение f(x)
аппроксимируется полиномом второго порядка; квадратичным интерполятором является P(x)
.
Далее следует приближение,
Заменяя (ba)/2
как h
, получаем,
Как вы можете видеть, в приведенном выше выражении есть коэффициент 1/3
. Вот почему это называется Правилом 1/3 Симпсона .
Если функция сильно осциллирует или не имеет производных в определенных точках, то приведенное выше правило может не дать точных результатов. Одним из распространенных способов решения этой проблемы является разбиение интервала [a,b]
на несколько небольших подинтервалов. Затем правило Симпсона применяется к каждому подинтервалю, причем результаты суммируются для получения приближения интеграла по всему интервалу. Такой подход называется составным правилом Симпсона .
Предположим, что отрезок [a,b]
разбит на n
подинтервалов, причем n
- четное число. Затем составное правило Симпсона дается,
где x j = a + jh для j = 0,1, ..., n-1, n с h = (ba) / n ; в частности, x 0 = a и x n = b .
Пример:
Приблизьте значение приведенного ниже интеграла, взяв n = 8.
Реализация правила 1/3 Симпсона на C ++ заключается в следующем:
#include<iostream>
#include<cmath>
using namespace std;
float f(float x)
{
return x*sin(x); //Define the function f(x)
}
float simpson(float a, float b, int n)
{
float h, x[n+1], sum = 0;
int j;
h = (ba)/n;
x[0] = a;
for(j=1; j<=n; j++)
{
x[j] = a + h*j;
}
for(j=1; j<=n/2; j++)
{
sum += f(x[2*j - 2]) + 4*f(x[2*j - 1]) + f(x[2*j]);
}
return sum*h/3;
}
int main()
{
float a,b,n;
a = 1; //Enter lower limit a
b = 4; //Enter upper limit b
n = 8; //Enter step-length n
if (n%2 == 0)
cout<<simpson(a,b,n)<<endl;
else
cout<<"n should be an even number";
return 0;
}
Правило 3/8 Симпсона
Правило 3/8 Симпсона аналогично правилу Симпсона 1/3. Единственное отличие состоит в том, что здесь интерполятор является кубическим многочленом. Правило 3/8 примерно в два раза точнее, чем правило 1/3, но оно использует еще одно значение функции.
Правило 3/8 Симпсона гласит:
Заменяя (ba)/3
как h
, получаем,
Правило 3/8 Симпсона для n интервалов (n должно быть кратно 3):
где x j = a + jh для j = 0,1, ..., n-1, n с h = (ba) / n ; в частности, x 0 = a и x n = b .