পাঠ ২৪ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Numerical Methods / সিম্পসনস রুল

সিম্পসনস রুল

Simpson's rule
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • সিম্পসনস রুলের জ্যামিতিক ধারণা — প্যারাবোলা দিয়ে ফাংশন আনুমানিক করা
  • কম্পোজিট সিম্পসনস রুলের ফর্মুলা এবং কেন এতে ১, ৪, ২, ৪, ২, ..., ৪, ১ প্যাটার্নের গুণক থাকে
  • একটি সত্যিকারের Python ইমপ্লিমেন্টেশন এবং L23-এর ট্র্যাপিজয়ডাল রুলের সাথে সরাসরি তুলনা
  • O(h⁴) কনভারজেন্স বাস্তব সংখ্যা দিয়ে যাচাই

১ · প্যারাবোলা দিয়ে আনুমানিক করা

L23-এ ট্র্যাপিজয়ডাল রুল প্রতিটি সাব-ইন্টারভালে f(x)-কে একটি সরলরেখা (ডিগ্রি-১ পলিনোমিয়াল) দিয়ে আনুমানিক করেছিল। সিম্পসনস রুলের ধারণা — একটি ধাপ এগিয়ে, প্রতি জোড়া সাব-ইন্টারভালে (তিনটি পয়েন্ট ব্যবহার করে) একটি প্যারাবোলা (ডিগ্রি-২ পলিনোমিয়াল) ফিট করা, কারণ একটি প্যারাবোলা সাধারণত একটি সরলরেখার চেয়ে ফাংশনের প্রকৃত আকৃতির অনেক কাছাকাছি যায়।

একক জোড়া সাব-ইন্টারভালে (পয়েন্ট x₀, x₁, x₂, প্রস্থ h প্রতিটির) সিম্পসনস রুলের ফর্মুলা:

$$\int_{x_0}^{x_2} f(x)\,dx \approx \frac{h}{3}\big[f(x_0) + 4f(x_1) + f(x_2)\big]$$

কম্পোজিট (একাধিক জোড়া সাব-ইন্টারভাল) সিম্পসনস রুলে এই প্যাটার্নটি পুরো ইন্টারভাল জুড়ে বিস্তৃত হয় — বিজোড় ইনডেক্সের পয়েন্টগুলো (জোড়ার মাঝের পয়েন্ট) গুণক ৪ পায়, জোড় ইনডেক্সের ভেতরের পয়েন্টগুলো (দুই জোড়ার সংযোগস্থল) গুণক ২ পায়, আর প্রথম ও শেষ পয়েন্ট গুণক ১:

$$\int_a^b f(x)\,dx \approx \frac{h}{3}\Big[f(x_0) + 4f(x_1) + 2f(x_2) + 4f(x_3) + \cdots + 4f(x_{n-1}) + f(x_n)\Big]$$
কেন n জোড় হতে হয়

সিম্পসনস রুল সাব-ইন্টারভালগুলোকে জোড়ায় জোড়ায় (প্রতি জোড়ায় একটি প্যারাবোলা) প্রক্রিয়া করে — তাই মোট সাব-ইন্টারভাল সংখ্যা n অবশ্যই জোড় হতে হবে। যদি n বিজোড় হয়, একটি সাব-ইন্টারভাল জোড়াবিহীন থেকে যাবে এবং সরল সূত্রটি প্রযোজ্য হবে না (বাস্তবে এই ক্ষেত্রে শেষ সাব-ইন্টারভালে ভিন্ন একটি ফর্মুলা বা n স্বয়ংক্রিয়ভাবে জোড় করে দেওয়া হয়)।

২ · সত্যিকারের ডেমো — একই n-এ ট্র্যাপিজয়ডাল বনাম সিম্পসনস

L23-এর একই ইন্টিগ্রাল (∫₀^π sin(x) dx = 2) ব্যবহার করে, এবার ট্র্যাপিজয়ডাল ও সিম্পসনস রুল পাশাপাশি একই n-এ চালিয়ে দেখা যাক কোনটি কতটা নির্ভুল:

Python
import math

def f(x):
    return math.sin(x)

a, b = 0.0, math.pi
true_val = 2.0

def trapezoidal(f, a, b, n):
    h = (b - a) / n
    total = 0.5 * (f(a) + f(b))
    for i in range(1, n):
        total += f(a + i * h)
    return total * h

