পাঠ ১৬ · ৫৭-এর মধ্যে · মডিউল ৪

কনভারজেন্সের অঞ্চল (ROC)

Region of convergence (ROC)
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • কেন Z-ট্রান্সফর্মের সংজ্ঞা একটি অসীম সিরিজ, এবং কেন সেই সিরিজ সবসময় কনভার্জ করে না
  • Region of Convergence (ROC)-এর সংজ্ঞা এবং একটি জ্যামিতিক-সিরিজ উদাহরণে এর প্রকৃত মান
  • Python কোড দিয়ে ROC-এর ভেতরে ও বাইরে আংশিক যোগফলের ভিন্ন আচরণ সংখ্যাগতভাবে দেখা
  • কেন একই X(z) সূত্রের একাধিক সম্ভাব্য ROC থাকতে পারে (ভিন্ন ভিন্ন সিগন্যালের জন্য)

১ · কেন কনভারজেন্স গুরুত্বপূর্ণ

L14-এ আমরা ফিনিট-লেংথ সিগন্যালের Z-ট্রান্সফর্ম নিয়ে কাজ করেছি — সেখানে যোগফল ফিনিট বলে কোনো সমস্যা ছিল না। কিন্তু বাস্তব বিশ্বের অনেক সিগন্যাল অসীম-লেংথ (যেমন একটি ক্ষয়প্রাপ্ত এক্সপোনেনশিয়াল x[n] = 0.5^n, যা কখনো ঠিক শূন্য হয় না)। এমন সিগন্যালের জন্য

$$X(z) = \sum_{n=0}^{\infty} x[n]\, z^{-n}$$

একটি অসীম সিরিজ — এবং যেকোনো অসীম সিরিজের মতোই, এটি কিছু z-মানে একটি সসীম মানে কনভার্জConvergenceএকটি অসীম সিরিজের আংশিক যোগফল যত বেশি পদ যোগ করা হয় ততই একটি নির্দিষ্ট সসীম মানের কাছাকাছি পৌঁছায় — একে বলে সিরিজটি সেই মানে কনভার্জ করছে। করে, আবার অন্য z-মানে অসীমের দিকে বেড়ে যায় (ডাইভার্জ করে)। যেখানে সিরিজটি কনভার্জ করে না, সেখানে X(z)-এর কোনো অর্থ নেই — তাই ROC ছাড়া একটি Z-ট্রান্সফর্মের বর্ণনা অসম্পূর্ণ।

২ · একটি ক্লাসিক উদাহরণ

ধরা যাক x[n] = 0.5^n, সব n >= 0-এর জন্য (কজাল)। এটি একটি জ্যামিতিক সিরিজ:

$$X(z) = \sum_{n=0}^{\infty} 0.5^n z^{-n} = \sum_{n=0}^{\infty} \left(\frac{0.5}{z}\right)^n$$

একটি জ্যামিতিক সিরিজ $\sum r^n$ কনভার্জ করে ঠিক তখনই যখন $|r| < 1$। এখানে $r = 0.5/z$, তাই কনভারজেন্সের শর্ত $|0.5/z| < 1$, অর্থাৎ $|z| > 0.5$ — এটাই এই সিগন্যালের ROC। এই অঞ্চলে বদ্ধ-রূপ (closed-form) যোগফল হলো:

$$X(z) = \frac{1}{1 - 0.5\,z^{-1}}, \qquad |z| > 0.5$$
ROC-এর ভেতরে
|z| > 0.5-এ আংশিক যোগফল একটি নির্দিষ্ট সসীম মানে স্থির হয়ে যায় — সিরিজ কনভার্জ করে।
ROC-এর বাইরে
|z| <= 0.5-এ আংশিক যোগফল অসীমের দিকে বেড়ে যায় — সিরিজ ডাইভার্জ করে, X(z)-এর কোনো অর্থ থাকে না।
কজাল সিগন্যাল = বাইরের অঞ্চল
একটি কজাল (ডানদিকে অসীম) সিগন্যালের ROC সবসময় একটি বৃত্তের বাইরের অঞ্চল (|z| > কিছু ব্যাসার্ধ) — এই প্যাটার্নটি L18-এর পোল-জিরো অ্যানালাইসিসে ফিরে আসবে।

৩ · একটি সত্যিকারের ডেমো — কনভারজেন্স বনাম ডাইভারজেন্স

নিচের কোডে তিনটি টেস্ট পয়েন্ট ব্যবহার করা হয়েছে: z=1 (|z|=1 > 0.5, ROC-এর ভেতরে), z=0.5 (|z|=0.5, ঠিক ROC-এর সীমানায়) এবং z=0.3 (|z|=0.3 < 0.5, ROC-এর বাইরে)। প্রতিটির জন্য আংশিক যোগফল N = 5, 10, 20, 50, 100 পদ পর্যন্ত গণনা করে দেখা হয়েছে সেগুলো কনভার্জ করে নাকি ডাইভার্জ করে।

Python
# x[n] = 0.5^n  n >= 0-এর জন্য (কজাল)
# X(z) = sum_{n=0}^inf 0.5^n z^-n = 1 / (1 - 0.5 z^-1),  ROC: |z| > 0.5

def closed_form(z):
    return 1 / (1 - 0.5 * z**-1)

def partial_sum(z, N):
    total = 0j
    for n in range(N):
        total += (0.5**n) * z**(-n)
    return total

test_zs = [1+0j, 0.5+0j, 0.3+0j]
Ns = [5, 10, 20, 50, 100]

