গসিয়ান এলিমিনেশন
এই পাঠে যা শিখবেন
- রৈখিক সমীকরণ সিস্টেম
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 বের করা হয়:
এই প্রক্রিয়া প্রতিটি কলামের জন্য পুনরাবৃত্তি করলে ম্যাট্রিক্সটি ধীরে ধীরে একটি upper-triangular
রূপে চলে আসে — মূল ডায়াগোনালের নিচের সবকিছু শূন্য। (L12-এ দেখা যাবে M[k][k] শূন্যের কাছাকাছি
হলে কী সমস্যা হয়, এবং কেন পিভোটিং প্রয়োজন।)
কোডে
A ও b-কে একসাথে একটি "augmented" ম্যাট্রিক্সে জুড়ে নেওয়া হয় — প্রতিটি সারির শেষে b-এর মান যোগ হয়, যাতে একই এলিমিনেশন অপারেশন উভয় পাশে প্রয়োগ হয়।একবার ম্যাট্রিক্স upper-triangular হয়ে গেলে, শেষ সারি থেকে শুরু করে উপরের দিকে একে একে প্রতিটি অজানা রাশি সরাসরি গণনা করা যায় — কোনো আরও এলিমিনেশনের প্রয়োজন নেই।
গসিয়ান এলিমিনেশনের খরচ
O(n³) — n×n সিস্টেমের জন্য প্রায় n³/3 arithmetic অপারেশন লাগে (L15-এ বিস্তারিত গণনা)।৩ · একটি সত্যিকারের ডেমো — 4x4 সিস্টেম সমাধান
নিচে একটি 4x4 সিস্টেম Ax = b হাতে-লেখা গসিয়ান এলিমিনেশন দিয়ে সমাধান করা হয়েছে, এবং তারপর
পাওয়া x মূল সমীকরণে ফিরে বসিয়ে প্রতিটি সমীকরণের অবশিষ্টাংশ (residual)
— অর্থাৎ Ax - b — গণনা করে দেখানো হয়েছে এটি প্রকৃতপক্ষে কতটা শূন্যের কাছাকাছি।
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
10⁻¹⁵ মাত্রার (কার্যত শূন্য, শুধু floating-point
রাউন্ড-অফের অবশিষ্টাংশ — L02-L03-এ বিস্তারিত)। এটাই গসিয়ান এলিমিনেশনের সঠিকতা যাচাইয়ের সবচেয়ে
নির্ভরযোগ্য উপায়: শুধু x ছাপিয়ে দেওয়া নয়, বরং সেই x মূল সমীকরণে বসিয়ে সত্যিই
কাজ করে কিনা তা প্রমাণ করা।
গসিয়ান এলিমিনেশন হলো রৈখিক সিস্টেম সমাধানের ভিত্তি-অ্যালগরিদম — বাকি 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 চেক তাই শুধু "সমাধান সঠিক কিনা" নয়,
বরং "কোড ও সিস্টেম উভয়ই স্বাস্থ্যকর কিনা" যাচাই করার একটি গুরুত্বপূর্ণ অভ্যাস।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
A-এর প্রথম সারি ও দ্বিতীয় সারি অদলবদল করলে (row swap) — শুধু সারির ক্রম পাল্টে — চূড়ান্ত সমাধানxকি পাল্টাবে বলে আপনার মনে হয়?না — সমীকরণ সিস্টেম
Ax = b-এর সমাধান সারির ক্রমের উপর নির্ভর করে না, কারণ প্রতিটি সারি স্বাধীনভাবে একই সমীকরণ প্রকাশ করে। গসিয়ান এলিমিনেশনের মধ্যবর্তী ধাপের সংখ্যা পাল্টাতে পারে, কিন্তু চূড়ান্তxএকই থাকবে (আসলে, পিভোটিং কৌশল — L12 — ঠিক এই স্বাধীনতা ব্যবহার করেই সারি অদলবদল করে সঠিকতা বাড়ায়)। -
পরীক্ষা করুন: উপরের কোড সেলে
b-এর মান[12.0, 5.0, 8.0, 10.0]থেকে[12.0, 5.0, 8.0, 11.0]-এ পাল্টে Run চাপুন — নতুনxএবং residual দেখুন।b-এর একটি মাত্র মান পরিবর্তনেx-এর সবগুলো উপাদান পাল্টে যায় (কারণ প্রতিটি অজানা রাশি সবগুলো সমীকরণের উপর নির্ভরশীল), তবে residual যাচাই এখনও প্রায় শূন্য দেখাবে — কারণ অ্যালগরিদমটি যেকোনো validb-এর জন্য একইভাবে সঠিকভাবে কাজ করে। এই "সংবেদনশীলতা" —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, এবং আরও অনেক কোর্স।