পাঠ ২৯ · ৫৭-এর মধ্যে · মডিউল ৬
Home / Courses / Numerical Methods / হয়েনের মেথড

ইমপ্রুভড অয়লার / হয়েনের মেথড

Improved Euler / Heun's method
১১ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • হয়েনের মেথড (ইমপ্রুভড অয়লার) কীভাবে কাজ করে — প্রেডিক্টর-করেক্টর ধারণা
  • কেন দুটি ঢালের গড় নেওয়া বক্রের বক্রতা আংশিকভাবে ধরতে পারে, যা অয়লার মেথড পারে না
  • একই টেস্ট IVP-তে হয়েন বনাম অয়লারের সরাসরি, কম্পিউটেড এরর তুলনা
  • দ্বিতীয়-ক্রম কনভারজেন্স (O(h²)) এম্পিরিক্যালি যাচাই করা — h অর্ধেক করলে এরর চতুর্থাংশ

১ · সমস্যা — অয়লার শুধু শুরুর ঢাল ব্যবহার করে

L28-এ আমরা দেখেছি অয়লার মেথডের এরর O(h) কারণ এটি পুরো ধাপ জুড়ে শুধু শুরুর বিন্দুর ঢাল (f(x_n, y_n)) ব্যবহার করে, যখন প্রকৃত বক্রের ঢাল ধাপের ভেতর ক্রমাগত বদলাতে থাকে। একটি সহজ উন্নতি হলো — ধাপের দুই প্রান্তের ঢালের গড় ব্যবহার করা, যাতে বক্রতা আংশিকভাবে ধরা পড়ে। সমস্যা হলো, ধাপের শেষ বিন্দুর প্রকৃত ঢাল জানতে হলে সেই বিন্দুর y-মান আগে থেকেই জানা দরকার — যা এখনো গণনা করা হয়নি। এই সমস্যার সমাধান করে হয়েনের মেথড।

২ · হয়েনের মেথড — প্রেডিক্টর-করেক্টর

হয়েনের মেথড দুই ধাপে কাজ করে:

$$k_1 = f(x_n, y_n) \qquad \text{(শুরুর ঢাল)}$$ $$\tilde{y}_{n+1} = y_n + h\,k_1 \qquad \text{(অয়লার দিয়ে প্রাথমিক অনুমান — predictor)}$$ $$k_2 = f(x_n + h, \tilde{y}_{n+1}) \qquad \text{(অনুমিত শেষ বিন্দুর ঢাল)}$$ $$y_{n+1} = y_n + \frac{h}{2}(k_1 + k_2) \qquad \text{(দুই ঢালের গড় দিয়ে চূড়ান্ত ধাপ — corrector)}$$

প্রথমে সাধারণ অয়লার মেথড দিয়ে একটি প্রাথমিক অনুমান ỹ_{n+1} বানানো হয় (predictor), তারপর সেই আনুমানিক বিন্দুতে ঢাল গণনা করে শুরুর ঢালের সাথে গড় করে চূড়ান্ত আপডেট (corrector) করা হয়। এটি প্রতি ধাপে f-কে দুইবার মূল্যায়ন করে (অয়লারের একবারের বদলে) — সামান্য বেশি হিসাব, কিন্তু দেখা যাক তার বিনিময়ে কত বেশি নির্ভুলতা পাওয়া যায়।

Predictor
অয়লার মেথড দিয়ে ধাপের শেষ বিন্দুর একটি প্রাথমিক, মোটামুটি অনুমান তৈরি করা।
Corrector
সেই অনুমিত বিন্দুর ঢাল ব্যবহার করে শুরুর ঢালের সাথে গড় করে আরও নির্ভুল চূড়ান্ত মান বের করা।
RK পরিবার
হয়েনের মেথড আসলে দুই-স্তরীয় রুঙ্গে-কুট্টা (RK2) মেথডের একটি নির্দিষ্ট রূপ — L30-এ চার-স্তরীয় RK4 দেখা হবে।

৩ · সত্যিকারের তুলনা — একই টেস্ট IVP-তে অয়লার বনাম হয়েন

L27–L28-এর একই টেস্ট IVP (dy/dx = -y, y(0) = 1, y(x) = e⁻ˣ) ব্যবহার করে, নিচের কোড সেলে অয়লার ও হয়েন দুটি মেথডই একই h-মানগুলোতে চালিয়ে x = 2-এ চূড়ান্ত এরর সরাসরি পাশাপাশি তুলনা করা হয়েছে।

Python
import math

def f(x, y):
    return -y

def exact(x):
    return math.exp(-x)