for z in test_zs:
    print(f"--- z = {z}   |z| = {abs(z)} ---")
    if abs(z) > 0.5:
        cf = closed_form(z)
        print(f"  বদ্ধ-রূপ (closed form) X(z) = {cf}")
    else:
        print("  |z| <= 0.5  ->  ROC-এর বাইরে, বদ্ধ-রূপ প্রযোজ্য নয়")
    for N in Ns:
        s = partial_sum(z, N)
        print(f"  N={N:>3} পদ পর্যন্ত আংশিক যোগফল = {s}   |S_N| = {abs(s):.6e}")
    print()

    
Run চেপে দেখুন — z=1-এ আংশিক যোগফল N=5-এ 1.9375, N=10-এ 1.998, N=50-এ 1.999999999999998 — অর্থাৎ বদ্ধ-রূপ মান X(1)=2-এর দিকে স্পষ্টভাবে কনভার্জ করছে। কিন্তু z=0.5 (ঠিক সীমানায়)-এ আংশিক যোগফল প্রতিটি পদে ঠিক 1 করে বাড়ে (N=5→5, N=10→10, N=100→100) — কনভার্জ করে না। আর z=0.3-এ পরিস্থিতি আরও নাটকীয়: N=20-এ যোগফল ইতিমধ্যে ≈41025, N=100-এ তা ≈2.3×10²²-এ পৌঁছে যায় — স্পষ্টভাবে ডাইভার্জ করছে।
মূল কথা · Key takeaway

ROC হলো Z-ট্রান্সফর্মের "ব্যবহারযোগ্যতার অঞ্চল" — এর বাইরে সূত্রটি অর্থহীন। একটি সূত্র (যেমন 1/(1-0.5z^-1)) একাধিক ভিন্ন সিগন্যালের Z-ট্রান্সফর্ম হতে পারে, নির্ভর করে ROC কী — তাই L17-এর ইনভার্স Z-ট্রান্সফর্মে ROC উল্লেখ করা অপরিহার্য।

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

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

প্র ০১ ঠিক সীমানায় (z=0.5) আংশিক যোগফল কনভার্জ না করে বরং প্রতি পদে ধ্রুবক হারে বাড়ে কেন?

কারণ z=0.5-এ প্রতিটি পদ (0.5)^n · (0.5)^-n = 1 — অর্থাৎ প্রতিটি পদই ঠিক 1, আর Nটি পদ যোগ করলে যোগফল N। এটি অসীমের দিকে গেলেও এটি "ডাইভার্জ" শব্দের একটি বিশেষ রূপ (লিনিয়ারলি বৃদ্ধি) — সীমানায় সাধারণত সিরিজ কনভার্জ করে না, এটাই স্বাভাবিক আচরণ।

প্র ০২ যদি সিগন্যাল x[n] = 0.5^n-এর বদলে x[n] = 0.9^n হতো, ROC কেমন হতো?

একই যুক্তিতে $r = 0.9/z$, কনভারজেন্সের শর্ত $|0.9/z| < 1$ অর্থাৎ $|z| > 0.9$। অর্থাৎ ROC-এর ব্যাসার্ধ মূল সিগন্যালের ক্ষয়-হারের (এখানে 0.9) সমান — সাধারণ প্যাটার্ন: x[n]=a^n u[n]-এর ROC সবসময় |z| > |a|।

প্র ০৩ উপরের ডেমোতে z=0.3-এ আংশিক যোগফল N=100-এ প্রায় 2.3×10²²-এ পৌঁছায়। বাস্তব কম্পিউটেশনে এত বড় সংখ্যার সাথে কাজ করা কেন সমস্যাজনক হতে পারে?

এত বড় সংখ্যা ফ্লোটিং-পয়েন্ট প্রিসিশনের সীমা ছুঁয়ে ফেলতে পারে, এবং যদি সিরিজ আরও বেশি পদ পর্যন্ত চালানো হয়, তা OverflowError-এর দিকেও যেতে পারে। এটি ঠিক M3/L13-এর অস্থিতিশীল (unstable) সিস্টেমের আউটপুট বাড়ার মতোই আচরণ — ROC-এর বাইরে গণনা করলে সংখ্যাগতভাবে "বিস্ফোরিত" ফলাফল আসে, তাই বাস্তব কোডে সবসময় গণনার আগে ROC নিশ্চিত করা জরুরি।

অনুশীলন

  1. চিন্তা করুন: যদি টেস্ট পয়েন্ট z = 5+0j ব্যবহার করা হয় (যা |z|=5 > 0.5, ROC-এর ভেতরে), বদ্ধ-রূপ X(5)-এর মান কত হবে বলে আপনার ধারণা? সূত্র X(z) = 1/(1-0.5z^-1) দিয়ে হাতে হিসেব করুন।

    $X(5) = 1/(1 - 0.5/5) = 1/(1-0.1) = 1/0.9 ≈ 1.1111$। যেহেতু z বড়, 0.5/z ছোট, তাই ফলাফল 1-এর কাছাকাছি হবে বলে প্রত্যাশা করা যায়।

  2. পরীক্ষা করুন: উপরের কোড সেলে test_zs তালিকায় 5+0j যোগ করে Run চেপে আপনার হিসেব যাচাই করুন, এবং N বাড়ার সাথে আংশিক যোগফল কত দ্রুত কনভার্জ করে তা লক্ষ্য করুন।

    রান করলে বদ্ধ-রূপ X(5) ≈ 1.111111 দেখাবে, এবং যেহেতু |0.5/5| = 0.1 খুব ছোট, আংশিক যোগফল মাত্র N=5 পদেই প্রায় সঠিক মানে পৌঁছে যাবে — z যত বড় (ROC-এর সীমানা থেকে যত দূরে), কনভারজেন্স তত দ্রুত।

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

আগের পাঠ
Z-ট্রান্সফর্মের বৈশিষ্ট্য