Z-ট্রান্সফর্ম দিয়ে ডিফারেন্স ইকুয়েশন সমাধান
এই পাঠে যা শিখবেন
- কীভাবে একটি ডিফারেন্স ইকুয়েশনের characteristic equation লেখা হয় এবং L18-এর পোল-খোঁজার পদ্ধতি এতে প্রয়োগ হয়
- সাধারণ সমাধান $y[n]=C_1z_1^n+C_2z_2^n$ থেকে প্রাথমিক শর্ত ব্যবহার করে $C_1, C_2$ নির্ণয় করা
- Python কোড দিয়ে ক্লোজড-ফর্ম সমাধান এবং সরাসরি সিমুলেশনের মধ্যে সংখ্যাগত ক্রস-চেক করা
- পোলের অবস্থান কীভাবে সমাধানের প্রতিটি মোডের দীর্ঘমেয়াদি আচরণ (ক্ষয়/ধ্রুবক/বৃদ্ধি) নির্ধারণ করে
১ · characteristic equation ও পোল (L18-এর পদ্ধতি পুনর্ব্যবহার)
বিবেচনা করা যাক এই সমগোত্রীয় (homogeneous) ডিফারেন্স ইকুয়েশন — প্রাথমিক শর্তের প্রভাবেই সিস্টেম কীভাবে সাড়া দেয় তা দেখার জন্য (zero-input response, M3/L12-এর ইমপালস রেসপন্স আলোচনার সাথে সম্পর্কিত):
$$y[n] - 1.5\,y[n-1] + 0.5\,y[n-2] = 0, \qquad y[0]=2,\ y[1]=0.5$$
L18-এর মতোই, এই ডিফারেন্স ইকুয়েশনের সমাধান খোঁজার প্রথম ধাপ হলো এর characteristic equation
লেখা — y[n] = z^n বসিয়ে z^n দিয়ে ভাগ করলে পাওয়া যায়:
এটি ঠিক L18-এর denominator থেকে পোল বের করার একই কোয়াড্রেটিক ফর্মুলা প্রয়োগের প্রশ্ন — এখানে
a=1, b=-1.5, c=0.5।
২ · সাধারণ সমাধান ও প্রাথমিক শর্ত থেকে ধ্রুবক নির্ণয়
যদি characteristic equation-এর দুটো ভিন্ন রুট z1, z2 পাওয়া যায়, সাধারণ সমাধান হয়:
প্রাথমিক শর্ত y[0]=2, y[1]=0.5 বসিয়ে দুটো সমীকরণের একটি লিনিয়ার সিস্টেম পাওয়া যায়
($C_1+C_2=y[0]$, $C_1z_1+C_2z_2=y[1]$), যা সমাধান করে $C_1, C_2$ নির্ণয় করা যায়।
characteristic equation থেকে কোয়াড্রেটিক ফর্মুলায় (L18)
z1, z2 বের করা।প্রাথমিক শর্ত থেকে
C1, C2 নির্ণয় করে সম্পূর্ণ ক্লোজড-ফর্ম সমাধান পাওয়া।ক্লোজড-ফর্ম সমাধান একটি সরাসরি লুপ-ভিত্তিক সিমুলেশনের সাথে সংখ্যাগতভাবে মিলিয়ে যাচাই করা — এই পাঠের মূল ডেমো।
৩ · একটি সত্যিকারের ডেমো — ক্লোজড-ফর্ম বনাম সরাসরি সিমুলেশন
নিচের কোডে প্রথমে L18-এর কোয়াড্রেটিক-ফর্মুলা পদ্ধতিতে পোল বের করা হয়েছে, তারপর প্রাথমিক শর্ত থেকে
C1, C2 নির্ণয় করে ক্লোজড-ফর্ম সমাধান তৈরি করা হয়েছে, এবং শেষে একই ডিফারেন্স ইকুয়েশন সরাসরি
একটি লুপে (y[n] = 1.5*y[n-1] - 0.5*y[n-2]) সিমুলেট করে দুটো ফলাফল n=0 থেকে
n=9 পর্যন্ত পাশাপাশি তুলনা করা হয়েছে।
import cmath
# ডিফারেন্স ইকুয়েশন: y[n] - 1.5 y[n-1] + 0.5 y[n-2] = 0 (zero-input response)
# প্রাথমিক শর্ত: y[0] = 2, y[1] = 0.5
print("=== ধাপ ১: characteristic equation ও পোল (L18-এর পদ্ধতি পুনর্ব্যবহার) ===")
a, b, c = 1, -1.5, 0.5
disc = b*b - 4*a*c
print(f"z^2 + ({b})z + ({c}) = 0, ডিসক্রিমিন্যান্ট = {disc}")
sqrt_disc = cmath.sqrt(disc)
z1 = (-b + sqrt_disc) / (2*a)
z2 = (-b - sqrt_disc) / (2*a)
print(f"পোল ১: z1 = {z1}")
print(f"পোল ২: z2 = {z2}")
print()
print("=== ধাপ ২: সাধারণ সমাধান y[n] = C1*z1^n + C2*z2^n, প্রাথমিক শর্ত থেকে C1, C2 নির্ণয় ===")
y0, y1 = 2, 0.5
# C1 + C2 = y0
# C1*z1 + C2*z2 = y1
C1 = (y1 - y0*z2) / (z1 - z2)
C2 = (y0*z1 - y1) / (z1 - z2)
print(f"C1 = {C1}")
print(f"C2 = {C2}")
def y_closed(n):
return (C1 * z1**n + C2 * z2**n).real
print()
print("=== ধাপ ৩: ক্লোজড-ফর্ম বনাম সরাসরি সিমুলেশন -- ক্রস-চেক ===")
N = 10
y_sim = [0.0]*N
y_sim[0] = y0
y_sim[1] = y1
for n in range(2, N):
y_sim[n] = 1.5*y_sim[n-1] - 0.5*y_sim[n-2]
print(f"{'n':>3} | {'closed-form':>14} | {'সরাসরি সিমুলেশন':>16} | {'পার্থক্য':>10}")
for n in range(N):
cf = y_closed(n)
diff = abs(cf - y_sim[n])
print(f"{n:>3} | {cf:>14.8f} | {y_sim[n]:>16.8f} | {diff:>10.2e}")
print()
print(f"পোল z1 = {z1.real} (|z1|={abs(z1):.4f}, ইউনিট সার্কেলের উপর) -> এই মোড কমে না, ধ্রুবক থাকে")
print(f"পোল z2 = {z2.real} (|z2|={abs(z2):.4f} < 1) -> এই মোড ক্ষয়প্রাপ্ত হয়")
0.25 (ধনাত্মক), পোল z1 = 1.0 এবং
z2 = 0.5। এখান থেকে C1 = -1.0, C2 = 3.0। ক্লোজড-ফর্ম ও সরাসরি
সিমুলেশন — দুটোই n=0-এ 2.0, n=1-এ 0.5,
n=2-এ -0.25, ... n=9-এ -0.99414062 পর্যন্ত — প্রতিটি
n-এ পার্থক্য ঠিক 0.00e+00, অর্থাৎ দুটো সম্পূর্ণ ভিন্ন পদ্ধতি (বীজগণিতীয়
ক্লোজড-ফর্ম বনাম ধাপে-ধাপে পুনরাবৃত্তি) হুবহু একই ফলাফল দিচ্ছে। লক্ষ্য করুন y[n] ক্রমশ
-1-এর দিকে এগোচ্ছে (কখনও ঠিক পৌঁছায় না) — কারণ z2=0.5 মোড ক্ষয় পেয়ে যায়, কিন্তু
z1=1 মোড (C1×1^n = -1) স্থায়ীভাবে থেকে যায়।
Z-ট্রান্সফর্ম/characteristic-equation পদ্ধতি একটি ডিফারেন্স ইকুয়েশনের সম্পূর্ণ ভবিষ্যৎ আচরণ একবারে, বীজগণিতীয়ভাবে বের করে দেয় — কোনো লুপ চালানো ছাড়াই। কিন্তু L01 থেকে এই কোর্সের প্রতিষ্ঠিত রীতি অনুযায়ী, সরাসরি সিমুলেশনের সাথে ক্রস-চেক করাই এই বীজগণিতীয় শর্টকাটের সঠিকতা নিশ্চিত করার সবচেয়ে নির্ভরযোগ্য উপায়। M4-এর এই ছয়টি পাঠ (Z-ট্রান্সফর্ম থেকে ডিফারেন্স ইকুয়েশন সমাধান পর্যন্ত) মিলিয়ে একটি সম্পূর্ণ বীজগণিতীয় টুলকিট তৈরি করল — পরের মডিউলে (M5) আমরা ফ্রিকোয়েন্সি-ডোমেইনে ফিরে যাব, DTFT ও DFT দিয়ে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
পোল z1=1.0 ইউনিট সার্কেলের ঠিক উপরে (মার্জিনাল) থাকায় সিস্টেমের আউটপুট কেন কখনো
-1-এ পৌঁছায় না, শুধু তার কাছাকাছি যেতে থাকে?
কারণ ক্লোজড-ফর্ম সমাধান $y[n] = -1 \cdot 1^n + 3 \cdot 0.5^n = -1 + 3(0.5)^n$। প্রথম টার্ম
(z1=1 মোড) সবসময় ঠিক -1, কিন্তু দ্বিতীয় টার্ম (z2=0.5 মোড)
প্রতিটি n-এ ধনাত্মকভাবে ছোট হতে হতে শূন্যের দিকে যায়, কখনো ঠিক শূন্য হয় না (ফিনিট
n-এ)। তাই যোগফল -1-এর দিকে অসীমভাবে কাছাকাছি যায়, কিন্তু কখনো ঠিক তাতে
পৌঁছায় না।
প্র ০২
যদি সিস্টেমটি x[n]-এর মতো কোনো নন-জিরো ইনপুট পেত (এই পাঠের মতো সম্পূর্ণ
zero-input না হয়ে), তাহলে সমাধান পদ্ধতিতে মূলত কী যোগ হতো?
তখন সমাধান হতো "প্রাকৃতিক রেসপন্স" (এই পাঠে যা দেখানো হলো, characteristic equation-এর রুট থেকে) +
"ফোর্সড রেসপন্স" (ইনপুট X(z)-এর নিজস্ব পোল থেকে আসা অতিরিক্ত টার্ম)। L15-এর লিনিয়ারিটি
বৈশিষ্ট্য অনুযায়ী সম্পূর্ণ সমাধান হলো এই দুই অংশের যোগফল — টেকনিক একই থাকে, শুধু
Y(z)-এ আরও একটি সোর্স যোগ হয়।
প্র ০৩ M4-এর ছয়টি পাঠ (L14-L19) একসাথে মিলিয়ে কী সামগ্রিক ক্ষমতা তৈরি করল?
L14 সংজ্ঞা দিল, L15 বৈশিষ্ট্য (লিনিয়ারিটি, শিফটিং) দিল, L16 বলল কোথায় এই সিরিজগুলো বৈধ (ROC), L17
দেখাল কীভাবে X(z) থেকে x[n]-এ ফিরে আসা যায়, L18 ট্রান্সফার ফাংশন ও
পোল-জিরো দিয়ে স্ট্যাবিলিটি বিচার করার টুল দিল, আর L19 সব একত্র করে সরাসরি ডিফারেন্স ইকুয়েশন
বীজগণিতীয়ভাবে সমাধান করল। একসাথে এগুলো M3-এর সময়-ডোমেইন কনভোলিউশন/ডিফারেন্স-ইকুয়েশন পদ্ধতিকে একটি
অনেক দ্রুত, শক্তিশালী বীজগণিতীয় বিকল্প দিল।
অনুশীলন
-
চিন্তা করুন: যদি প্রাথমিক শর্ত
y[0]=2, y[1]=0.5-এর বদলেy[0]=4, y[1]=4হতো (পোলz1=1, z2=0.5অপরিবর্তিত),C1-এর মান কত হবে বলে আপনার ধারণা? সূত্রC1 + C2 = y[0],C1·z1 + C2·z2 = y[1]দিয়ে হাতে হিসেব করুন।C1 + C2 = 4এবংC1 + 0.5·C2 = 4— দুটো সমীকরণ বিয়োগ করলে0.5·C2 = 0, তাইC2 = 0, এবংC1 = 4। এক্ষেত্রেy[n] = 4(ধ্রুবক, সবn-এ) — কারণ শুধু মার্জিনাল মোড (z1=1) সক্রিয়, ক্ষয়প্রাপ্ত মোড একেবারেই নেই। -
পরীক্ষা করুন: উপরের কোড সেলে
y0, y1 = 2, 0.5-কেy0, y1 = 4, 4-এ পরিবর্তন করে Run চেপে আপনার হিসেব যাচাই করুন —C2সত্যিই শূন্য হয় কিনা এবংy_simসবসময়4.0থাকে কিনা লক্ষ্য করুন।রান করলে
C1 = 4.0,C2 = 0.0দেখাবে, এবং প্রতিটিn-এ ক্লোজড-ফর্ম ও সরাসরি সিমুলেশন উভয়ই ঠিক4.00000000দেখাবে — পার্থক্য0.00e+00। এটি নিশ্চিত করে যে যখন প্রাথমিক শর্ত শুধু মার্জিনাল-স্ট্যাবল মোডকে সক্রিয় করে, আউটপুট সত্যিই একটি ধ্রুবক (কখনো ক্ষয় হয় না, কখনো বাড়েও না) — L18-এর "মার্জিনাল স্ট্যাবিলিটি" ধারণার একটি সরাসরি সংখ্যাগত উদাহরণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
- L18 · ট্রান্সফার ফাংশন ও পোল-জিরো অ্যানালাইসিস পূর্ব-প্রয়োজনীয় এই পাঠের characteristic-equation পোল-খোঁজা সরাসরি L18-এর কোয়াড্রেটিক-ফর্মুলা পদ্ধতির পুনর্ব্যবহার।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।