117 lines
5.3 KiB
Markdown
117 lines
5.3 KiB
Markdown
---
|
||
title: Simpson's Rule
|
||
localeTitle: Правило Симпсона
|
||
---
|
||
# Правило Симпсона
|
||
|
||
В численном анализе правило Симпсона является методом численного интегрирования _(численная аппроксимация определенных интегралов)_ .
|
||
|
||
Правило Симпсона аппроксимирует интегрирование формы,
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim1.png)
|
||
|
||
где,
|
||
|
||
* `f(x)` называется _подынтегральным выражением_
|
||
* `a` = нижний предел интеграции
|
||
* `b` = верхний предел интеграции
|
||
|
||
## Правило Симпсона 1/3
|
||
|
||
![Simpson's Rule](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim01.jpg)
|
||
|
||
Как показано на диаграмме выше, подынтегральное выражение `f(x)` аппроксимируется полиномом второго порядка; квадратичным интерполятором является `P(x)` .
|
||
|
||
Далее следует приближение,
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim3.png)
|
||
|
||
Заменяя `(ba)/2` как `h` , получаем,
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim4.png)
|
||
|
||
Как вы можете видеть, в приведенном выше выражении есть коэффициент `1/3` . Вот почему это называется **Правилом 1/3 Симпсона** .
|
||
|
||
Если функция сильно осциллирует или не имеет производных в определенных точках, то приведенное выше правило может не дать точных результатов. Одним из распространенных способов решения этой проблемы является разбиение интервала `[a,b]` на несколько небольших подинтервалов. Затем правило Симпсона применяется к каждому подинтервалю, причем результаты суммируются для получения приближения интеграла по всему интервалу. Такой подход называется _составным правилом Симпсона_ .
|
||
|
||
Предположим, что отрезок `[a,b]` разбит на `n` подинтервалов, причем `n` - четное число. Затем составное правило Симпсона дается,
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim7.png)
|
||
|
||
где **x j = a + jh** для **j = 0,1, ..., n-1, n** с **h = (ba) / n** ; в частности, **x 0 = a** и **x n = b** .
|
||
|
||
#### Пример:
|
||
|
||
**Приблизьте значение приведенного ниже интеграла, взяв n = 8.**
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim9.png)
|
||
|
||
Реализация правила 1/3 Симпсона на C ++ заключается в следующем:
|
||
|
||
```cpp
|
||
#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 Симпсона гласит:
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim6.png)
|
||
|
||
Заменяя `(ba)/3` как `h` , получаем,
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim5.png)
|
||
|
||
Правило 3/8 Симпсона для n интервалов (n должно быть кратно 3):
|
||
|
||
![](https://raw.githubusercontent.com/pranabendra/articles/master/Simpson-Method/sim8.png)
|
||
|
||
где **x j = a + jh** для **j = 0,1, ..., n-1, n** с **h = (ba) / n** ; в частности, **x 0 = a** и **x n = b** .
|
||
|
||
### Дополнительная информация:
|
||
|
||
1. [Правило Симпсона](https://en.wikipedia.org/wiki/Simpson%27s_rule)
|
||
2. [Правило Симпсона 1/3](w3.gazi.edu.tr/~balbasi/mws_gen_int_txt_simpson13.pdf) |