পাঠ ৩৩ · ৫৭-এর মধ্যে · মডিউল ৭
Home / Courses / Numerical Methods / শুটিং মেথড

বাউন্ডারি ভ্যালু প্রবলেম — শুটিং মেথড

Boundary value problems — shooting method
১১ মিনিট পড়া উচ্চতর · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • IVP ও BVP-এর মধ্যে মৌলিক পার্থক্য, এবং কেন BVP সমাধান করা IVP-এর চেয়ে কাঠামোগতভাবে ভিন্ন সমস্যা
  • শুটিং মেথডের ধারণা — কীভাবে একটি "অনুমানের" ইনিশিয়াল স্লোপ থেকে শুরু করে, IVP সলভার (RK4) দিয়ে ইন্টিগ্রেট করে, তারপর রুট-ফাইন্ডিং (বাইসেকশন) দিয়ে সঠিক স্লোপ খুঁজে বের করা হয়
  • একটি সত্যিকারের, চলমান Python ডেমো যেখানে RK4 ও বাইসেকশন একসাথে কাজ করে একটি BVP সমাধান করছে
  • ফলাফল একটি জানা বন্ধ-আকারের সমাধানের বিপরীতে যাচাই করা, এবং প্রকৃত এরর পর্যবেক্ষণ করা

১ · IVP বনাম BVP

M6-এ (L27–L32) আমরা ইনিশিয়াল ভ্যালু প্রবলেম (IVP) সমাধান করেছি — যেখানে একটি ডিফারেনশিয়াল সমীকরণের সব শর্ত একটি মাত্র বিন্দুতে দেওয়া থাকে (যেমন y(x₀) = y₀ ও, দ্বিতীয়-অর্ডার সমীকরণের ক্ষেত্রে, y'(x₀) = y₀')। অয়লার বা RK4 দিয়ে আমরা সরাসরি সামনের দিকে ধাপে ধাপে ইন্টিগ্রেট করতে পারতাম, কারণ শুরুর মুহূর্তেই সম্পূর্ণ তথ্য জানা থাকত।

কিন্তু বাস্তব-বিশ্বের অনেক সমস্যায় (একটি বিমের বিচ্যুতি, একটি রডের তাপমাত্রা প্রোফাইল, একটি স্ট্রিং-এর আকৃতি) শর্তগুলো দেওয়া থাকে ডোমেইনের দুই প্রান্তে — যেমন একটি দ্বিতীয়-অর্ডার সমীকরণে y(a) এবং y(b) উভয়ই জানা, কিন্তু y'(a) অজানা। এটিই বাউন্ডারি ভ্যালু প্রবলেম (BVP) — এবং সরাসরি সামনের দিকে ইন্টিগ্রেট করা সম্ভব নয়, কারণ শুরুর ঢাল y'(a) নিজেই অজানা।