def euler(h, x0=0.0, y0=1.0, xend=2.0):
    x, y = x0, y0
    n = round((xend - x0) / h)
    for i in range(n):
        y = y + h * f(x, y)
        x = x + h
    return y

def heun(h, x0=0.0, y0=1.0, xend=2.0):
    x, y = x0, y0
    n = round((xend - x0) / h)
    for i in range(n):
        k1 = f(x, y)
        y_pred = y + h * k1          # predictor (অয়লার ধাপ)
        k2 = f(x + h, y_pred)        # অনুমিত বিন্দুর ঢাল
        y = y + (h / 2) * (k1 + k2)  # corrector (গড় ঢাল)
        x = x + h
    return y

ex = exact(2.0)
hs = [0.4, 0.2, 0.1, 0.05, 0.025, 0.0125]
print(f"{'h':>8} | {'err_euler':>12} | {'err_heun':>12} | {'euler/heun':>10}")
for h in hs:
    ee = abs(euler(h) - ex)
    eh = abs(heun(h) - ex)
    print(f"{h:>8} | {ee:>12.6f} | {eh:>12.6f} | {ee / eh:>10.2f}")

    
প্রকৃত আউটপুট: h = 0.4-এ অয়লারের এরর ০.০৫৭৫৭৫, হয়েনের এরর মাত্র ০.০১০০৫৮ (প্রায় ৫.৭ গুণ ছোট)। h = 0.0125-এ পার্থক্য আরও নাটকীয় — অয়লারের এরর ০.০০১৬৯৫, হয়েনের এরর মাত্র ০.০০০০০৭ (প্রায় ২৩৮ গুণ ছোট!)। যত h ছোট হয়, হয়েনের সুবিধা তত বেশি প্রকট হয় — কারণ দুটি মেথডের কনভারজেন্স-অর্ডার আলাদা (অয়লার O(h), হয়েন O(h²)), তাই h ছোট হলে দ্বিতীয়-ক্রম মেথডের এরর অনেক দ্রুত হারে ছোট হতে থাকে।

৪ · দ্বিতীয়-ক্রম কনভারজেন্স যাচাই — h অর্ধেক করলে এরর চতুর্থাংশ

L28-এর মতোই, এখানে হয়েনের নিজস্ব এরর ধারাবাহিকভাবে h অর্ধেক করে পরীক্ষা করা হয়েছে, এবং পরপর দুটি এররের অনুপাত প্রিন্ট করা হয়েছে — এবার প্রত্যাশা ২ নয়, বরং ৪ (কারণ O(h²)-এ h অর্ধেক মানে এরর (1/2)² = 1/4)।

Python
print(f"{'h':>8} | {'err_heun':>14} | {'ratio prev/curr':>16}")
prev_err = None
for h in hs:
    err = abs(heun(h) - ex)
    ratio = (prev_err / err) if prev_err is not None else None
    ratio_str = f"{ratio:.3f}" if ratio is not None else "  --  "
    print(f"{h:>8} | {err:>14.8f} | {ratio_str:>16}")
    prev_err = err

    
প্রকৃত আউটপুট: h = 0.4 → 0.2-এ অনুপাত ৪.৭৬১; 0.2 → 0.1-এ ৪.৩৩৭; 0.1 → 0.05-এ ৪.১৫৯; 0.05 → 0.025-এ ৪.০৭৭; আর 0.025 → 0.0125-এ ৪.০৩৮ — ঠিক যেমন প্রত্যাশিত, অনুপাত ক্রমশ ৪-এর দিকে এগোচ্ছে (L28-এ অয়লারের অনুপাত যেমন ২-এর দিকে এগিয়েছিল)। এটাই নিশ্চিত প্রমাণ যে হয়েনের মেথড সত্যিই দ্বিতীয়-ক্রম (O(h²)) — শুধু তত্ত্ব হিসেবে নয়, বরং সরাসরি কম্পিউটেড এররের প্যাটার্ন থেকে।
মূল কথা · Key takeaway

