পাঠ ১০ · ৫৭-এর মধ্যে · মডিউল ৩
Home / Courses / Numerical Methods / গসিয়ান এলিমিনেশন

গসিয়ান এলিমিনেশন

Gaussian elimination
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • রৈখিক সমীকরণ সিস্টেম Ax = b ম্যাট্রিক্স আকারে কীভাবে লেখা হয়
  • ফরোয়ার্ড এলিমিনেশন কীভাবে একটি ম্যাট্রিক্সকে upper-triangular রূপে রূপান্তর করে
  • ব্যাক-সাবস্টিটিউশন কীভাবে সেই triangular সিস্টেম থেকে প্রকৃত সমাধান বের করে
  • একটি সত্যিকারের, চলমান Python ডেমো — হাতে-লেখা গসিয়ান এলিমিনেশন দিয়ে 4x4 সিস্টেম সমাধান, এবং residual দিয়ে সমাধান যাচাই

১ · রৈখিক সমীকরণ সিস্টেম ও ম্যাট্রিক্স রূপ

বহু বাস্তব-বিশ্বের সমস্যা — বৈদ্যুতিক সার্কিট বিশ্লেষণ, স্ট্রাকচারাল ইঞ্জিনিয়ারিং, ইকোনমিক মডেলিং, কম্পিউটার গ্রাফিক্স — শেষ পর্যন্ত এক গুচ্ছ রৈখিক সমীকরণএমন সমীকরণ যেখানে প্রতিটি অজানা রাশি (variable) শুধু ধ্রুবক দিয়ে গুণিত অবস্থায় থাকে — কোনো বর্গ, ঘাত, বা গুণফল আকারে নয়। সমাধানে পরিণত হয়। যেমন:

$$3x_1 + 2x_2 - x_3 + 4x_4 = 12$$ $$2x_1 + 3x_2 + 3x_3 - 2x_4 = 5$$

এই ধরনের সিস্টেমকে সংক্ষেপে ম্যাট্রিক্স-ভেক্টর আকারে লেখা হয় Ax = b, যেখানে A হলো সহগ (coefficient) ম্যাট্রিক্স, x অজানা রাশিগুলোর ভেক্টর, এবং b ডান-পক্ষের মানগুলোর ভেক্টর। এই কোর্সে (এবং Pyodide স্যান্ডবক্সে) আমরা A-কে একটি Python list of listস হিসেবে উপস্থাপন করি — NumPy ব্যবহার করা হয় না, প্রতিটি অপারেশন হাতে-লেখা। ../math-for-ai/index.html কোর্স ম্যাট্রিক্স ও ভেক্টর কী তা গাণিতিক অবজেক্ট হিসেবে ব্যাখ্যা করে — এখানে আমরা সেগুলো কম্পিউটারে বাস্তবে কীভাবে গণনা করা হয় তা দেখাই।

২ · ফরোয়ার্ড এলিমিনেশন — Upper-Triangular রূপে রূপান্তর

গসিয়ান এলিমিনেশনের মূল ধারণা হলো এক সারি থেকে অন্য সারির উপযুক্ত গুণিতক বিয়োগ করে ধীরে ধীরে প্রতিটি কলামের নিচের অংশ শূন্য করে ফেলা। যদি k-তম ধাপে M[k][k] হলো পিভোট (pivot), তাহলে প্রতিটি নিচের সারি i-এর জন্য একটি factor বের করা হয়:

$$\text{factor} = \frac{M[i][k]}{M[k][k]}, \qquad \text{সারি}_i \leftarrow \text{সারি}_i - \text{factor} \times \text{সারি}_k$$

এই প্রক্রিয়া প্রতিটি কলামের জন্য পুনরাবৃত্তি করলে ম্যাট্রিক্সটি ধীরে ধীরে একটি upper-triangular রূপে চলে আসে — মূল ডায়াগোনালের নিচের সবকিছু শূন্য। (L12-এ দেখা যাবে M[k][k] শূন্যের কাছাকাছি হলে কী সমস্যা হয়, এবং কেন পিভোটিং প্রয়োজন।)

Augmented ম্যাট্রিক্স
কোডে A ও b-কে একসাথে একটি "augmented" ম্যাট্রিক্সে জুড়ে নেওয়া হয় — প্রতিটি সারির শেষে b-এর মান যোগ হয়, যাতে একই এলিমিনেশন অপারেশন উভয় পাশে প্রয়োগ হয়।
ব্যাক-সাবস্টিটিউশন
একবার ম্যাট্রিক্স upper-triangular হয়ে গেলে, শেষ সারি থেকে শুরু করে উপরের দিকে একে একে প্রতিটি অজানা রাশি সরাসরি গণনা করা যায় — কোনো আরও এলিমিনেশনের প্রয়োজন নেই।
কমপ্লেক্সিটি
গসিয়ান এলিমিনেশনের খরচ O(n³) — n×n সিস্টেমের জন্য প্রায় n³/3 arithmetic অপারেশন লাগে (L15-এ বিস্তারিত গণনা)।

