রুঙ্গে-কুট্টা মেথড (RK4)
এই পাঠে যা শিখবেন
- RK4-এর চার-ঢাল ভারযুক্ত-গড় আপডেট সূত্র এবং প্রতিটি ঢাল কী প্রতিনিধিত্ব করে
- একটি সত্যিকারের Python লুপ দিয়ে RK4 বাস্তবায়ন করা
- একই
h-এ অয়লার, হয়েন ও RK4-এর মধ্যে সরাসরি, কম্পিউটেড অ্যাকুরেসি তুলনা - চতুর্থ-ক্রম কনভারজেন্স (
O(h⁴)) এম্পিরিক্যালি যাচাই করা
১ · RK4-এর ধারণা — চারটি ঢালের ভারযুক্ত গড়
L29-এ হয়েনের মেথড দেখিয়েছে দুটি ঢাল গড় করলে কনভারজেন্স-অর্ডার এক ধাপ বাড়ে। ক্লাসিক্যাল RK4 এই ধারণা আরও এগিয়ে নিয়ে যায় — একটি ধাপের মধ্যে চারটি ভিন্ন বিন্দুতে ঢাল গণনা করে (শুরুতে, দুইবার মাঝামাঝি বিন্দুতে ভিন্ন আনুমানিক মান দিয়ে, এবং শেষে), তারপর একটি নির্দিষ্ট, তত্ত্বীয়ভাবে অপ্টিমাইজড ভারযুক্ত গড় নেয়:
$$k_1 = f(x_n, y_n)$$ $$k_2 = f\left(x_n + \tfrac{h}{2},\ y_n + \tfrac{h}{2}k_1\right)$$ $$k_3 = f\left(x_n + \tfrac{h}{2},\ y_n + \tfrac{h}{2}k_2\right)$$ $$k_4 = f(x_n + h,\ y_n + h\,k_3)$$ $$y_{n+1} = y_n + \frac{h}{6}\left(k_1 + 2k_2 + 2k_3 + k_4\right)$$
k1 ধাপের শুরুর ঢাল; k2 ও k3 মাঝামাঝি বিন্দুর দুটি ভিন্ন আনুমানিক
ঢাল (একবার k1 দিয়ে মাঝামাঝি পৌঁছে, একবার k2 দিয়ে); k4 ধাপের
শেষ বিন্দুর আনুমানিক ঢাল। মাঝামাঝি বিন্দুর দুটি অনুমানকে দ্বিগুণ ভার দেওয়া হয় (2k2 + 2k3)
কারণ সিম্পসনস রুলের (L24) মতোই, মাঝামাঝি বিন্দুর তথ্য প্রান্তের তথ্যের চেয়ে বেশি গুরুত্বপূর্ণ প্রমাণিত
হয় — বাস্তবে এটি ঠিক সিম্পসনস রুলের সাথে গাণিতিকভাবে ঘনিষ্ঠভাবে সম্পর্কিত।
ধাপের শুরু বিন্দুতে সরাসরি গণনা করা ঢাল, ঠিক অয়লার মেথডের মতো।
ধাপের মাঝামাঝি বিন্দুতে দুটি ভিন্ন উপায়ে আনুমানিক ঢাল — এই দুটি সবচেয়ে বেশি ভার (২×) পায়।
ধাপের শেষ বিন্দুতে আনুমানিক ঢাল,
k3 দিয়ে পৌঁছানো বিন্দু থেকে গণনা করা।২ · সত্যিকারের তিন-মেথড তুলনা — অয়লার, হয়েন, RK4
L27–L29-এর একই টেস্ট IVP (dy/dx = -y, y(0) = 1, y(x) = e⁻ˣ) ব্যবহার করে, নিচের কোড সেলে
তিনটি মেথডই একই h-মানে চালিয়ে x = 2-এ চূড়ান্ত এরর একটি টেবিলে পাশাপাশি
দেখানো হয়েছে।
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
k2 = f(x + h, y_pred)
y = y + (h / 2) * (k1 + k2)
x = x + h
return y
def rk4(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)
k2 = f(x + h / 2, y + h / 2 * k1)
k3 = f(x + h / 2, y + h / 2 * k2)
k4 = f(x + h, y + h * k3)
y = y + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)
x = x + h
return y
ex = exact(2.0)
print(f"{'h':>6} | {'err_euler':>12} | {'err_heun':>12} | {'err_rk4':>14}")
for h in [0.4, 0.2, 0.1, 0.05]:
ee = abs(euler(h) - ex)
eh = abs(heun(h) - ex)
er = abs(rk4(h) - ex)
print(f"{h:>6} | {ee:>12.8f} | {eh:>12.8f} | {er:>14.10f}")
h = 0.1 সারি): অয়লারের এরর ০.০১৩৭৫৮৬৩, হয়েনের এরর
০.০০০৪৮৭১৭, আর RK4-এর এরর মাত্র ০.০০০০০০২৪৫২ — অর্থাৎ RK4 অয়লারের চেয়ে
প্রায় ৫৬,১০৯ গুণ এবং হয়েনের চেয়ে প্রায় ১,৯৮৭ গুণ বেশি নির্ভুল, ঠিক
একই h ও প্রায় কাছাকাছি হিসাব-খরচে (প্রতি ধাপে RK4 চারটি f-মূল্যায়ন করে, হয়েন
দুটি করে)। h = 0.4-এর মতো বড় step size-এও RK4-এর এরর (০.০০০০৮০৭) হয়েনের
h = 0.05-এর এররের (০.০০০১১৭) চেয়েও ছোট — RK4 অনেক কম ধাপ ব্যবহার করেও
বেশি নির্ভুল।
৩ · চতুর্থ-ক্রম কনভারজেন্স যাচাই — h অর্ধেক করলে এরর ১৬ ভাগের এক ভাগ
L28–L29-এর মতোই, RK4-এর নিজস্ব এরর ধারাবাহিকভাবে h অর্ধেক করে পরীক্ষা করা হয়েছে। এবার
প্রত্যাশিত অনুপাত 2⁴ = 16।
hs = [0.4, 0.2, 0.1, 0.05, 0.025, 0.0125]
print(f"{'h':>8} | {'err_rk4':>16} | {'ratio prev/curr':>16}")
prev_err = None
for h in hs:
err = abs(rk4(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:>16.10f} | {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-এ অয়লারের ২ ও L29-এ হয়েনের ৪-এর মতোই একই প্যাটার্ন, শুধু
এবার অনেক উঁচু ক্রমে)। এই সুস্পষ্ট এম্পিরিক্যাল প্যাটার্নই নিশ্চিত করে RK4 সত্যিই O(h⁴)
চতুর্থ-ক্রম নির্ভুল — ব্যবহারিক অর্থে, RK4-তে h-কে সামান্য ছোট করাই যথেষ্ট নির্ভুলতার
বিশাল উন্নতি এনে দেয়, যা এটিকে বাস্তব ইঞ্জিনিয়ারিং ও বৈজ্ঞানিক সিমুলেশনে সবচেয়ে জনপ্রিয় ডিফল্ট ODE
সলভার করে তুলেছে।
অয়লার (L27, O(h)) → হয়েন (L29, O(h²)) → RK4 (O(h⁴)) — প্রতিটি ধাপে আমরা প্রতি-ধাপে বেশি
f-মূল্যায়ন খরচ করে বিনিময়ে অনেক দ্রুত কনভারজেন্স পেয়েছি। বাস্তব ব্যবহারিক কাজে RK4
(বা এর অভিযোজিত-step-size ভার্সন) প্রায়শই ডিফল্ট পছন্দ, কারণ এটি সাধারণ, নির্ভরযোগ্য ও যথেষ্ট নির্ভুল —
যদিও L31-এ আমরা দেখব মাল্টিস্টেপ মেথড কীভাবে প্রতিটি ধাপে কম f-মূল্যায়ন দিয়ে (আগের ধাপের
তথ্য পুনরায় ব্যবহার করে) অনুরূপ নির্ভুলতা পাওয়ার চেষ্টা করে, এবং L32-এ দেখব RK4-ও কিছু "স্টিফ"
সমীকরণে অস্থির হয়ে যেতে পারে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
RK4-এর সূত্রে k2 ও k3-কে 2× ভার দেওয়া হয়, কিন্তু
k1 ও k4-কে 1× ভার দেওয়া হয় (মোট ভার 1+2+2+1=6,
তাই h/6 দিয়ে ভাগ)। এই অসম ভারের পেছনে কী স্বজ্ঞাত কারণ থাকতে পারে?
মাঝামাঝি বিন্দুর (k2, k3) ঢাল সাধারণত পুরো ধাপের গড় আচরণের বেশি
প্রতিনিধিত্বমূলক — যেমন সিম্পসনস রুলে (L24) মাঝামাঝি বিন্দুকে বেশি ভার দেওয়া হয়েছিল কারণ এটি একটি
প্যারাবোলিক আনুমানিকতার কেন্দ্র। RK4-এর ভারগুলো তত্ত্বীয়ভাবে টেলর সিরিজের সাথে মিলিয়ে নির্ধারণ করা,
যাতে যতটা সম্ভব উচ্চতর-ক্রম পদ পর্যন্ত সঠিক আনুমানিকতা পাওয়া যায় — এটি একটি সুনির্দিষ্ট গাণিতিক
অপ্টিমাইজেশনের ফল, নিছক অনুমান নয়।
প্র ০২
একই h-এ RK4 হয়েনের চেয়ে প্রায় দ্বিগুণ বেশি f-মূল্যায়ন করে (৪ বনাম ২)
কিন্তু এরর প্রায় হাজার গুণ কম দেয়। এই "খরচ বনাম লাভ" ট্রেড-অফ কীভাবে বোঝাবেন?
কনভারজেন্স-অর্ডার এক্সপোনেনশিয়ালভাবে প্রভাব ফেলে, কিন্তু হিসাব-খরচ শুধু রৈখিকভাবে বাড়ে। হয়েন
(O(h²)) থেকে RK4 (O(h⁴)) এ যেতে হিসাব-খরচ মাত্র দ্বিগুণ হয়, কিন্তু কনভারজেন্স-অর্ডার দ্বিগুণ (২ থেকে
৪) হওয়ায় ছোট h-এ এরর-হ্রাস দ্রুততর হারে ঘটে (কারণ h⁴ << h² যখন
h < 1)। এই কারণেই বেশিরভাগ ব্যবহারিক পরিস্থিতিতে RK4-এর অতিরিক্ত হিসাব-খরচ সহজেই
লাভজনক প্রমাণিত হয়।
প্র ০৩
উপরের টেবিলে দেখা গেছে h = 0.4-এ RK4-এর এরর হয়েনের h = 0.05-এর
এররের চেয়েও ছোট, অথচ RK4 এখানে অনেক কম ধাপ ব্যবহার করেছে। এর ব্যবহারিক তাৎপর্য কী?
এটি দেখায় একটি উচ্চতর-ক্রম মেথড একটি নিম্ন-ক্রম মেথডকে শুধু "সমান কম্পিউটেশনাল বাজেটে বেশি নির্ভুল" করেই হারায় না — এটি অনেক কম মোট ধাপেও বেশি নির্ভুল হতে পারে। ব্যবহারিক অর্থে, একটি লম্বা সিমুলেশনে (যেমন একটি মহাকাশযানের কক্ষপথ বহু বছর ধরে ট্র্যাক করা) RK4 ব্যবহার করলে অয়লার বা হয়েনের তুলনায় অনেক কম ধাপে (কম মোট রানটাইমে) কাঙ্ক্ষিত নির্ভুলতা পাওয়া সম্ভব হয়।
অনুশীলন
-
চিন্তা করুন: যদি RK4-এর অনুপাত ঠিক তাত্ত্বিক মান
16-এ পৌঁছে যেত, তাহলেh = 0.0125-এর এরর (~0.0000000001) থেকেh = 0.00625-এ গেলে এরর মোটামুটি কত হতো বলে আপনার ধারণা?তাত্ত্বিকভাবে প্রায়
0.0000000001 / 16 ≈ 6.25 × 10⁻¹²— যদিও এই মাত্রায় ফ্লোটিং-পয়েন্ট রাউন্ড-অফ এরর (L02, মেশিন এপসিলন প্রায়2.2 × 10⁻¹⁶) নিজেই লক্ষণীয় হতে শুরু করতে পারে, তাই বাস্তবে অনুপাতটি তাত্ত্বিক ১৬ থেকে সামান্য সরে যেতে পারে। -
পরীক্ষা করুন: দ্বিতীয় কোড সেলের
hsতালিকায়0.00625যোগ করে Run চেপে দেখুন প্রকৃত অনুপাত ও এরর কত হয়, এবং তা ফ্লোটিং-পয়েন্ট নির্ভুলতার সীমার কতটা কাছাকাছি।রান করলে দেখা যায় এরর ইতিমধ্যে
10⁻¹¹–10⁻¹²মাত্রার কাছাকাছি নেমে গেছে — অনুপাত এখনো ১৬-এর কাছাকাছি থাকে, তবে প্রতিটি নতুন সংখ্যাসূচক অঙ্কের অর্থ ক্রমশ কম হয়ে যায় কারণ ডাবল-প্রিসিশন ফ্লোটের নিজস্ব নির্ভুলতার সীমা (প্রায় ১৫-১৭ সিগনিফিক্যান্ট অঙ্ক, L02) কাছাকাছি চলে আসছে। এটি একটি গুরুত্বপূর্ণ ব্যবহারিক সীমা — অত্যন্ত ছোটh-এ শুধু অ্যালগরিদমের ট্রাংকেশন এরর নয়, ফ্লোটিং-পয়েন্ট রাউন্ড-অফ এররও গুরুত্বপূর্ণ হয়ে ওঠে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — মাল্টিস্টেপ মেথড L31 আগের ধাপের তথ্য পুনরায় ব্যবহার করে কম হিসাব-খরচে ভালো নির্ভুলতা পাওয়ার কৌশল — অ্যাডামস-ব্যাশফোর্থ মেথড।
- সম্পর্কিত পাঠ পুনরালোচনা — সিম্পসনস রুল L24 মাঝামাঝি বিন্দুকে বেশি ভার দেওয়ার একই মূল ধারণা, RK4-এর সাথে গাণিতিকভাবে ঘনিষ্ঠভাবে সম্পর্কিত।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ এরর অ্যানালাইসিস, রুট-ফাইন্ডিং, লিনিয়ার সিস্টেম, ইন্টারপোলেশন, নিউমেরিক্যাল ইন্টিগ্রেশন, ODE সলভিং, আইগেনভ্যালু মেথড, অপ্টিমাইজেশন ও ক্যাপস্টোন।