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

5.3 KiB
Raw Blame History

title localeTitle
Simpson's Rule Правило Симпсона

Правило Симпсона

В численном анализе правило Симпсона является методом численного интегрирования (численная аппроксимация определенных интегралов) .

Правило Симпсона аппроксимирует интегрирование формы,

где,

  • f(x) называется подынтегральным выражением
  • a = нижний предел интеграции
  • b = верхний предел интеграции

Правило Симпсона 1/3

Simpson's Rule

Как показано на диаграмме выше, подынтегральное выражение 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 .

Дополнительная информация:

  1. Правило Симпсона
  2. Правило Симпсона 1/3