freeCodeCamp/guide/russian/mathematics/simpsons-rule/index.md

117 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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)