IVP ও অয়লার মেথড
এই পাঠে যা শিখবেন
- Initial Value Problem-এর সংজ্ঞা এবং কেন এটি "একটি সংখ্যা খোঁজা" থেকে ভিন্ন সমস্যা
- অয়লার মেথড কীভাবে ডেরিভেটিভের রৈখিক (ট্যানজেন্ট-লাইন) আনুমানিকতা থেকে বের হয়
- একটি সত্যিকারের, হাতে-লেখা Python লুপ দিয়ে অয়লার মেথড বাস্তবায়ন করা
- বিভিন্ন step size
h-এ প্রকৃত কম্পিউটেড এরর পর্যবেক্ষণ করা, একটি জানা ক্লোজড-ফর্ম সমাধানের বিপরীতে
১ · Initial Value Problem (IVP) কী
M5 পর্যন্ত আমরা যেসব সমস্যা দেখেছি — রুট খোঁজা, লিনিয়ার সিস্টেম সমাধান, ইন্টিগ্রাল গণনা — সবগুলোতে
লক্ষ্য ছিল একটি নির্দিষ্ট সংখ্যা বা কয়েকটি সংখ্যা বের করা। এখন থেকে আমরা এমন সমস্যা
সমাধান করব যেখানে লক্ষ্য একটি সম্পূর্ণ ফাংশন — একটি
ডিফারেনশিয়াল সমীকরণডিফারেনশিয়াল সমীকরণএমন একটি সমীকরণ যেখানে একটি ফাংশন তার নিজের ডেরিভেটিভের (পরিবর্তনের হার) সাথে সম্পর্কযুক্ত — যেমন dy/dx = f(x, y)। "ডেরিভেটিভ" ও এর অর্থ সম্পর্কে বিস্তারিত ../math-for-ai/-এ আছে।
(differential equation) সমাধান করে। একটি Initial Value Problem হলো একটি ডিফারেনশিয়াল
সমীকরণ, যার সাথে একটি নির্দিষ্ট শুরুর বিন্দু দেওয়া আছে:
অর্থাৎ: আমরা জানি y কোথা থেকে শুরু করে (y₀, বিন্দু x₀-তে), এবং
প্রতিটি বিন্দুতে y কত দ্রুত ও কোন দিকে বদলাচ্ছে তা f(x, y) দিয়ে জানা আছে —
কিন্তু y(x)-এর প্রকৃত সূত্রটি অজানা, এবং সেটাই খুঁজে বের করতে হবে (বা অন্তত, নির্দিষ্ট
বিন্দুতে এর মান আনুমানিক করতে হবে)। বাস্তব-বিশ্বে এই ধরনের সমস্যা সর্বত্র — জনসংখ্যা বৃদ্ধি, তেজস্ক্রিয়
ক্ষয়, স্প্রিং-এর দোলন, তাপ ছড়ানো, রোগের সংক্রমণ মডেল — এদের প্রায় সবগুলোই "কোনো কিছুর পরিবর্তনের হার
অন্য কিছুর উপর নির্ভরশীল" আকারে লেখা হয়, এবং বেশিরভাগেরই কোনো সহজ বীজগাণিতিক ক্লোজড-ফর্ম সমাধান নেই।
y(x₀) = y₀ — এটাই "IVP"-এর "I" (Initial)। এই একটি শর্ত ছাড়া অসীম সংখ্যক সমাধান-বক্র থাকতে পারে; শুরুর শর্তটি একটিমাত্র নির্দিষ্ট বক্র বেছে নেয়।f(x, y)প্রতিটি বিন্দু
(x, y)-তে সমাধান-বক্রটি কোন দিকে ও কত দ্রুত বদলাচ্ছে তা বলে দেয় — এটি একটি "দিক-নির্দেশক মাঠ" (direction field) তৈরি করে যার মধ্য দিয়ে সমাধান বক্রটি চলে।এই মডিউলের প্রতিটি মেথড (অয়লার, হয়েন, RK4) একই কৌশল ব্যবহার করে —
x₀ থেকে শুরু করে ছোট ছোট ধাপ h-এ এগিয়ে গিয়ে y-এর মান আনুমানিক করা।২ · অয়লার মেথড — সবচেয়ে সরল সলভার
অয়লার মেথডের ধারণা সহজ: যদি আমরা জানি বর্তমান বিন্দু (x_n, y_n)-তে বক্রের ঢাল (স্লোপ) ঠিক
কত (f(x_n, y_n)), তাহলে একটি ছোট দূরত্ব h এগোলে বক্রটি প্রায় সেই ট্যানজেন্ট
রেখা বরাবরই থাকবে — যতক্ষণ h যথেষ্ট ছোট। এটাই একটি সাধারণ রৈখিক আনুমানিকতা
(linear/tangent-line approximation), যেমনটা আমরা M5-এ ডেরিভেটিভের সংজ্ঞা থেকে দেখেছি। এখান থেকে সরাসরি
আপডেট সূত্র বের হয়:
প্রতিটি ধাপে: বর্তমান স্লোপ গণনা করো, সেই স্লোপ দিয়ে h দূরত্ব এগোও, নতুন বিন্দুতে পৌঁছাও —
তারপর আবার একই কাজ করো। এটি অত্যন্ত সরল কিন্তু (আমরা L28-এ দেখব) তুলনামূলকভাবে কম নির্ভুল, কারণ প্রতিটি
ধাপে বক্রের প্রকৃত বক্রতা (curvature) সম্পূর্ণ উপেক্ষা করা হয় — শুধু শুরুর বিন্দুর ঢালই ব্যবহার করা হয়,
পুরো ধাপ জুড়ে।
৩ · সত্যিকারের ডেমো — টেস্ট সমীকরণ dy/dx = -y
এই মডিউল জুড়ে (L27–L30) আমরা একটি নির্দিষ্ট টেস্ট IVP ব্যবহার করব যার একটি জানা, ক্লোজড-ফর্ম সমাধান আছে — যাতে প্রতিটি মেথডের প্রকৃত এরর সরাসরি গণনা করে দেখানো যায়:
$$\frac{dy}{dx} = -y, \qquad y(0) = 1 \qquad \Longrightarrow \qquad y(x) = e^{-x}$$
নিচের কোড সেলে অয়লার মেথড হাতে-লেখা একটি লুপ হিসেবে বাস্তবায়ন করা হয়েছে, h = 0.5 ব্যবহার
করে x = 0 থেকে x = 2 পর্যন্ত, এবং প্রতিটি ধাপে প্রকৃত ক্লোজড-ফর্ম মান
(math.exp(-x)) এর সাথে তুলনা করে প্রকৃত এরর প্রিন্ট করা হয়েছে।
import math
def f(x, y):
return -y # dy/dx = -y
def exact(x):
return math.exp(-x) # জানা ক্লোজড-ফর্ম সমাধান
def euler(h, x0=0.0, y0=1.0, xend=2.0):
xs, ys = [x0], [y0]
x, y = x0, y0
n = round((xend - x0) / h)
for i in range(n):
y = y + h * f(x, y)
x = x + h
xs.append(x)
ys.append(y)
return xs, ys
print("h = 0.5 দিয়ে dy/dx = -y, y(0) = 1 সমাধান:")
print(f"{'x':>6} | {'y_euler':>10} | {'y_exact':>10} | {'|error|':>10}")
xs, ys = euler(0.5)
for x, y in zip(xs, ys):
err = abs(y - exact(x))
print(f"{x:>6.2f} | {y:>10.6f} | {exact(x):>10.6f} | {err:>10.6f}")
x = 2.0-তে অয়লার মেথডের আনুমানিক মান ০.০৬২৫০০,
অথচ প্রকৃত মান ০.১৩৫৩৩৫ — এরর ০.০৭২৮৩৫, যা প্রকৃত মানের প্রায় ৫৪%!
লক্ষ্য করুন এরর প্রতিটি ধাপে জমা হচ্ছে এবং কমছে-বাড়ছে — কারণ অয়লার মেথড ধারাবাহিকভাবে y-এর
মান বেশি আনুমানিক করছে (যেহেতু y কমছে এবং ঢাল ক্রমাগত কম নেতিবাচক হয়ে যাচ্ছে, শুরুর
বিন্দুর খাড়া ঢাল ব্যবহার করা প্রতিটি ধাপে সামান্য "ওভারশুট" করে)।
৪ · ছোট step size ব্যবহার করলে কী হয়
স্বাভাবিকভাবেই মনে হতে পারে — h ছোট করলে কি এরর কমবে? নিচের কোড সেলে h = 0.5
ও h = 0.1 তুলনা করা হয়েছে, শুধু চূড়ান্ত বিন্দু (x = 2) এর মান দেখিয়ে।
print("চূড়ান্ত বিন্দু x = 2 এ Euler বনাম exact:")
print(f"{'h':>6} | {'y_euler(2)':>12} | {'exact(2)':>10} | {'|error|':>10}")
for h in [0.5, 0.1]:
xs, ys = euler(h)
yf = ys[-1]
ex = exact(2.0)
print(f"{h:>6} | {yf:>12.6f} | {ex:>10.6f} | {abs(yf - ex):>10.6f}")
h = 0.5-এ এরর ০.০৭২৮৩৫, আর h = 0.1-এ (৫ গুণ বেশি ধাপ) এরর কমে
দাঁড়ায় ০.০১৩৭৫৯ — প্রায় ৫.৩ গুণ ছোট। এরর সত্যিই কমছে, কিন্তু ঠিক কী অনুপাতে কমছে এবং
কেন — এটাই L28-এর "অয়লার মেথডের এরর অ্যানালাইসিস" পাঠের মূল বিষয়, যেখানে আমরা একাধিক h
মান পরীক্ষা করে দেখব এরর কমার একটি নির্দিষ্ট, পূর্বানুমানযোগ্য প্যাটার্ন আছে।
অয়লার মেথড IVP সমাধানের সবচেয়ে সরল পদ্ধতি — প্রতিটি বিন্দুতে ট্যানজেন্ট রেখা বরাবর একটি ছোট ধাপ এগিয়ে যাওয়া। এটি সহজে বোঝা ও বাস্তবায়ন করা যায়, কিন্তু আমরা দেখেছি এর এরর যথেষ্ট বড় হতে পারে, বিশেষত বড় step size-এ। এই মডিউলের বাকি পাঠগুলো (L28–L31) এই একই মৌলিক ধারণার উপর ভিত্তি করে আরও নির্ভুল মেথড তৈরি করবে — প্রথমে অয়লারের এরর গভীরভাবে বিশ্লেষণ করে (L28), তারপর ধাপে ধাপে উন্নত মেথড তৈরি করে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
একটি IVP-তে শুরুর শর্ত y(x₀) = y₀ ছাড়া শুধু dy/dx = f(x, y) দেওয়া
থাকলে কী সমস্যা হতো?
শুধু dy/dx = f(x, y) একটি "দিক-নির্দেশক মাঠ" (direction field) বর্ণনা করে — অসংখ্য
সম্ভাব্য সমাধান-বক্র এই একই দিক-নির্দেশক মাঠ মেনে চলতে পারে (একে অপরের থেকে উপরে-নিচে সরানো)। শুরুর
শর্ত y(x₀) = y₀ একটি নির্দিষ্ট বিন্দু ঠিক করে দেয়, যা এই অসংখ্য সম্ভাব্য বক্রের মধ্যে
থেকে একটিমাত্র নির্দিষ্ট বক্র বেছে নেয় — এই কারণেই একে "Initial Value" প্রবলেম বলা হয়।
প্র ০২ অয়লার মেথড প্রতিটি ধাপে শুধু বর্তমান বিন্দুর ঢাল ব্যবহার করে, পুরো ধাপ জুড়ে সেই একই ঢাল ধরে রাখে। এতে কী ধরনের ভুল হতে পারে যদি বক্রটি ওই ধাপের মধ্যে দ্রুত বাঁক নেয়?
যদি বক্রের ঢাল ধাপের ভেতর দ্রুত বদলায় (উচ্চ curvature), তাহলে শুরুর বিন্দুর ঢাল পুরো ধাপ জুড়ে ব্যবহার
করা একটি ক্রমবর্ধমান ভুল সৃষ্টি করবে — কারণ প্রকৃত বক্রটি সেই সরলরেখা থেকে দ্রুত সরে যায়। এটাই ঠিক
উপরের ডেমোতে দেখা গেছে: dy/dx = -y-এ ঢাল ক্রমাগত বদলায় (y কমার সাথে সাথে
ঢালও কম নেতিবাচক হয়), আর অয়লার মেথড প্রতিটি ধাপে সেই পরিবর্তন উপেক্ষা করে বলে এরর জমা হয়।
প্র ০৩
h = 0.5 থেকে h = 0.1-এ যেতে এরর প্রায় ৫.৩ গুণ ছোট হয়েছে, অথচ ধাপ
সংখ্যা ৫ গুণ বেড়েছে। আপনার কী মনে হয়, এরর কমার এই অনুপাত কি step size-এর সাথে সরল রৈখিক সম্পর্ক দেখায়,
নাকি অন্য কোনো প্যাটার্ন থাকতে পারে?
এই একটি পর্যবেক্ষণ থেকে নিশ্চিতভাবে বলা কঠিন, তবে অনুপাতটি ৫ (ধাপ সংখ্যার অনুপাত)-এর কাছাকাছি হওয়াটা
ইঙ্গিত দেয় যে এরর মোটামুটি h-এর সমানুপাতিক হতে পারে — অর্থাৎ h অর্ধেক
করলে এরর মোটামুটি অর্ধেক হবে। এটাই ঠিক L28-এ আমরা একাধিক h মান দিয়ে সুনির্দিষ্টভাবে
পরীক্ষা করে যাচাই করব — অয়লার মেথড একটি "প্রথম-ক্রম" (first-order, O(h)) মেথড কিনা।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
h = 0.25ব্যবহার করলেx = 2-এ চূড়ান্ত এরর মোটামুটি কত হবে বলে আপনার ধারণা —0.5-এর এরর (0.0728) ও0.1-এর এরর (0.0138)-এর মাঝামাঝি কোথাও, নাকি অন্য কিছু?যেহেতু
0.25,0.5ও0.1-এর মাঝামাঝি একটি step size, যুক্তিসঙ্গতভাবে আশা করা যায় এররও এই দুই মানের মাঝামাঝি হবে — এবং এরর step size-এর প্রায় সমানুপাতিক হলে (L28-এ যাচাই করা হবে), তা0.5-এর এররের প্রায় অর্ধেক, অর্থাৎ প্রায়0.036-এর কাছাকাছি হওয়ার কথা। -
পরীক্ষা করুন: দ্বিতীয় কোড সেলের
h-তালিকায়0.25যোগ করে Run চেপে আপনার অনুমান যাচাই করুন।h = 0.25-এ চূড়ান্ত এরর হয় প্রায় ০.০৩৭৭ — যাh = 0.5-এর এরর (0.0728)-এর প্রায় অর্ধেক, এবংh = 0.1-এর এরর (0.0138)-এর প্রায় ২.৭ গুণ। এটি L28-এ বিস্তারিতভাবে যাচাই করা "এরর প্রায়h-এর সমানুপাতিক" প্যাটার্নের সাথে সঙ্গতিপূর্ণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — অয়লার মেথডের এরর অ্যানালাইসিস L28 একাধিক step size পরীক্ষা করে অয়লার মেথডের এরর কমার নির্দিষ্ট প্যাটার্ন সুনির্দিষ্টভাবে যাচাই করা হবে।
- Math for AI & ML কোর্স সহোদর কোর্স ডেরিভেটিভ ও রৈখিক আনুমানিকতার গাণিতিক ভিত্তি বিস্তারিতভাবে জানতে।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ এরর অ্যানালাইসিস, রুট-ফাইন্ডিং, লিনিয়ার সিস্টেম, ইন্টারপোলেশন, নিউমেরিক্যাল ইন্টিগ্রেশন, ODE সলভিং, আইগেনভ্যালু মেথড, অপ্টিমাইজেশন ও ক্যাপস্টোন।