পাঠ ১৯ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Digital Signal Processing / ডিফারেন্স ইকুয়েশন সমাধান

Z-ট্রান্সফর্ম দিয়ে ডিফারেন্স ইকুয়েশন সমাধান

Solving difference equations with the Z-transform
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • কীভাবে একটি ডিফারেন্স ইকুয়েশনের 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 দিয়ে ভাগ করলে পাওয়া যায়:

$$z^2 - 1.5z + 0.5 = 0$$

এটি ঠিক L18-এর denominator থেকে পোল বের করার একই কোয়াড্রেটিক ফর্মুলা প্রয়োগের প্রশ্ন — এখানে a=1, b=-1.5, c=0.5।

২ · সাধারণ সমাধান ও প্রাথমিক শর্ত থেকে ধ্রুবক নির্ণয়

যদি characteristic equation-এর দুটো ভিন্ন রুট z1, z2 পাওয়া যায়, সাধারণ সমাধান হয়:

$$y[n] = C_1 z_1^n + C_2 z_2^n$$

প্রাথমিক শর্ত 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 পর্যন্ত পাশাপাশি তুলনা করা হয়েছে।

Python
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) -> এই মোড ক্ষয়প্রাপ্ত হয়")

    
Run চেপে দেখুন — ডিসক্রিমিন্যান্ট 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) স্থায়ীভাবে থেকে যায়।
মূল কথা · Key takeaway

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-এর সময়-ডোমেইন কনভোলিউশন/ডিফারেন্স-ইকুয়েশন পদ্ধতিকে একটি অনেক দ্রুত, শক্তিশালী বীজগণিতীয় বিকল্প দিল।

অনুশীলন

  1. চিন্তা করুন: যদি প্রাথমিক শর্ত 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) সক্রিয়, ক্ষয়প্রাপ্ত মোড একেবারেই নেই।

  2. পরীক্ষা করুন: উপরের কোড সেলে 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-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
ট্রান্সফার ফাংশন ও পোল-জিরো অ্যানালাইসিস