পাঠ ৫৩ · ৫৭-এর মধ্যে · মডিউল ১২
Home / Courses / Numerical Methods / পদার্থবিজ্ঞান ও ইঞ্জিনিয়ারিং সিমুলেশন

পদার্থবিজ্ঞান ও ইঞ্জিনিয়ারিং সিমুলেশনে নিউমেরিক্যাল মেথডস

Numerical methods in physics & engineering simulation
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • কেন পদার্থবিজ্ঞান ও ইঞ্জিনিয়ারিং সিমুলেশনের মূল ভিত্তি ODE সলভার
  • একটি স্প্রিং-মাস সিস্টেমের গতির সমীকরণ — ড্যাম্পিং সহ ও ছাড়া
  • একটি সত্যিকারের, চলমান RK4 সিমুলেশন — পজিশন ও ভেলোসিটি সময়ের সাথে কীভাবে পরিবর্তিত হয় তা দেখা
  • আনড্যাম্পড কেসে সিমুলেশনকে জানা ক্লোজড-ফর্ম সমাধানের সাথে তুলনা করে সত্যিকারের এরর যাচাই করা

১ · সিমুলেশন মানেই আসলে ODE সলভিং

পদার্থবিজ্ঞান ও ইঞ্জিনিয়ারিং-এ যখন আমরা "সিমুলেট করা" বলি — একটি সেতুর কম্পন, একটি গাড়ির সাসপেনশন সিস্টেম, একটি স্যাটেলাইটের কক্ষপথ, একটি রোবট আর্মের গতি — প্রায় প্রতিটি ক্ষেত্রেই আসল গাণিতিক সমস্যাটি একটি ডিফারেনশিয়াল সমীকরণ যা সিস্টেমের অবস্থা (position, velocity, temperature ইত্যাদি) সময়ের সাথে কীভাবে পরিবর্তিত হয় তা বর্ণনা করে। বেশিরভাগ বাস্তব সিস্টেমের জন্য এই সমীকরণের কোনো ক্লোজড-ফর্ম বীজগাণিতিক সমাধান নেই (M6-এর ভূমিকায় যেমন বলা হয়েছিল) — তাই M6-M7-এ শেখা Euler, Heun ও RK4-এর মতো নিউমেরিক্যাল ODE সলভারই এই ক্ষেত্রের আসল কর্মী হাতিয়ার।

স্ট্রাকচারাল ইঞ্জিনিয়ারিং
ভবন ও সেতুর কম্পন মোড, ভূমিকম্প-প্রতিরোধ ডিজাইন — সবই ODE/PDE সিমুলেশনের ফলাফল (M7-এর সাথে সম্পর্কিত)।
কক্ষপথ মেকানিক্স
স্যাটেলাইট ও গ্রহের গতি নিউটনের গতিসূত্র থেকে পাওয়া ODE সিস্টেম — RK4-এর মতো মেথড দিয়ে সংখ্যাগতভাবে ইন্টিগ্রেট করা হয়।
গেম ও অ্যানিমেশন ফিজিক্স ইঞ্জিন
ভিডিও গেমে বস্তুর বাস্তবসম্মত গতি — আসলে প্রতি ফ্রেমে একটি ছোট Euler বা RK-জাতীয় ধাপ চালানো হয়।

২ · স্প্রিং-মাস সিস্টেম — গতির সমীকরণ

একটি ভর m স্প্রিং (স্প্রিং ধ্রুবক k) ও ড্যাম্পার (ড্যাম্পিং সহগ c, যেমন ঘর্ষণ বা বাতাসের রোধ) দিয়ে সংযুক্ত থাকলে, নিউটনের দ্বিতীয় সূত্র থেকে সিস্টেমের গতির সমীকরণ:

$$ m\,x''(t) + c\,x'(t) + k\,x(t) = 0 $$

এটি একটি দ্বিতীয়-ক্রম ODE — কিন্তু M6/L27-এ শেখা কৌশল ব্যবহার করে একে দুটি প্রথম-ক্রম ODE-এর একটি সিস্টেমে রূপান্তর করা যায়, স্টেট ভেক্টর y = [position, velocity] ব্যবহার করে:

$$ x' = v, \qquad v' = \frac{-k\,x - c\,v}{m} $$

এই দুটি সমীকরণ একসাথে RK4-এর মাধ্যমে সময়ের প্রতিটি ছোট ধাপে সমাধান করা যায় — ঠিক M6/L30-এ শেখা RK4 প্যাটার্নটিই এখানে দুই-উপাদান স্টেট ভেক্টরে প্রয়োগ করা হয়েছে।

সহোদর কোর্সের সাথে সম্পর্ক