৩ · একটি সত্যিকারের ডেমো — 4x4 সিস্টেম সমাধান

নিচে একটি 4x4 সিস্টেম Ax = b হাতে-লেখা গসিয়ান এলিমিনেশন দিয়ে সমাধান করা হয়েছে, এবং তারপর পাওয়া x মূল সমীকরণে ফিরে বসিয়ে প্রতিটি সমীকরণের অবশিষ্টাংশ (residual) — অর্থাৎ Ax - b — গণনা করে দেখানো হয়েছে এটি প্রকৃতপক্ষে কতটা শূন্যের কাছাকাছি।

Python
def gaussian_eliminate_and_solve(A, b):
    n = len(A)
    # augmented ম্যাট্রিক্স তৈরি (caller-এর A, b অপরিবর্তিত থাকে)
    M = [row[:] + [b[i]] for i, row in enumerate(A)]

    # ফরোয়ার্ড এলিমিনেশন
    for k in range(n - 1):
        for i in range(k + 1, n):
            factor = M[i][k] / M[k][k]
            for j in range(k, n + 1):
                M[i][j] -= factor * M[k][j]

    # ব্যাক-সাবস্টিটিউশন
    x = [0.0] * n
    for i in range(n - 1, -1, -1):
        s = M[i][n]
        for j in range(i + 1, n):
            s -= M[i][j] * x[j]
        x[i] = s / M[i][i]
    return x, M

A = [
    [3.0,  2.0, -1.0,  4.0],
    [2.0,  3.0,  3.0, -2.0],
    [1.0, -1.0,  4.0,  1.0],
    [4.0,  2.0, -1.0,  3.0],
]
b = [12.0, 5.0, 8.0, 10.0]

x, M = gaussian_eliminate_and_solve(A, b)
print("সমাধান x =", [round(v, 6) for v in x])

print()
print("যাচাই -- মূল সমীকরণে বসিয়ে অবশিষ্টাংশ (residual) দেখা:")
for i in range(len(A)):
    lhs = sum(A[i][j] * x[j] for j in range(len(A)))
    residual = lhs - b[i]
    print(f"সমীকরণ {i+1}: গণনাকৃত LHS = {lhs:.10f}   b = {b[i]:.6f}   residual = {residual:.2e}")
সমাধান x = [0.414634, 1.365854, 1.634146, 2.414634]

যাচাই -- মূল সমীকরণে বসিয়ে অবশিষ্টাংশ (residual) দেখা:
সমীকরণ 1: গণনাকৃত LHS = 12.0000000000   b = 12.000000   residual = 0.00e+00
সমীকরণ 2: গণনাকৃত LHS = 5.0000000000   b = 5.000000   residual = -2.66e-15
সমীকরণ 3: গণনাকৃত LHS = 8.0000000000   b = 8.000000   residual = -8.88e-16
সমীকরণ 4: গণনাকৃত LHS = 10.0000000000   b = 10.000000   residual = 0.00e+00
লক্ষ্য করুন — চারটি সমীকরণেই residual 10⁻¹⁵ মাত্রার (কার্যত শূন্য, শুধু floating-point রাউন্ড-অফের অবশিষ্টাংশ — L02-L03-এ বিস্তারিত)। এটাই গসিয়ান এলিমিনেশনের সঠিকতা যাচাইয়ের সবচেয়ে নির্ভরযোগ্য উপায়: শুধু x ছাপিয়ে দেওয়া নয়, বরং সেই x মূল সমীকরণে বসিয়ে সত্যিই কাজ করে কিনা তা প্রমাণ করা।
মূল কথা · Key takeaway

গসিয়ান এলিমিনেশন হলো রৈখিক সিস্টেম সমাধানের ভিত্তি-অ্যালগরিদম — বাকি M3-এর প্রায় সব মেথড এরই পরিবর্তিত বা অপ্টিমাইজড সংস্করণ। L11-এ আমরা দেখব কীভাবে একই এলিমিনেশন প্রক্রিয়া থেকে L ও U ফ্যাক্টর আলাদা করে রাখা যায় (LU ডিকম্পোজিশন), যাতে ভিন্ন b-এর জন্য বারবার পুরো এলিমিনেশন না করতে হয়।

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

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

প্র ০১ কোড সেলে factor = M[i][k] / M[k][k] লাইনটি কী করছে, এবং M[k][k] শূন্য হলে কী সমস্যা হবে?

