Метод Сімпсона

Метод Сімпсона є одним із методів чисельного інтегрування. Названий на честь британського математика Томаса Сімпсона (1710—1761).

Метод Сімпсона одержується за допомогою інтерполяції функції f(x) (блакитний колір) квадратичним многочленом P(x) (червоний колір).

Формула

Формулою Сімпсона називається інтеграл від інтерполяційного многочлена другого степеня на відрізку :

де , і — значення функції у відповідних точках .

Похибка

При умові, що функція на відрізку має похідну четвертого порядку, похибка , дорівнює:

Зважаючи, що значення переважно не є відомим, для оцінки похибки використовується нерівність:

Виведення формули

Формула Сімпсона може бути виведена за допомогою багатьох різних способів.

Квадратична інтерполяція

Якщо замінити функцію квадратичним поліномом що приймає ті ж значення що й у точках a,b і m = (a+b) / 2. використавши інтерполяційну формулу Лагранжа, то одержимо формулу:

Після необхідних обчислень одержуємо:

Використання методів прямокутників і трапецій

У цьому способі виведення використовуються метод прямокутників:

і метод трапецій:

Похибки цих наближень дорівнюють

і

відповідно. Звідси випливає, що аби позбутися третього степеня слід взяти для наближення величину

Однак таким чином одержується формула Сімпсона.

Метод невизначених коефіцієнтів

Запишемо в загальному виді:

Коефіцієнти α, β і γ можуть бути знайдені з вимоги, що дане наближення є точним для всіх многочленів другого степеня. Таким чином знову ж одержується метод Сімпсона.

Ітераційна формула

Для точнішого обчислення інтеграла проміжок розбивають на відрізків однакової довжини і застосовують формулу Сімпсона на кожному з них. Значення інтеграла є сумою для всіх відрізків.

де величина кроку, а межі відрізків.

Загальну похибку при інтегруванні на відрізку з кроком визначають за формулою:

.

При неможливості оцінити похибку за допомогою четвертої похідної можна використати слабшу оцінку:

.

Приклади реалізації

Реалізація на C#:

using System;

namespace NumericIntgeration
{
    internal class Program
    {
        private delegate double Func(double x);

        private static void Main()
        {
            const int n = 10000;
            double result = SimpsonMethod(0.0, 2.0, n, x => x * Math.Exp(Math.Sqrt(x)));
            Console.WriteLine("x = {0}", result);

            Console.ReadKey();
        }
        private static double SimpsonMethod(double a, double b, int n, Func func)
        {
            double h = (b - a) / n;
            double s = (func(a) + func(b)) * 0.5;
            for (int i = 1; i <= n - 1; i++)
            {
                double xk = a + h * i; //xk
                double xk1 = a + h * (i - 1); //Xk-1
                s += func(xk) + 2 * func((xk1 + xk) / 2);
            }
            var x = a + h * n; //xk
            var x1 = a + h * (n - 1); //Xk-1
            s += 2 * func((x1 + x) / 2);

            return s * h / 3.0;
        }
    }
}

Див. також

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.