def simpson(f, a, b, n):
    if n % 2 != 0:
        raise ValueError("সিম্পসনস রুলে n অবশ্যই জোড় হতে হবে")
    h = (b - a) / n
    total = f(a) + f(b)
    for i in range(1, n):
        x = a + i * h
        total += (4 if i % 2 != 0 else 2) * f(x)
    return total * h / 3

print(f"true integral of sin(x) from 0 to pi = {true_val}")
print()
print(f"{'n':>4} {'trapezoidal':>14} {'trap_err':>12} | {'simpson':>14} {'simp_err':>12} | {'simp_ratio':>10}")

prev_err = None
for n in [4, 8, 16, 32, 64]:
    trap = trapezoidal(f, a, b, n)
    simp = simpson(f, a, b, n)
    trap_err = abs(trap - true_val)
    simp_err = abs(simp - true_val)
    ratio = (prev_err / simp_err) if prev_err else float('nan')
    print(f"{n:>4} {trap:>14.10f} {trap_err:>12.3e} | {simp:>14.10f} {simp_err:>12.3e} | {ratio:>10.3f}")
    prev_err = simp_err

    
দুটি নাটকীয় ফলাফল দেখা যাচ্ছে। প্রথমত — একই n-এ সিম্পসনস সবসময় ট্র্যাপিজয়ডালের চেয়ে অনেক বেশি নির্ভুল: n = 8-এ ট্র্যাপিজয়ডালের এরর ২.৫৭৭ × ১০⁻², কিন্তু সিম্পসনসের এরর মাত্র ২.৬৯২ × ১০⁻⁴ — প্রায় ৯৬ গুণ বেশি নির্ভুল! দ্বিতীয়ত — সিম্পসনসের নিজের কনভারজেন্স রেট পরীক্ষা করলে দেখা যায় n দ্বিগুণ করলে এরর প্রায় ১৬ গুণ কমে (n=8→16: অনুপাত ১৬.৯, n=16→32: ১৬.২, n=32→64: ১৬.১) — ঠিক ১৬ = ২⁴, যা নিশ্চিত করে সিম্পসনস রুলের এরর সত্যিই O(h⁴) হারে কমছে, ট্র্যাপিজয়ডালের O(h²)-এর চেয়ে দুই ধাপ উপরে।

৩ · কেন এত বড় উন্নতি এত সামান্য পরিবর্তনে

সিম্পসনস রুল শুধু "একটু বেশি" নির্ভুল নয়, বরং একটি ভিন্ন শ্রেণির কনভারজেন্স অর্জন করে — এবং এর একটি চমকপ্রদ কারণ আছে। যদিও প্যারাবোলা একটি ডিগ্রি-২ পলিনোমিয়াল, সিম্পসনস রুলের এরর ফর্মুলা বিশ্লেষণ করলে দেখা যায় এটি আসলে ডিগ্রি-৩ পলিনোমিয়াল পর্যন্ত নিখুঁতভাবে (শূন্য এরর) ইন্টিগ্রেট করে — একটি প্যারাবোলা-ফিটিং মেথড প্রত্যাশার চেয়ে এক ডিগ্রি বেশি নির্ভুল, প্রতিসাম্যের (symmetry) কারণে বিজোড়-অর্ডার এরর টার্ম বাতিল হয়ে যাওয়ায়। এটাই নিউটন-কোটস পরিবারের একটি সুন্দর, প্রায়ই আশ্চর্যজনক বৈশিষ্ট্য।

মূল কথা · Key takeaway

সরলরেখা থেকে প্যারাবোলায় (ডিগ্রি ১ থেকে ২) যাওয়া মাত্র একটি ছোট পরিবর্তন মনে হলেও, ফলাফল একটি বিশাল নির্ভুলতা বৃদ্ধি — একই কম্পিউটেশনাল খরচের কাছাকাছি (শুধু গুণকের প্যাটার্ন ভিন্ন)। L25-এ আমরা দেখব কীভাবে সিম্পসনস রুলকে অ্যাডাপটিভভাবে প্রয়োগ করা যায় — যেখানে ফাংশনটি দ্রুত পরিবর্তিত হয়, সেখানে বেশি সাব-ইন্টারভাল বসিয়ে, আর যেখানে মসৃণ সেখানে কম বসিয়ে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ যদি f(x) নিজেই একটি প্যারাবোলা হয় (যেমন f(x) = x² + 3x + 1), সিম্পসনস রুলের এরর কত হবে বলে আপনার ধারণা?