হয়েনের মেথড দেখায় কীভাবে একটি সাধারণ ধারণা — দুই বিন্দুর ঢালের গড় নেওয়া — একটি মেথডের কনভারজেন্স-অর্ডার সম্পূর্ণ এক ধাপ (O(h) থেকে O(h²)) বাড়িয়ে দিতে পারে, মাত্র দ্বিগুণ হিসাব খরচে (প্রতি ধাপে দুইবার f মূল্যায়ন, অয়লারের একবারের বদলে)। এই "একাধিক ঢাল-মূল্যায়ন গড় করে নির্ভুলতা বাড়ানো" ধারণাটিই রুঙ্গে-কুট্টা মেথড পরিবারের মূল ভিত্তি — L30-এ আমরা দেখব চারটি ঢাল-মূল্যায়ন ব্যবহার করে RK4 কীভাবে O(h⁴) নির্ভুলতা অর্জন করে, এবং এখানে ব্যবহৃত একই টেস্ট IVP-তে অয়লার ও হয়েনের তুলনায় তার নাটকীয় উন্নতি সরাসরি দেখা যাবে।

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

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

প্র ০১ হয়েনের মেথড প্রতিটি ধাপে f-কে দুইবার মূল্যায়ন করে, অয়লারের একবারের বদলে। এই অতিরিক্ত হিসাব খরচ কি সবসময় লাভজনক?

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

প্র ০২ হয়েনের মেথডের "predictor" ধাপটি নিজেই তো অয়লার মেথড, যার এরর O(h)। তাহলে কীভাবে চূড়ান্ত হয়েন-আপডেট O(h²) নির্ভুল হতে পারে?

predictor ধাপের নিজস্ব ভুল থাকলেও, সেই ভুলটি শুধু k2 গণনার জন্য একটি সাময়িক বিন্দু বের করতে ব্যবহৃত হয় — চূড়ান্ত আপডেট সূত্র y_{n+1} = y_n + h/2·(k1+k2)-এ k1 ও k2-এর গড় নেওয়া হয়, যা টেলর সিরিজের সাথে মিলিয়ে দেখলে h² পদ পর্যন্ত সঠিক হয়ে যায় (predictor-এর নিজস্ব O(h) ভুলটি k2-এর মধ্যে ইতিমধ্যে O(h) মাত্রায় ছোট হয়ে ঢুকে যায়, এবং সামগ্রিক সূত্রে তা আরও এক ক্রম ছোট হয়ে যায়)। এই বিস্তারিত টেলর-সিরিজ প্রমাণ এই কোর্সের পরিধির বাইরে, কিন্তু ফলাফলটি — O(h²) — উপরের এম্পিরিক্যাল ডেমোতে স্পষ্টভাবে নিশ্চিত হয়েছে।

প্র ০৩ যদি একটি মেথডের অনুপাত h অর্ধেক করায় প্রায় ৮-এর কাছাকাছি হতো (৪ নয়), সেই মেথডের কনভারজেন্স-অর্ডার কত হতো বলে আপনার ধারণা?

অনুপাত 2^p হয়, যেখানে p হলো কনভারজেন্স-অর্ডার (h অর্ধেক → এরর (1/2)^p)। অনুপাত ৮ মানে 2^p = 8 = 2³, অর্থাৎ p = 3 — এটি তৃতীয়-ক্রম মেথডের স্বাক্ষর। এই একই যুক্তি দিয়ে L30-এর RK4-এ আমরা দেখব অনুপাত প্রায় 16 = 2⁴ -এর কাছাকাছি হয়, যা চতুর্থ-ক্রম নিশ্চিত করে।

অনুশীলন

  1. চিন্তা করুন: উপরের প্রথম কোড সেলে h = 0.2-এ অয়লারের এরর 0.027961 ও হয়েনের এরর 0.002113। এই দুইয়ের অনুপাত (euler/heun) মোটামুটি কত হবে বলে আপনার আন্দাজ, রান করার আগে?

    0.027961 / 0.002113 ≈ 13.2 — অর্থাৎ একই h-এ হয়েন প্রায় ১৩ গুণ বেশি নির্ভুল। কোড সেল রান করলে ঠিক এই সংখ্যাটিই (১৩.২৩) দেখা যাবে।

  2. পরীক্ষা করুন: দ্বিতীয় কোড সেলের hs তালিকায় 0.00625 যোগ করে Run চেপে দেখুন অনুপাত ৪-এর আরও কাছাকাছি যায় কিনা।

    h = 0.00625-এ অনুপাত (0.0125-এর এররের তুলনায়) দাঁড়ায় প্রায় ৪.০১৯ — আগের ধাপের ৪.০৩৮-এর চেয়েও ৪-এর আরও কাছাকাছি। এটি L28-এর অয়লার-ডেমোর সাথে সঙ্গতিপূর্ণ প্যাটার্ন: h → 0 হলে অনুপাত তার তাত্ত্বিক সীমার (এখানে ৪) দিকে ক্রমশ এগিয়ে যায়।

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

আগের পাঠ
অয়লার মেথডের এরর অ্যানালাইসিস