এই factor নির্ধারণ করে সারি i-এর কলাম k-কে শূন্য করতে সারি k-এর কতটুকু বিয়োগ করতে হবে। যদি M[k][k] (পিভোট) শূন্য হয়, তাহলে ZeroDivisionError ঘটবে — এবং যদি এটি শূন্যের খুব কাছাকাছি হয় (শূন্য না হলেও), তাহলে factor অত্যন্ত বড় হয়ে যাবে, যা numerical instability সৃষ্টি করে। এটাই L12-এর মূল বিষয় — পিভোটিং দিয়ে এই সমস্যা এড়ানো।

প্র ০২ ব্যাক-সাবস্টিটিউশন কেন শেষ সারি (i = n-1) থেকে শুরু হয়, প্রথম সারি থেকে নয়?

ফরোয়ার্ড এলিমিনেশনের পর ম্যাট্রিক্সটি upper-triangular — অর্থাৎ শেষ সারিতে শুধু একটি অজানা রাশি (x[n-1]) অবশিষ্ট থাকে, তাই সেটি সরাসরি গণনা করা যায়। এরপর দ্বিতীয়-শেষ সারিতে দুটি অজানা রাশি থাকে, কিন্তু একটি (x[n-1]) ইতিমধ্যে জানা — তাই সেটি বসিয়ে বাকিটা বের করা যায়। এভাবে নিচ থেকে উপরে একে একে সব অজানা রাশি বের হয়ে আসে।

প্র ০৩ residual চেক করার পরও যদি একটি সমীকরণের residual 10⁻³ মাত্রার (যেমন ০.০০১) হতো — এর মানে কী হতে পারত?

10⁻³ মাত্রার residual floating-point রাউন্ড-অফের চেয়ে অনেক বড় — এটি ইঙ্গিত দিত হয় কোডে একটি প্রকৃত বাগ আছে (যেমন ইনডেক্সিং ভুল), অথবা সিস্টেমটি ill-conditioned (L14-এ বিস্তারিত) এবং ছোট numerical error বড় আকারে প্রসারিত হচ্ছে। এই ধরনের residual চেক তাই শুধু "সমাধান সঠিক কিনা" নয়, বরং "কোড ও সিস্টেম উভয়ই স্বাস্থ্যকর কিনা" যাচাই করার একটি গুরুত্বপূর্ণ অভ্যাস।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে A-এর প্রথম সারি ও দ্বিতীয় সারি অদলবদল করলে (row swap) — শুধু সারির ক্রম পাল্টে — চূড়ান্ত সমাধান x কি পাল্টাবে বলে আপনার মনে হয়?

    না — সমীকরণ সিস্টেম Ax = b-এর সমাধান সারির ক্রমের উপর নির্ভর করে না, কারণ প্রতিটি সারি স্বাধীনভাবে একই সমীকরণ প্রকাশ করে। গসিয়ান এলিমিনেশনের মধ্যবর্তী ধাপের সংখ্যা পাল্টাতে পারে, কিন্তু চূড়ান্ত x একই থাকবে (আসলে, পিভোটিং কৌশল — L12 — ঠিক এই স্বাধীনতা ব্যবহার করেই সারি অদলবদল করে সঠিকতা বাড়ায়)।

  2. পরীক্ষা করুন: উপরের কোড সেলে b-এর মান [12.0, 5.0, 8.0, 10.0] থেকে [12.0, 5.0, 8.0, 11.0]-এ পাল্টে Run চাপুন — নতুন x এবং residual দেখুন।

    b-এর একটি মাত্র মান পরিবর্তনে x-এর সবগুলো উপাদান পাল্টে যায় (কারণ প্রতিটি অজানা রাশি সবগুলো সমীকরণের উপর নির্ভরশীল), তবে residual যাচাই এখনও প্রায় শূন্য দেখাবে — কারণ অ্যালগরিদমটি যেকোনো valid b-এর জন্য একইভাবে সঠিকভাবে কাজ করে। এই "সংবেদনশীলতা" — b-এর ছোট পরিবর্তনে x কতটা পাল্টায় — L14-এর কন্ডিশন নাম্বারের মূল বিষয়।

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

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ এরর অ্যানালাইসিস, রুট-ফাইন্ডিং, লিনিয়ার সিস্টেম, ইন্টারপোলেশন, নিউমেরিক্যাল ইন্টিগ্রেশন, ODE সলভিং, আইগেনভ্যালু মেথড, অপ্টিমাইজেশন ও ক্যাপস্টোন।
  • Math for AI & ML কোর্স সহোদর কোর্স ম্যাট্রিক্স ও ভেক্টর কী তা গাণিতিক অবজেক্ট হিসেবে ব্যাখ্যা করে — এই কোর্স সেই ভিত্তির উপর কম্পিউটেশনাল দিকটি যোগ করে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স।
আগের পাঠ
কনভারজেন্স রেট ও সঠিক রুট-ফাইন্ডিং মেথড বাছাই