قاعده سیمپسون

در علم محاسبات عددی روشی برای بدست آوردن عددی انتگرال‌ها وجود دارد که توسط توماس سیمپسون مورد استفاده قرار گرفته‌است و به همین دلیل به این روش قاعده سیمپسون می‌گویند.
در این قانون با استفاده از n بار استفاده از قانون ذوزنقه برای بدست آوردن مساحت زیر نمودار فرمولی برای مساحت زیر نمودار بدست میاورد که دقیقتر از روش ذوزنقه است.
در این قانون با تقسیم کردن نمودار به بخش‌های کوچک‌تر مساحت زیر نمودار را بدست میاورد (با تقسیم به n+1 بخش که n عددی زوج است).

البته حدود صد سال پیش از سیمپسون فردی به نام یوهانس کپلر از این فرمول استفاده کرده بود به همین دلیل گاهی به این روش قانون کپلر هم گفته می‌شود.

 تعمیم قاعده سیمپسون 
اگر اندازهٔ بازهٔ مورد انتگرال کوچک باشد، قاعده سیمپسون برای n = ۲ یک جواب نسبتاً دقیق از جواب انتگرال خواهد بود. اما اگر تابع ما پیوستگی نداشته باشد یا اندازهٔ بازهٔ مورد انتگرال بزرگ باشد یا تابع ما دارای مشتق‌های ناپیوسته باشد، در هر یک از این موارد قاعده سیمپسون برای n = ۲ جوابی دقیق ارائه نمی‌دهد. در این صورت می‌توان بازه را به n > 2 بخش تقسیم کرد و در هر یک از این بخش‌ها از قاعده سیمپسون استفاده کرد؛ که در این صورت به آن تعمیم قاعده سیمپسون گفته می‌شود.
فرض کنید بازهٔ انتگرال [a,b] به n بخش تقسیم شده‌است و همچنین n را عددی زوج در نظر بگیرید در این صورت طبق قاعده سیمپسون داریم

که در این فرمول  برای  و در آن 

خطای تعمیم قاعده سیمپسون برابر است باAtkinson صفحه ۲۵۶; Süli and Mayers, بخش ۷٫۵

که در آن  عددی بین  و  است و  طول هر گام است.

 قاعده سیمپسون یک سوم 
اگر چندجمله‌ای درجهٔ دو  را به جای تابع  در فرمول استفاده کنیم می‌توان با استفاده از درونیابی می‌توان این چندجمله‌ای را بدست آورد.Atkinson, صفحه ۲۵۶; Süli and Mayers, بخش ۷٫۲


با انتگرال گرفتن از دو طرف تساوی و استفاده از قانون لاگرانژ داریم:

که این روش انتگرال‌گیری که یک حالت خاص از قاعده سیمپسون است را با نام سیمپسون یک سوم می‌شناسند.

خطای این روش محاسبهٔ انتگرال برابر است با:Atkinson, معادلهٔ (۵٫۱٫۱۵); Süli and Mayers, تئوری 7.2

 که 

 میانگین نقطهٔ میانی و روش ذوزنقه 
از دیگر فرمول‌های به‌دست آمده از قاعده سیمپسون توسط فرمول‌های نقطهٔ میانی

و فرمول روش ذوزنقه

است که خطای این دو روش به ترتیب

و

هستند که برای استخراج فرمول جدید از این دو روش به نسبت خطاها آن‌ها را جمع می‌کنیم.

جمع وزن‌دار این دو فرمول دقیقاً همان فرمول سیمپسون یک سوم است.

 قاعده سیمپسون سه هشتم 
این قانون یکی دیگر از روش‌های محاسبهٔ انتگرال است. این قانون با درونیابی یک چندجمله‌ای درجه ۳ و استفاده از قاعده سیمپسون بدست می‌آید.Matthews 2004

خطای روش سیمپسون سه هشتم برابر است با:

 تعمیم قاعده سیمپسون سه هشتم 
در این روش با n بار استفاده از قاعده سیمپسون سه هشتم در بازهٔ [a,b] فرمول زیر به‌دست می‌آید

خطای روش تعمیم قاعده سیمپسون سه هشتم برابر است با

 قاعده سیمپسون تعمیم یافته 
در تعمیم قاعده سیمپسون به جای استفاده از قاعده سیمپسون در بین بخش‌های جداگانه، آن را بین بخش‌هایی که همپوشانی دارند استفاده می‌کنیم

این فرمول با استفاده از قاعده سیمپسون و قاعده سیمپسون سه هشتم و در نهایت میانگین گرفتن از دو فرمول به‌دست آمده به‌دست آمده‌است.

 قاعده سیمپسون تعمیم‌یافته برای داده‌های غیرمعمول 
برای انتگرال گرفتن از بازهٔ غیرمعمول  که به علت‌های مختلفی مانند کامل نبودن داده‌ها یا از بین رفتن آن‌ها رخ می‌دهد، لازم است آن را به بازه‌های غیر زوج تقسیم کنیم.

فرض کنید این بازه را به زوج زیر بخش () با ارتفاع‌های  تقسیم کرده‌ایم در این صورت داریم

که  مقادیر تابع اصلی در k امین نقطهٔ قاعده سیمپسون است و ضرایب  and  از طریق زیر به‌دست می‌آیند

که استفادهٔ این روش در قطعه کد زیر در پایتون (زبان برنامه‌نویسی) آمده‌است:

import numpy as np

def simpson_nonuniform(x, f):
    """
    Simpson rule for irregularly spaced data.

        Parameters
        ----------
        x : list or np.array of floats
                Sampling points for the function values
        f : list or np.array of floats
                Function values at the sampling points

        Returns
        -------
        float : approximation for the integral
    """
    N = len(x) - 1
    h = np.diff(x)

    result = 0.0
    for i in range(1, N, 2):
        hph = h[i] + h[i - 1]
        result += f[i] * ( h[i]**3 + h[i - 1]**3
                           + 3. * h[i] * h[i - 1] * hph )\
                     / ( 6 * h[i] * h[i - 1] )
        result += f[i - 1] * ( 2. * h[i - 1]**3 - h[i]**3
                              + 3. * h[i] * h[i - 1]**2)\
                     / ( 6 * h[i - 1] * hph)
        result += f[i + 1] * ( 2. * h[i]**3 - h[i - 1]**3
                              + 3. * h[i - 1] * h[i]**2)\
                     / ( 6 * h[i] * hph )

    if (N + 1) % 2 == 0:
        result += f[N] * ( 2 * h[N - 1]**2
                          + 3. * h[N - 2] * h[N - 1])\
                     / ( 6 * ( h[N - 2] + h[N - 1] ) )
        result += f[N - 1] * ( h[N - 1]**2
                           + 3*h[N - 1]* h[N - 2] )\
                     / ( 6 * h[N - 2] )
        result -= f[N - 2] * h[N - 1]**3\
                     / ( 6 * h[N - 2] * ( h[N - 2] + h[N - 1] ) )
    return result

 یادداشت‌ها 

 منابع 









رده:انتگرال‌گیری عددی
رده:حساب انتگرال
رده:محاسبات عددی
رده:ویکی‌سازی رباتیک