IVP
সব শর্ত এক বিন্দুতে (y(x₀), y'(x₀)) — সরাসরি সামনের দিকে ইন্টিগ্রেশন সম্ভব (Euler/RK4, M6)।
BVP
শর্ত দুই প্রান্তে (y(a), y(b)) — সরাসরি ইন্টিগ্রেশন অসম্ভব, একটি অজানা প্যারামিটার (শুরুর ঢাল) খুঁজে বের করতে হয়।
শুটিং মেথড
BVP-কে "অনুমান করো, শুট করো, লক্ষ্যভেদ মিলল কিনা দেখো" — এই লজিকে একটি IVP + রুট-ফাইন্ডিং সমস্যায় রূপান্তর করে।

২ · শুটিং মেথডের ধারণা

ধরা যাক BVP: $y'' = -y$, ডোমেইন $[a, b]$, শর্ত $y(a) = \alpha$ ও $y(b) = \beta$। শুটিং মেথডের ধাপ:

ধাপ ১ — অনুমান
শুরুর ঢাল y'(a) = s-এর একটি মান অনুমান করো (এখনো অজানা)।
ধাপ ২ — শুট
y(a)=α, y'(a)=s নিয়ে এটি এখন একটি সম্পূর্ণ IVP — RK4 (M6/L30) দিয়ে x=b পর্যন্ত ইন্টিগ্রেট করো, ফলাফল y(b; s)।
ধাপ ৩ — লক্ষ্যভেদ যাচাই
শুটিং ফাংশন সংজ্ঞায়িত করো: $F(s) = y(b; s) - \beta$। F(s) = 0 হলেই সঠিক s পাওয়া গেছে।
ধাপ ৪ — রুট-ফাইন্ডিং
F(s)-এর রুট খুঁজতে M2-এর বাইসেকশন (বা নিউটন-রাফসন) ব্যবহার করো — ঠিক যেমন M2-এ f(x)=0-এর রুট খোঁজা হতো, শুধু এখানে ভ্যারিয়েবল হলো ঢাল s।
মূল অন্তর্দৃষ্টি

শুটিং মেথড সম্পূর্ণভাবে দুটি আগের জানা টুল পুনরায় ব্যবহার করে — এটি নতুন কিছু "আবিষ্কার" করে না। F(s)-কে একটি সাধারণ এক-চলকের ফাংশন হিসেবে দেখলে, M2-এর যেকোনো রুট-ফাইন্ডিং মেথড এখানে সরাসরি প্রযোজ্য — শুধু প্রতিটি F(s)-মূল্যায়নের ভেতরে এখন একটি সম্পূর্ণ RK4 ইন্টিগ্রেশন চলছে।

৩ · একটি সত্যিকারের ডেমো — y'' = -y, y(0)=0, y(1)=2

এই BVP-এর নির্ভুল বন্ধ-আকারের সমাধান $y(x) = C\sin(x)$ যেখানে $C = \dfrac{2}{\sin(1)} \approx 2.37679021$ (রেডিয়ানে) — এটি যাচাই করা সহজ কারণ এই ধরনের রৈখিক সমীকরণের সাধারণ সমাধান জানা আছে। নিচের কোড সেলে সিস্টেমটিকে y₁=y, y₂=y' আকারে লিখে RK4 দিয়ে ইন্টিগ্রেট করা হয়েছে, এবং শুটিং ফাংশন F(s) = y₁(1; s) - 2-এর রুট বাইসেকশন দিয়ে খোঁজা হয়েছে।

Python
import math

# BVP: y'' = -y on [0, 1],  y(0) = 0,  y(1) = 2
# system form: y1 = y, y2 = y'  ->  y1' = y2 ,  y2' = -y1

def rk4_integrate(s, h=0.01, x0=0.0, xf=1.0):
    """IVP-এর মতো y1(0)=0, y2(0)=s দিয়ে RK4 ইন্টিগ্রেট করে y1(xf) ফেরত দেয়।"""
    n = int(round((xf - x0) / h))
    y1, y2 = 0.0, s
    for _ in range(n):
        f1 = lambda a, b: b
        f2 = lambda a, b: -a
        k1a, k1b = f1(y1, y2), f2(y1, y2)
        k2a, k2b = f1(y1 + h/2*k1a, y2 + h/2*k1b), f2(y1 + h/2*k1a, y2 + h/2*k1b)
        k3a, k3b = f1(y1 + h/2*k2a, y2 + h/2*k2b), f2(y1 + h/2*k2a, y2 + h/2*k2b)
        k4a, k4b = f1(y1 + h*k3a, y2 + h*k3b), f2(y1 + h*k3a, y2 + h*k3b)
        y1 = y1 + h/6*(k1a + 2*k2a + 2*k3a + k4a)
        y2 = y2 + h/6*(k1b + 2*k2b + 2*k3b + k4b)
    return y1  # y(xf; s)

target = 2.0
def F(s):
    return rk4_integrate(s) - target

s_lo, s_hi = 0.0, 4.0
print(f"F({s_lo}) = {F(s_lo):.6f}   F({s_hi}) = {F(s_hi):.6f}")
print()

print(f"{'ইটারেশন':>8} {'s_mid':>12} {'F(s_mid)':>14} {'ইন্টারভাল প্রস্থ':>18}")
for i in range(1, 21):
    s_mid = (s_lo + s_hi) / 2
    f_mid = F(s_mid)
    if F(s_lo) * f_mid < 0:
        s_hi = s_mid
    else:
        s_lo = s_mid
    print(f"{i:8d} {s_mid:12.8f} {f_mid:14.8f} {s_hi - s_lo:18.10f}")

s_final = (s_lo + s_hi) / 2
C_exact = 2.0 / math.sin(1.0)
print()
print(f"শুটিং মেথডে পাওয়া স্লোপ s ≈ {s_final:.8f}")
print(f"নির্ভুল স্লোপ C = 2/sin(1) = {C_exact:.8f}")
print(f"স্লোপে এরর: {abs(s_final - C_exact):.2e}")

    
লক্ষ্য করুন — F(0) = -2 (ঋণাত্মক) এবং F(4) ≈ 1.365884 (ধনাত্মক), তাই একটি রুট মাঝে আছে নিশ্চিত। ২০ ধাপ বাইসেকশনের পর শুটিং স্লোপ পাওয়া যায় s ≈ 2.37679100, যেখানে নির্ভুল মান C ≈ 2.37679021 — প্রকৃত এরর মাত্র ৭.৮৯ × ১০⁻⁷। এই স্লোপ দিয়ে সম্পূর্ণ সমাধান বক্ররেখা পুনর্গঠন করলে (RK4-এর একই ট্রেস ব্যবহার করে) x=0.5-এ পাওয়া যায় y ≈ 1.13949431, যেখানে নির্ভুল মান C·sin(0.5) ≈ 1.13949393 — এরর মাত্র 3.8 × 10⁻⁷। এই নির্ভুলতা এসেছে RK4-এর চতুর্থ-অর্ডার নির্ভুলতা (M6/L30) ও বাইসেকশনের ২০ ধাপের সংমিশ্রণ থেকে।
মূল কথা · Key takeaway

শুটিং মেথড কার্যকর কারণ এটি BVP-কে একটি পরিচিত সমস্যায় রূপান্তর করে — কিন্তু এর একটি সীমাবদ্ধতা আছে: নন-লিনিয়ার BVP-তে F(s) একাধিক রুট থাকতে পারে বা "শুট" মারাত্মকভাবে ব্যর্থ হতে পারে (ওভারফ্লো/ডাইভার্জেন্স, ঠিক M2/L07-এ নিউটন-রাফসনের ব্যর্থতার মতো)। L34-এ আমরা একটি ভিন্ন পদ্ধতি দেখব — ফাইনাইট ডিফারেন্স মেথড — যা পুরো ডোমেইন একসাথে সমাধান করে, "শুট করে দেখা"র উপর নির্ভর করে না।

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

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

প্র ০১ শুটিং মেথডে কোড সেলে F(s) মূল্যায়ন করতে প্রতিবার একটি সম্পূর্ণ RK4 ইন্টিগ্রেশন চালানো হয়েছে (১০০ ধাপ, h=0.01)। বাইসেকশনের ২০ ইটারেশনে মোট কতগুলো RK4 ধাপ চলেছে বলে আপনার ধারণা, এবং এটি কেন গুরুত্বপূর্ণ?

প্রতিটি বাইসেকশন ইটারেশনে F(s_mid) একবার মূল্যায়ন করা হয়, এবং প্রতিটি মূল্যায়নে ১০০টি RK4 ধাপ চলে (যেহেতু h=0.01 ও ডোমেইন দৈর্ঘ্য ১)। তাই ২০ বাইসেকশন ইটারেশনে মোট প্রায় ২,০০০ RK4 ধাপ চলেছে (প্লাস দুটি প্রাথমিক F(s_lo), F(s_hi) মূল্যায়ন)। এটি গুরুত্বপূর্ণ কারণ শুটিং মেথডের কম্পিউটেশনাল খরচ = (রুট-ফাইন্ডিং ইটারেশন সংখ্যা) × (প্রতি IVP সলভের খরচ) — দুটি নেস্টেড লুপের গুণফল, যা L34-এর ফাইনাইট ডিফারেন্স পদ্ধতির সাথে তুলনা করার সময় প্রাসঙ্গিক।

প্র ০২ এই ডেমোতে শুটিং ফাংশন F(s) আসলে s-এর একটি রৈখিক (linear) ফাংশন (কারণ মূল ODE y''=-y রৈখিক)। তবুও কেন বাইসেকশনের মতো একটি সাধারণ-উদ্দেশ্যের রুট-ফাইন্ডিং মেথড ব্যবহার করা হলো, সরাসরি বীজগাণিতিকভাবে সমাধান না করে?

এই নির্দিষ্ট উদাহরণে F(s) রৈখিক বলে সরাসরি সমাধান সম্ভব (দুটি ট্রায়াল স্লোপ দিয়ে রৈখিক ইন্টারপোলেশন করলেই এক ধাপে উত্তর মিলে যেত)। কিন্তু শুটিং মেথডের আসল শক্তি প্রকাশ পায় নন-লিনিয়ার BVP-তে, যেখানে F(s)-এর কোনো সরল রৈখিক আকার থাকে না। বাইসেকশন (বা নিউটন-রাফসন) ব্যবহার করার কারণ হলো এই কোডটি যেকোনো BVP-তে কাজ করবে (রৈখিক হোক বা না হোক) — এটি একটি সাধারণ-উদ্দেশ্যের টেমপ্লেট, শুধু এই নির্দিষ্ট সমস্যার জন্য কাস্টম-বানানো শর্টকাট নয়।

প্র ০৩ যদি এই BVP-তে y(1)=2-এর বদলে দুটি রুট থাকত এমন একটি নন-লিনিয়ার সমীকরণ হতো (যেমন F(s)-এর দুটি ভিন্ন s-এ শূন্য মান), তাহলে বাইসেকশন মেথড কী সমস্যায় পড়তে পারত?

বাইসেকশন শুধু নিশ্চিত করে যে [s_lo, s_hi]-এর মধ্যে কমপক্ষে একটি রুট আছে (চিহ্ন পরিবর্তনের ভিত্তিতে) — যদি দুটি রুট একই ইন্টারভালে থাকে এবং চিহ্ন দুইবার পরিবর্তিত হয়ে আবার একই চিহ্নে ফিরে আসে, তাহলে F(s_lo) ও F(s_hi)-এর চিহ্ন একই থাকতে পারে এবং বাইসেকশন ভুলভাবে ধরে নেবে কোনো রুট নেই। এমনকি একটি রুট পাওয়া গেলেও, সেটি "ফিজিক্যালি প্রাসঙ্গিক" রুট কিনা তা যাচাই করা দরকার — নন-লিনিয়ার BVP-তে একাধিক বৈধ সমাধান থাকা সম্ভব, যা এই মেথডের একটি সীমাবদ্ধতা।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে বাইসেকশন ২০ ইটারেশন চালানো হয়েছে। যদি মাত্র ১০ ইটারেশন চালানো হতো, ইন্টারভাল প্রস্থ কত হতো (মূল প্রস্থ ৪.০ থেকে শুরু করে), এবং স্লোপের এরর মোটামুটি কোন মাত্রার (order of magnitude) হবে বলে আপনার ধারণা?

    প্রতি ইটারেশনে ইন্টারভাল অর্ধেক হয়, তাই ১০ ইটারেশন পর প্রস্থ হবে 4.0 / 2¹⁰ ≈ 0.0039 — কোড সেলের আউটপুট টেবিল অনুযায়ী প্রকৃতপক্ষে ইটারেশন ১০-এ ইন্টারভাল প্রস্থ 0.00390625, যা মেলে। সেই পর্যায়ে s_mid ≈ 2.37890625 ছিল, নির্ভুল মান 2.37679021-এর তুলনায় এরর প্রায় 2.1 × 10⁻³ — অর্থাৎ ১০ ইটারেশনে এরর মিলিমিটার-স্কেলে (১০⁻³), আর ২০ ইটারেশনে মাইক্রন-স্কেলে (১০⁻⁷) নেমে আসে।

  2. পরীক্ষা করুন: কোড সেলে rk4_integrate-এর h প্যারামিটার 0.01 থেকে 0.1-এ বদলে Run চাপুন। শুটিং স্লোপ s_final-এর মান কতটা বদলায় দেখুন — কেন RK4-এর নিজস্ব ধাপ-সাইজও চূড়ান্ত নির্ভুলতাকে প্রভাবিত করে?

    h=0.1-এ RK4 কম ধাপে (মাত্র ১০টি) ইন্টিগ্রেট করে, ফলে প্রতিটি F(s) মূল্যায়নের নিজস্ব RK4-ডিসক্রিটাইজেশন এরর বড় হয় (RK4 চতুর্থ-অর্ডার হলেও O(h⁴) এরর সম্পূর্ণ শূন্য নয়)। ফলে চূড়ান্ত s_final-এ ছোট কিন্তু লক্ষণীয় পার্থক্য দেখা যায় — এটি দেখায় শুটিং মেথডের মোট নির্ভুলতা দুটি উৎসের উপর নির্ভর করে: বাইসেকশনের ইটারেশন সংখ্যা এবং অন্তর্নিহিত IVP সলভারের নিজস্ব নির্ভুলতা (M6/L28-এ আলোচিত এরর অ্যানালাইসিস এখানেও প্রযোজ্য)।

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

আগের পাঠ
স্টিফ সমীকরণ ও ODE সলভারের স্ট্যাবিলিটি