x'', x'-এর মতো ডেরিভেটিভ কী এবং কীভাবে সেগুলো একটি সিস্টেমের "পরিবর্তনের হার" বর্ণনা করে তা Math for AI & ML কোর্সে বিস্তারিত আছে — এই পাঠ ধরে নেয় সেই মৌলিক ধারণাটি আছে, এবং RK4 দিয়ে সেই ডেরিভেটিভ-সমীকরণ সংখ্যাগতভাবে কীভাবে সমাধান করা হয় তা দেখায়।

৩ · সত্যিকারের সিমুলেশন — RK4 দিয়ে ড্যাম্পড দোলন

নিচের কোড সেলে m = 1.0 kg, k = 4.0 N/m, ড্যাম্পিং সহগ c = 0.4, প্রাথমিক পজিশন x₀ = 1.0 m ও প্রাথমিক ভেলোসিটি v₀ = 0 নিয়ে, স্টেপ সাইজ h = 0.1 সেকেন্ড দিয়ে t = 0 থেকে t = 3 সেকেন্ড পর্যন্ত RK4 দিয়ে সিস্টেমটি ইন্টিগ্রেট করা হয়েছে — সম্পূর্ণ Python list-ভিত্তিক, কোনো NumPy ছাড়াই।

Python
import math

# Spring-mass system: m*x'' + c*x' + k*x = 0
# State vector y = [position, velocity]
m = 1.0      # kg
k = 4.0      # N/m
c = 0.4      # damping coefficient (kg/s)

def derivatives(t, y):
    x, v = y
    a = (-k * x - c * v) / m
    return [v, a]

