ওয়েভ ইকুয়েশনের জন্য ফাইনাইট ডিফারেন্স
এই পাঠে যা শিখবেন
- ওয়েভ ইকুয়েশনের জন্য এক্সপ্লিসিট লিপফ্রগ স্কিম, এবং এটি কেন হিট ইকুয়েশনের স্কিম থেকে কাঠামোগতভাবে ভিন্ন (দ্বিতীয়-অর্ডার সময়-ডেরিভেটিভের কারণে)
- একটি সত্যিকারের, চলমান Python ডেমো — একটি পালস দুই দিকে বিভক্ত হয়ে প্রচার হতে দেখা
- ফিক্সড বাউন্ডারিতে তরঙ্গ-প্রতিফলন (এবং চিহ্ন-উল্টানো) সংখ্যাসূচকভাবে সত্যিই দেখা
- Courant (CFL) স্থিতিশীলতা শর্ত, এবং কেন
r=1এই নির্দিষ্ট ডিসক্রিটাইজেশনে বিশেষভাবে নিখুঁত
১ · লিপফ্রগ স্কিম — কেন হিট ইকুয়েশনের চেয়ে আলাদা
L36-এর হিট ইকুয়েশন সময়ে প্রথম-অর্ডার ($u_t$) ছিল — একটি সময়-ধাপের তথ্য থেকেই পরবর্তী ধাপ গণনা করা যেত। কিন্তু ওয়েভ ইকুয়েশন সময়ে দ্বিতীয়-অর্ডার ($u_{tt}$), তাই সেন্ট্রাল ডিফারেন্স ব্যবহার করলে:
$$\frac{u_i^{n+1} - 2u_i^n + u_i^{n-1}}{\Delta t^2} = c^2 \cdot \frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\Delta x^2}$$এখান থেকে $u_i^{n+1}$-কে বিচ্ছিন্ন করলে:
$$u_i^{n+1} = 2u_i^n - u_i^{n-1} + r^2\left(u_{i+1}^n - 2u_i^n + u_{i-1}^n\right), \qquad r = \frac{c\,\Delta t}{\Delta x}$$লক্ষ্য করুন — পরবর্তী ধাপ গণনা করতে বর্তমান ধাপ ($u^n$) এবং আগের ধাপ ($u^{n-1}$) দুটোই লাগে, তাই এই স্কিমকে "লিপফ্রগ" বলা হয়। প্রথম ধাপে ($u^1$ গণনা করতে) কোনো $u^{-1}$ নেই — শুরুর বেগ $u_t(x,0)=0$ ধরে একটি বিশেষ সূত্র ব্যবহার করা হয়: $u_i^1 = u_i^0 + \tfrac{1}{2}r^2(u_{i+1}^0 - 2u_i^0 + u_{i-1}^0)$।
লিপফ্রগ স্কিমে পরবর্তী ধাপ গণনায় বর্তমান ও আগের — দুটি সময়-ধাপের ডেটা লাগে, হিট ইকুয়েশনের এক-ধাপ মেমরির বিপরীতে।
$r = c\Delta t/\Delta x$ — এই স্কিমের CFL শর্ত: $r \le 1$।
r=1-এ এই নির্দিষ্ট ডিসক্রিটাইজেশন গাণিতিকভাবে নিখুঁত (কোনো সংখ্যাসূচক ডিসপার্শন নেই)।ফিক্সড (Dirichlet,
u=0) বাউন্ডারিতে তরঙ্গ প্রতিফলিত হয় এবং চিহ্ন উল্টে যায় — একটি বাঁধা দড়ির প্রান্তে তরঙ্গ প্রতিফলনের ঠিক ভৌত সমতুল্য।২ · একটি সত্যিকারের ডেমো — পালস বিভক্ত হয়ে প্রচার ও প্রতিফলিত হচ্ছে
ডোমেইন [0,1], c=1, 20টি স্থানিক ইন্টারভাল (21টি
গ্রিড-বিন্দু, Δx=0.05), শুরুর প্রোফাইল x=0.3-কেন্দ্রিক একটি ত্রিভুজাকার পালস
(0.2 ≤ x ≤ 0.4, উচ্চতা ১), শুরুর বেগ শূন্য, ফিক্সড বাউন্ডারি u(0,t)=u(1,t)=0।
Courant সংখ্যা r=1 (অর্থাৎ Δt=Δx=0.05)।
c = 1.0
Nx = 20
dx = 1.0 / Nx
xs = [i*dx for i in range(Nx+1)]
def initial_pulse(x):
# x=0.3-কেন্দ্রিক ত্রিভুজাকার পালস, অর্ধ-প্রস্থ 0.1, উচ্চতা 1
if 0.2 <= x <= 0.4:
return 1.0 - abs(x - 0.3)/0.1
return 0.0
r = 1.0 # Courant সংখ্যা: c*dt/dx (CFL শর্ত: r <= 1)
dt = r*dx/c
print(f"dx={dx} dt={dt} Courant r={r}")
def run_wave(r, steps):
u_prev = [initial_pulse(x) for x in xs]
u_prev[0] = 0.0; u_prev[-1] = 0.0
u_curr = [0.0]*(Nx+1) # প্রথম ধাপ: শুরুর বেগ 0 ধরে বিশেষ সূত্র
for i in range(1, Nx):
u_curr[i] = u_prev[i] + 0.5*(r**2)*(u_prev[i+1] - 2*u_prev[i] + u_prev[i-1])
u_curr[0] = 0.0; u_curr[-1] = 0.0
history = [u_prev[:], u_curr[:]] # list of lists: প্রতি সারি এক সময়-ধাপের প্রোফাইল
for n in range(steps - 1):
u_next = [0.0]*(Nx+1)
for i in range(1, Nx):
u_next[i] = 2*u_curr[i] - u_prev[i] + (r**2)*(u_curr[i+1] - 2*u_curr[i] + u_curr[i-1])
u_next[0] = 0.0; u_next[-1] = 0.0
u_prev, u_curr = u_curr, u_next
history.append(u_curr[:])
return history
steps = 8
hist = run_wave(r, steps)
print()
print("তরঙ্গের বিবর্তন u(x,t), ধাপ 0..8 (Courant r=1):")
print("ধাপ " + "".join(f"x={x:.2f}".rjust(7) for x in xs))
for n, row in enumerate(hist):
print(f"{n:3d} " + "".join(f"{v:7.3f}" for v in row))
print()
print("প্রতি ধাপে সর্বোচ্চ বিন্দুর অবস্থান (peak tracking):")
for n, row in enumerate(hist):
idx = max(range(len(row)), key=lambda i: row[i])
print(f"ধাপ {n}: idx={idx} x={xs[idx]:.2f} height={row[idx]:.4f}")
x=0.3-কেন্দ্রিক (উচ্চতা 1.0)। ধাপ ১-এ এটি ইতিমধ্যে দুটি
0.5 উচ্চতার অর্ধ-পালসে বিভক্ত হয়ে বিপরীত দিকে সরতে শুরু করেছে — ঠিক ডি'আলেমবেয়ারের সমাধান
$u(x,t) = \tfrac{1}{2}[f(x-ct) + f(x+ct)]$-এর পূর্বাভাস অনুযায়ী। ধাপ ২ থেকে ৪ পর্যন্ত বাম-মুখী
অর্ধ-পালসটি x=0.20 → 0.10 দিকে সরছে (প্রতি ধাপে ঠিক এক গ্রিড-বিন্দু, যেহেতু
r=1), আর ডান-মুখী অর্ধ-পালসটি x=0.40 → 0.50 দিকে। ধাপ ৭-এ বাম-মুখী পালসটি
বাউন্ডারিতে পৌঁছে প্রতিফলিত ও উল্টে ($x=0.05$-এ মান -0.500, ধনাত্মকের
বদলে ঋণাত্মক) — একটি ফিক্সড প্রান্তের ভৌত প্রতিফলনের ঠিক নিখুঁত সংখ্যাসূচক প্রতিরূপ।
0.5 উচ্চতায় (x=0.05 ও x=0.55), কিন্তু কোড x=0.55-কে
"সর্বোচ্চ" হিসেবে বেছে নিয়েছে — কারণ ফ্লোটিং-পয়েন্ট গোলযোগে (M1/L02-এর বিষয়) দুটি মান আসলে
0.4999999999999996 ও 0.4999999999999997-এর মতো অতি সামান্য ভিন্ন, একদম
সমান নয়। এটি একটি ভালো অনুস্মারক — সংখ্যাসূচক কোডে "সমান" তুলনা (==) বা max()-জাতীয়
ফাংশন সবসময় প্রকৃত গাণিতিক প্রতিসাম্যকে (symmetry) নিখুঁতভাবে প্রতিফলিত নাও করতে পারে।
হাইপারবোলিক PDE-তে তথ্য একটি সসীম গতিতে (c) ভ্রমণ করে — এই ডেমোতে r=1
বেছে নেওয়ায় সেই গতি ঠিক গ্রিডের রেজোলিউশনের সাথে মিলে যায় (প্রতি ধাপে এক গ্রিড-বিন্দু), ফলে স্কিমটি
এই বিশেষ ক্ষেত্রে গাণিতিকভাবে নিখুঁত। r < 1-এ সাধারণত সামান্য সংখ্যাসূচক ডিসপার্শন
দেখা দেয় (পালস কিছুটা ছড়িয়ে যায়), আর r > 1-এ CFL শর্ত লঙ্ঘন হয়ে L36-এর মতো সত্যিকারের
সংখ্যাসূচক অস্থিতিশীলতা দেখা দেয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
লিপফ্রগ স্কিমে প্রথম ধাপ ($u^1$) গণনা করতে একটি বিশেষ সূত্র লাগে, কারণ কোনো $u^{-1}$ নেই। যদি
শুরুর বেগ শূন্য না হয়ে অন্য কিছু হতো (যেমন u_t(x,0) = g(x)), এই বিশেষ সূত্রটি কীভাবে
বদলাতে হতো?
একটি "ভার্চুয়াল" পূর্ববর্তী ধাপ $u^{-1}$ কল্পনা করে সেন্ট্রাল-ডিফারেন্স বেগ ফর্মুলা $\frac{u^1 - u^{-1}}{2\Delta t} = g(x)$ ব্যবহার করে $u^{-1} = u^0 - 2\Delta t \cdot g(x)$ বসিয়ে মূল আপডেট সূত্রে প্রতিস্থাপন করলে $u_i^1 = u_i^0 + \Delta t \cdot g(x_i) + \tfrac{1}{2}r^2(u_{i+1}^0-2u_i^0+u_{i-1}^0)$ পাওয়া যায় — অর্থাৎ শূন্য-বেগ সূত্রে শুধু একটি অতিরিক্ত $\Delta t \cdot g(x_i)$ পদ যোগ হয়। এই ডেমোতে যেহেতু $g(x)=0$, এই পদটি বাদ পড়েছে।
প্র ০২
কোড সেলে r=1 বেছে নেওয়ায় তরঙ্গ ঠিক প্রতি ধাপে এক গ্রিড-বিন্দু সরেছে — কোনো
ছড়িয়ে পড়া (spreading) ছাড়াই। বাস্তব প্রয়োগে r ঠিক 1 রাখা কেন সবসময় সম্ভব
বা বাঞ্ছনীয় নাও হতে পারে?
r=1 মানে Δt = Δx/c — এই নির্দিষ্ট সম্পর্ক বজায় রাখতে Δx
পরিবর্তন করলে Δt-ও নির্দিষ্টভাবে বদলাতে হয়, যা সবসময় অন্য প্রয়োজনীয়তার (যেমন একটি
নির্দিষ্ট সময়-বিন্দুতে ঠিক আউটপুট দরকার) সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে। এছাড়া, একাধিক মাত্রায়
(২ডি/৩ডি ওয়েভ ইকুয়েশন) বা পরিবর্তনশীল c-তে (ভিন্ন মাধ্যমে ভিন্ন তরঙ্গ-গতি) ঠিক
r=1 বজায় রাখা কাঠামোগতভাবে সম্ভব নাও হতে পারে — সেক্ষেত্রে r<1 ব্যবহার
করে সামান্য সংখ্যাসূচক ডিসপার্শন মেনে নিতে হয়, স্থিতিশীলতার বিনিময়ে।
প্র ০৩ L36-এর হিট ইকুয়েশনে (প্যারাবোলিক) পালস-সদৃশ প্রোফাইল দ্রুত সমতল হয়ে যেত, কিন্তু এই লেসনের ওয়েভ ইকুয়েশনে (হাইপারবোলিক) পালসের আকৃতি (উচ্চতা, প্রস্থ) মূলত সংরক্ষিত থাকে, শুধু অবস্থান বদলায়। এই মৌলিক পার্থক্য কেন এই দুই শ্রেণীর PDE-এর সংজ্ঞাগত বৈশিষ্ট্য?
প্যারাবোলিক সমীকরণ (হিট) একটি ডিফিউশন প্রক্রিয়া বর্ণনা করে — শক্তি/তথ্য সময়ের সাথে "সমান হয়ে" যায়, তীক্ষ্ণ ফিচার অনিবার্যভাবে হারিয়ে যায়। হাইপারবোলিক সমীকরণ (ওয়েভ) একটি সংরক্ষণশীল প্রচার প্রক্রিয়া বর্ণনা করে — ডি'আলেমবেয়ারের সমাধান অনুযায়ী আকৃতি অপরিবর্তিত থেকে শুধু স্থানান্তরিত হয় (কোনো এনার্জি-অপচয় পদ নেই মূল সমীকরণে)। এই গুণগত পার্থক্যই মূলত L35-এর ডিসক্রিমিন্যান্ট-ভিত্তিক শ্রেণীবিভাগের পেছনের ভৌত অন্তর্দৃষ্টি — গাণিতিক শ্রেণী সরাসরি ভৌত আচরণ পূর্বাভাস দেয়।
অনুশীলন
-
চিন্তা করুন: ধাপ ৭-এ বাম-মুখী পালস
x=0সীমানায় প্রতিফলিত হয়েছে। ডান-মুখী পালসটি (যাx=1-এর দিকে যাচ্ছে) কোন ধাপে প্রতিফলিত হবে বলে আপনার ধারণা, প্রতিসাম্যের যুক্তিতে?শুরুর পালস
x=0.3-কেন্দ্রিক ছিল, যা বাম সীমানা (x=0) থেকে0.3দূরত্বে এবং ডান সীমানা (x=1) থেকে0.7দূরত্বে — অর্থাৎ ডান সীমানা বাম সীমানার চেয়ে0.4বেশি দূরে। যেহেতু তরঙ্গ প্রতি ধাপে ঠিক এক গ্রিড-বিন্দু (0.05) সরে, ডান-মুখী পালস বাম-মুখী পালসের চেয়ে প্রায়0.4/0.05=8ধাপ বেশি সময় নেবে বাউন্ডারিতে পৌঁছাতে — তাই মোটামুটি ধাপ7+8≈15-এর কাছাকাছি প্রতিফলন ঘটবে (কোড সেলেstepsবাড়িয়ে সরাসরি যাচাই করা যায়)। -
পরীক্ষা করুন: কোড সেলে
r = 1.0-কেr = 0.8-এ পরিবর্তন করে Run চাপুন (মনে রাখবেনdt = r*dx/cস্বয়ংক্রিয়ভাবে পরিবর্তিত হবে)। পালসের আকৃতি কি এখনো পুরোপুরি ধারালো থাকে, নাকি কিছুটা ছড়িয়ে যায়?r=0.8-এ পালস আর ঠিক এক গ্রিড-বিন্দু প্রতি ধাপে সরে না (কারণ Courant শর্ত আর ডিসক্রিটাইজেশনের সাথে নিখুঁতভাবে মেলে না) — ফলে সামান্য সংখ্যাসূচক ডিসপার্শন দেখা যায়: পালসের ধারালো ত্রিভুজাকার আকৃতি কিছুটা মসৃণ/প্রশস্ত হয়ে যায় যতটা ধাপ এগোয়। এটিr=1কেন এই নির্দিষ্ট এক-মাত্রিক, ধ্রুবক-গতির সমস্যায় একটি বিশেষ ("জাদুকরী") সীমা তার একটি প্রত্যক্ষ প্রদর্শনী।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — আইগেনভ্যালু সমস্যা ও পাওয়ার মেথড L38 মডিউল ৮-এর শুরু — BVP/PDE-এর জগত থেকে ম্যাট্রিক্সের আইগেনভ্যালু ও আইগেনভেক্টরের জগতে প্রবেশ।
- হিট ইকুয়েশন ফাইনাইট ডিফারেন্স রিভিশন L36 প্যারাবোলিক PDE-এর জন্য FTCS স্কিম, এই লেসনের লিপফ্রগ স্কিমের সাথে গঠনগত পার্থক্য তুলনা করার জন্য।
- PDE শ্রেণীবিভাগ রিভিশন L35 কেন ওয়েভ ইকুয়েশন হাইপারবোলিক, এবং কীভাবে এই শ্রেণী তরঙ্গ-প্রচার আচরণ ব্যাখ্যা করে।