ঠিক শূন্য (ফ্লোটিং-পয়েন্ট রাউন্ড-অফ ছাড়া) — L23-এ যেমন ট্র্যাপিজয়ডাল রুল সরলরেখার জন্য নিখুঁত ছিল, তেমনি সিম্পসনস রুল যেকোনো ডিগ্রি-২ (এবং আসলে ডিগ্রি-৩ পর্যন্ত, উপরের আলোচনা দেখুন) পলিনোমিয়ালের জন্য সম্পূর্ণ নিখুঁত, কারণ এটি সেই ফাংশনটিকেই ঠিক প্যারাবোলা দিয়ে ফিট করছে — কোনো আনুমানিকীকরণ এরর নেই।

প্র ০২ সিম্পসনস রুল ট্র্যাপিজয়ডাল রুলের চেয়ে ভালো, তাহলে সবসময় সিম্পসনস ব্যবহার না করার কোনো কারণ থাকতে পারে কি?

সাধারণত সিম্পসনস রুলই পছন্দনীয়, তবে কয়েকটি বাস্তব সীমাবদ্ধতা আছে — এটি সমান-দূরত্বে n জোড় সংখ্যক পয়েন্ট দাবি করে (অনিয়মিত-দূরত্বের ডেটাতে সরাসরি প্রযোজ্য নয়), এবং ফাংশনটি যথেষ্ট মসৃণ (চতুর্থ ডেরিভেটিভ সীমাবদ্ধ) না হলে O(h⁴) সুবিধা পুরোপুরি বাস্তবায়িত নাও হতে পারে — যেমন একটি ফাংশনে হঠাৎ ধারালো পরিবর্তন থাকলে (L25-এ এই বিষয়টি অ্যাডাপটিভ কোয়াড্রেচার দিয়ে সমাধান করা হবে)।

প্র ০৩ ট্র্যাপিজয়ডাল রুল (ডিগ্রি-১ ফিট, O(h²)) থেকে সিম্পসনস রুল (ডিগ্রি-২ ফিট, O(h⁴)) — এই প্যাটার্ন যদি চলতে থাকে, তাহলে ডিগ্রি-৩ পলিনোমিয়াল ফিট করলে কী এরর অর্ডার পাওয়া যেতে পারে বলে আপনার ধারণা?

বাস্তবে ডিগ্রি-৩ ফিট (একে "সিম্পসনস ৩/৮ রুল" বলা হয়) সিম্পসনস রুলের মতোই O(h⁴) এরর দেয়, এক ধাপ আরও উপরে যায় না — কারণ প্রতিসাম্যের সুবিধা (যা সিম্পসনসকে "বিনামূল্যে" এক ডিগ্রি বেশি নির্ভুলতা দিয়েছিল) জোড়-ডিগ্রি ফিটেই ঘটে। প্রকৃত পরবর্তী লাফ (O(h⁶)) পেতে ডিগ্রি-৪ পলিনোমিয়াল ফিট দরকার হয় — নিউটন-কোটস পরিবারের এই প্যাটার্নটি একটি চমকপ্রদ, প্রকৃত গাণিতিক সত্য।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে n = 128 যোগ করলে সিম্পসনসের এরর আনুমানিক কত হবে বলে আপনার ধারণা (n = 64-এর এরর ৬.৪৫৩ × ১০⁻⁸ থেকে শুরু করে)?

    O(h⁴) প্যাটার্ন অনুযায়ী n দ্বিগুণ করলে এরর প্রায় ১৬ গুণ কমার কথা, অর্থাৎ প্রায় ৪.০ × ১০⁻⁹।

  2. পরীক্ষা করুন: কোড সেলের তালিকায় 128 যোগ করে Run চেপে আপনার অনুমান যাচাই করুন — এবং লক্ষ্য করুন এই বিন্দুতে ফলাফল এত নির্ভুল যে ফ্লোটিং-পয়েন্ট রাউন্ড-অফ এরর দৃশ্যমান হতে শুরু করেছে কিনা।

    n = 128-এ সিম্পসনসের এরর ইতিমধ্যে double-নির্ভুলতার সীমার (প্রায় ১০⁻১৫ থেকে ১০⁻১৬) কাছাকাছি চলে আসতে পারে — এই বিন্দুতে O(h⁴) তাত্ত্বিক প্যাটার্ন আর নিখুঁতভাবে বজায় নাও থাকতে পারে, কারণ ফ্লোটিং-পয়েন্ট রাউন্ড-অফ এরর এখন ট্রাংকেশন এররের সমান মাত্রায় পৌঁছে গেছে (L21-এর একই ঘটনার আরেকটি রূপ)।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
নিউটন-কোটস ইন্টিগ্রেশন — ট্র্যাপিজয়ডাল রুল