def rk4_step(t, y, h):
    k1 = derivatives(t, y)
    y2 = [y[i] + h / 2 * k1[i] for i in range(2)]
    k2 = derivatives(t + h / 2, y2)
    y3 = [y[i] + h / 2 * k2[i] for i in range(2)]
    k3 = derivatives(t + h / 2, y3)
    y4 = [y[i] + h * k3[i] for i in range(2)]
    k4 = derivatives(t + h, y4)
    return [y[i] + (h / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(2)]

x0, v0 = 1.0, 0.0
h = 0.1
T = 3.0
n_steps = int(T / h)

t = 0.0
y = [x0, v0]

print(f"{'t':>5} | {'x (position)':>14} | {'v (velocity)':>14}")
for i in range(n_steps + 1):
    if i % 5 == 0:
        print(f"{t:5.2f} | {y[0]:14.6f} | {y[1]:14.6f}")
    if i < n_steps:
        y = rk4_step(t, y, h)
        t += h

print()
print(f"চূড়ান্ত অবস্থা t={t:.2f}: x={y[0]:.6f}  v={y[1]:.6f}")

    
কোডটি চালালে দেখা যায় পজিশন x ধনাত্মক থেকে ঋণাত্মক হয়ে দোলাচ্ছে (1.0 → 0.569 → −0.258 → −0.720 → −0.498 → 0.099 → 0.505, প্রতি 0.5 সেকেন্ড অন্তর), এবং দোলনের প্রশস্ততা (amplitude) ধীরে ধীরে কমছে — এটাই ড্যাম্পিং-এর বাস্তব প্রভাব, শক্তি ধীরে ধীরে ক্ষয় হচ্ছে। t = 3.0 সেকেন্ডে চূড়ান্ত অবস্থা x ≈ 0.505102, v ≈ 0.340040।

৪ · সত্যতা যাচাই — আনড্যাম্পড কেসে ক্লোজড-ফর্ম সমাধানের সাথে তুলনা

একটি সিমুলেশন "কাজ করছে বলে মনে হওয়া" আর "সত্যিই সঠিক হওয়া" — দুটো ভিন্ন জিনিস। যেকোনো নতুন সিমুলেশন কোডকে বিশ্বাস করার আগে অন্তত একটি এমন বিশেষ ক্ষেত্রে যাচাই করা উচিত যেখানে সঠিক উত্তর আগে থেকেই জানা আছে — এটাই M11-এর "যাচাইযোগ্যতা" নীতির সরাসরি প্রয়োগ। যখন ড্যাম্পিং c = 0, স্প্রিং-মাস সিস্টেমের একটি পরিচিত ক্লোজড-ফর্ম সমাধান আছে:

$$ x(t) = x_0 \cos(\omega t), \qquad \omega = \sqrt{k/m} $$

নিচের কোড সেলে একই RK4 সিমুলেশন c = 0 দিয়ে চালিয়ে, প্রতিটি টাইম-স্টেপে RK4-এর ফলাফল এই অ্যানালিটিক সূত্রের সাথে তুলনা করা হয়েছে — সত্যিকারের কম্পিউটেড এরর দেখতে।

Python
import math

m, k = 1.0, 4.0
c2 = 0.0   # undamped case

def derivatives_undamped(t, y):
    x, v = y
    a = (-k * x - c2 * v) / m
    return [v, a]

def rk4_step_undamped(t, y, h):
    k1 = derivatives_undamped(t, y)
    y2 = [y[i] + h / 2 * k1[i] for i in range(2)]
    k2 = derivatives_undamped(t + h / 2, y2)
    y3 = [y[i] + h / 2 * k2[i] for i in range(2)]
    k3 = derivatives_undamped(t + h / 2, y3)
    y4 = [y[i] + h * k3[i] for i in range(2)]
    k4 = derivatives_undamped(t + h, y4)
    return [y[i] + (h / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(2)]

x0, v0 = 1.0, 0.0
h = 0.1
n_steps = 30
omega = math.sqrt(k / m)
print(f"omega = sqrt(k/m) = {omega:.6f}")
print()

t = 0.0
y = [x0, v0]
print(f"{'t':>5} | {'RK4 x':>12} | {'analytic x':>12} | {'abs error':>12}")
for i in range(n_steps + 1):
    analytic = x0 * math.cos(omega * t)
    err = abs(y[0] - analytic)
    if i % 5 == 0:
        print(f"{t:5.2f} | {y[0]:12.8f} | {analytic:12.8f} | {err:12.2e}")
    if i < n_steps:
        y = rk4_step_undamped(t, y, h)
        t += h

final_analytic = x0 * math.cos(omega * t)
final_err = abs(y[0] - final_analytic)
print()
print(f"চূড়ান্ত RK4 x = {y[0]:.8f}, অ্যানালিটিক x = {final_analytic:.8f}, প্রকৃত এরর = {final_err:.2e}")

    
কোডের প্রকৃত আউটপুট দেখায় ω = 2.0 rad/s, এবং t = 3.0 সেকেন্ড পর্যন্ত প্রতিটি চেকপয়েন্টে RK4-এর ফলাফল ও অ্যানালিটিক মানের মধ্যে এরর সর্বদা 10⁻⁵-এর কাছাকাছি মাত্রায় থাকে (যেমন t = 3.0-এ RK4 দেয় x ≈ 0.96013551, প্রকৃত অ্যানালিটিক মান x = 0.96017029, এরর মাত্র ≈ 3.48 × 10⁻⁵) — এই ক্ষুদ্র, স্থিতিশীল এররই নিশ্চিত করে RK4 কোডটি সঠিকভাবে কাজ করছে, তাই ড্যাম্পড কেসেও (যেখানে কোনো ক্লোজড-ফর্ম তুলনা নেই) আমরা এর ফলাফলে আস্থা রাখতে পারি।
মূল কথা · Key takeaway

বাস্তব ইঞ্জিনিয়ারিং সিমুলেশন সফটওয়্যার (স্ট্রাকচারাল অ্যানালাইসিস, রোবোটিক্স, এরোস্পেস) মূলত এই একই প্যাটার্নের বড় পরিসরের সংস্করণ — একটি ভৌত সিস্টেমের ডিফারেনশিয়াল সমীকরণ লেখা, M6-M7-এর একটি ODE সলভার দিয়ে সংখ্যাগতভাবে ইন্টিগ্রেট করা, এবং যেখানেই সম্ভব একটি জানা কেসের সাথে ফলাফল যাচাই করা। পরবর্তী দুই পাঠে (L54, L55) একই নিউমেরিক্যাল টুলকিট — মেথডগুলো একই, শুধু প্রয়োগের ক্ষেত্র ভিন্ন — ফাইন্যান্স ও মেশিন লার্নিং-এ প্রয়োগ করা হবে।

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

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

প্র ০১ ড্যাম্পড সিমুলেশনে দোলনের প্রশস্ততা ধীরে ধীরে কমছিল, কিন্তু আনড্যাম্পড সিমুলেশনে তা হয়নি কেন?

ড্যাম্পিং সহগ c সিস্টেম থেকে শক্তি ক্ষয় করে (বাস্তবে ঘর্ষণ বা বাতাসের রোধের মতো) — গতির সমীকরণে −c·v পদটি সবসময় ভেলোসিটির বিপরীত দিকে কাজ করে, ধীরে ধীরে গতি কমিয়ে দেয়। যখন c = 0, এই শক্তি-ক্ষয়কারী পদ থাকে না, তাই সিস্টেমটি তাত্ত্বিকভাবে চিরকাল একই প্রশস্ততায় দোলতে থাকে — যা ঠিক ক্লোজড-ফর্ম সমাধান x(t) = x₀cos(ωt)-এও প্রতিফলিত হয়েছে।

প্র ০২ আনড্যাম্পড কেসে RK4-এর এরর 10⁻⁵ মাত্রায় স্থির ছিল, শূন্য হয়নি। কেন RK4 এমনকি এই সহজ, স্থিতিশীল সমস্যাতেও পুরোপুরি নির্ভুল উত্তর দেয় না?

RK4 একটি চতুর্থ-ক্রম মেথড — প্রতিটি ধাপে এটি প্রকৃত সমাধানের একটি সীমিত-নির্ভুলতার (finite-order) টেইলর-সিরিজ অ্যাপ্রক্সিমেশন ব্যবহার করে, তাই প্রতিটি ধাপে একটি ক্ষুদ্র লোকাল ট্রাংকেশন এরর থাকে যা M6/L28-এ বিস্তারিত আলোচনা করা হয়েছে। স্টেপ সাইজ h আরও ছোট করলে এই এরর আরও কমবে (RK4-এর ক্ষেত্রে h অর্ধেক করলে এরর প্রায় ১৬ গুণ ছোট হয়, যেহেতু এরর O(h⁴)) — কিন্তু সম্পূর্ণ শূন্য কখনো হবে না, কারণ এটি একটি ধারাবাহিক ফাংশনের ইটারেটিভ-ধাপ ভিত্তিক অ্যাপ্রক্সিমেশন।

প্র ০৩ যদি স্প্রিং ধ্রুবক k ও ভর m এর মান আপনি সঠিকভাবে না জানতেন (যেমন কোনো বাস্তব সেন্সর থেকে অনুমান করতে হতো), তাহলে সিমুলেশনের ফলাফলে এর কী প্রভাব পড়তে পারে বলে মনে হয়?

এটি M11-এ শেখা সেনসিটিভিটি অ্যানালাইসিসের সরাসরি প্রশ্ন — k বা m-এর একটি ছোট ইনপুট এরর, RK4 কোডের মধ্য দিয়ে প্রোপাগেট হয়ে সিমুলেটেড পজিশন/ভেলোসিটিতে কতটা আউটপুট এরর তৈরি করে তা M11/L51-এর মন্টে কার্লো টেকনিক দিয়ে পরিমাপ করা যায় — k ও m-কে বারবার সামান্য এলোমেলোভাবে পরিবর্তন করে, ফলাফলের স্প্রেড দেখে বোঝা যাবে সিমুলেশনটি ইনপুট অনিশ্চয়তার প্রতি কতটা সংবেদনশীল।

অনুশীলন

  1. চিন্তা করুন: প্রথম কোড সেলে ড্যাম্পিং সহগ c-কে 0.4 থেকে 2.0-এ বাড়ালে দোলনের আচরণে কী পরিবর্তন আসবে বলে আপনার ধারণা?

    ড্যাম্পিং সহগ যত বেশি হবে, শক্তি তত দ্রুত ক্ষয় হবে — দোলনের প্রশস্ততা আরও দ্রুত কমে আসবে। যথেষ্ট বড় c-তে সিস্টেমটি "ওভারড্যাম্পড" হয়ে যেতে পারে — তখন এটি আর দোলে না, বরং সরাসরি ভারসাম্য অবস্থার দিকে মসৃণভাবে এগিয়ে যায়, কোনো দিক পরিবর্তন ছাড়াই।

  2. পরীক্ষা করুন: প্রথম কোড সেলে c = 0.4-কে c = 2.0-এ পরিবর্তন করে Run চেপে আপনার অনুমান যাচাই করুন — আউটপুটে x-এর মান কি এখনো ঋণাত্মক হচ্ছে, নাকি শুধু শূন্যের দিকে কমছে?

    c = 2.0-তে (এই নির্দিষ্ট m = 1.0, k = 4.0 সেটআপে সিস্টেমটি এখনো আন্ডারড্যাম্পড থাকে, তবে দোলন আগের চেয়ে অনেক দ্রুত মিলিয়ে যায়) আউটপুটে দেখা যাবে x-এর মান আগের তুলনায় অনেক দ্রুত শূন্যের কাছাকাছি নেমে আসছে এবং দোলনের প্রশস্ততা খুব দ্রুত ছোট হয়ে যাচ্ছে — ড্যাম্পিং যত বেশি, শক্তি ক্ষয়ও তত দ্রুত, এটাই কোডের প্রকৃত আউটপুটে সরাসরি দেখা যায়।

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

আগের পাঠ
সঠিক মেথড বাছাই — একটি সিদ্ধান্ত-কাঠামো