QR অ্যালগরিদম
এই পাঠে যা শিখবেন
- QR ডিকম্পোজিশন কী (Gram-Schmidt পদ্ধতিতে
A = QR,Qঅর্থোগোনাল ওRআপার-ট্রায়াঙ্গুলার) - QR অ্যালগরিদমের মূল ইটারেশন — কেন
R·Qগুণের ক্রম উল্টানো ধীরে ধীরে ম্যাট্রিক্সকে "আইগেনভ্যালু-প্রকাশক" রূপে নিয়ে যায় - হাতে-কলমে বাস্তবায়ন — Gram-Schmidt QR ও পুনরাবৃত্ত ইটারেশন, প্রকৃত কনভারজেন্স পর্যবেক্ষণ
- এই সরলীকৃত সংস্করণের সীমাবদ্ধতা এবং প্রোডাকশন-গ্রেড সংস্করণ কীভাবে আলাদা তার সংক্ষিপ্ত ধারণা
১ · QR ডিকম্পোজিশন — সংক্ষিপ্ত রিমাইন্ডার
যেকোনো ম্যাট্রিক্স A-কে দুটি ম্যাট্রিক্সের গুণফলে লেখা যায়: A = QR, যেখানে
Q একটি অর্থোগোনাল ম্যাট্রিক্স (এর কলামগুলো একে অপরের সাথে লম্ব এবং প্রতিটির
দৈর্ঘ্য ১) এবং R একটি আপার-ট্রায়াঙ্গুলার ম্যাট্রিক্স। এটি বের করার একটি সহজ,
ক্লাসিক পদ্ধতি হলো Gram-Schmidt প্রক্রিয়া — A-এর কলামগুলোকে একে একে নিয়ে,
আগের অর্থোগোনালাইজড কলামগুলোর দিকে থাকা অংশ বিয়োগ করে, বাকি অংশটুকু নরমালাইজ করে Q-এর পরবর্তী
কলাম তৈরি করা হয় — আর সেই "কতটুকু বিয়োগ হলো ও নরমালাইজ হলো" তথ্যগুলোই R-এর এন্ট্রি।
নিচের বাস্তবায়ন Gram-Schmidt QR ব্যবহার করছে, যা সহজবোধ্য কিন্তু সংখ্যাগতভাবে কম
স্থিতিশীল (বিশেষত বড় বা প্রায়-সিঙ্গুলার ম্যাট্রিক্সে)। প্রোডাকশন-গ্রেড লাইব্রেরি (LAPACK, এবং তার উপর
নির্ভরশীল numpy.linalg.eig) সাধারণত Householder রিফ্লেকশন দিয়ে QR বের করে
এবং কনভারজেন্স ত্বরান্বিত করতে শিফট (L39-এর মতোই) ও ম্যাট্রিক্সকে প্রথমে
Hessenberg ফর্মে রূপান্তর করার মতো কৌশল ব্যবহার করে। এই পাঠের সংস্করণটি
ইলাস্ট্রেটিভ — মূল ধারণাটি সত্যিকারের গণনা দিয়ে দেখানোর জন্য, শিল্প-মানের রুটিন হিসেবে
নয়।
২ · QR অ্যালগরিদমের মূল ইটারেশন
QR অ্যালগরিদমের ধারণাটি প্রায় জাদুর মতো সহজ: A₀ = A দিয়ে শুরু করে, প্রতি ধাপে —
$$A_k = Q_k R_k \qquad\text{(QR ডিকম্পোজ করো)}$$
$$A_{k+1} = R_k Q_k \qquad\text{(গুণের ক্রম উল্টে নতুন ম্যাট্রিক্স বানাও)}$$
লক্ষ্য করুন A_{k+1} = R_k Q_k = Q_k^{-1} (Q_k R_k) Q_k = Q_k^{-1} A_k Q_k — অর্থাৎ
A_{k+1} সবসময় A_k-এর একটি সিমিলারিটি ট্রান্সফর্মেশন
(Q অর্থোগোনাল হওয়ায় Q⁻¹ = Qᵀ)। সিমিলারিটি ট্রান্সফর্মেশন আইগেনভ্যালু পরিবর্তন করে
না — শুধু ম্যাট্রিক্সের "রূপ" বদলায়। কিছু শর্তের অধীনে (যেমন সব আইগেনভ্যালুর ম্যাগনিটিউড ভিন্ন), এই ইটারেশন
বার বার প্রয়োগ করলে ম্যাট্রিক্স একটি আপার-ট্রায়াঙ্গুলার (বা প্রায়-ডায়াগোনাল) রূপে কনভার্জ
করে, যার ডায়াগোনাল এন্ট্রিগুলোই মূল ম্যাট্রিক্সের আইগেনভ্যালু — ম্যাগনিটিউড অনুযায়ী সাজানো।
৩ · হাতে-কলমে বাস্তবায়ন — একই ম্যাট্রিক্সে সত্যিকারের কনভারজেন্স
L38-L39-এর একই ম্যাট্রিক্স ব্যবহার করা হচ্ছে, যাতে ফলাফল সরাসরি তুলনীয় হয় — প্রকৃত আইগেনভ্যালু ইতিমধ্যে
জানা: প্রায় ৫.২১৪৩২, ২.৪৬০৮১, ও ১.৩২৪৮৭ (L38-এ পাওয়ার মেথড দিয়ে,
L39-এ শিফটেড ইনভার্স পাওয়ার মেথড দিয়ে):
$$A_0 = \begin{bmatrix} 4 & 1 & 1 \\ 1 & 3 & 1 \\ 1 & 1 & 2 \end{bmatrix}$$
import math
A = [
[4.0, 1.0, 1.0],
[1.0, 3.0, 1.0],
[1.0, 1.0, 2.0],
]
n = 3
def get_col(M, j):
return [M[i][j] for i in range(len(M))]
def dot(u, v):
return sum(a * b for a, b in zip(u, v))
def norm(v):
return math.sqrt(dot(v, v))
def gram_schmidt_qr(M):
# সরলীকৃত, ইলাস্ট্রেটিভ Gram-Schmidt QR ডিকম্পোজিশন -- হাতে-লেখা, কোনো লাইব্রেরি নেই
n = len(M)
cols = [get_col(M, j) for j in range(n)]
Q_cols = []
R = [[0.0] * n for _ in range(n)]
for j in range(n):
v = cols[j][:]
for i in range(j):
R[i][j] = dot(Q_cols[i], cols[j])
v = [v[k] - R[i][j] * Q_cols[i][k] for k in range(n)]
R[j][j] = norm(v)
Q_cols.append([x / R[j][j] for x in v])
Q = [[Q_cols[j][i] for j in range(n)] for i in range(n)]
return Q, R
def matmul(M1, M2):
rows, mid, cols = len(M1), len(M2), len(M2[0])
result = [[0.0] * cols for _ in range(rows)]
for i in range(rows):
for j in range(cols):
result[i][j] = sum(M1[i][k] * M2[k][j] for k in range(mid))
return result
Ak = [row[:] for row in A]
print(f"শুরুর ডায়াগোনাল: {[round(Ak[i][i], 6) for i in range(n)]}")
print()
for it in range(1, 13):
Q, R = gram_schmidt_qr(Ak)
Ak = matmul(R, Q) # ক্রম উল্টে A_(k+1) = R*Q
diag = [round(Ak[i][i], 6) for i in range(n)]
off_diag_max = max(abs(Ak[i][j]) for i in range(n) for j in range(n) if i != j)
print(f"ইটার {it:2d}: ডায়াগোনাল = {diag} সর্বোচ্চ অফ-ডায়াগোনাল = {off_diag_max:.6f}")
print()
print("চূড়ান্ত ম্যাট্রিক্স:")
for row in Ak:
print([round(x, 6) for x in row])
[৪.৮৩৩৩৩৩, ২.৭৭১১৪৪, ১.৩৯৫৫২২] থেকে শুরু করে
দ্রুত স্থির হচ্ছে — ইটারেশন ৬-এ [৫.২১৪০৮৫, ২.৪৬০৯৯৯, ১.৩২৪৯১৬], আর ইটারেশন ১২-এ
[৫.২১৪৩২, ২.৪৬০৮১১, ১.৩২৪৮৬৯] — একই সাথে সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি ০.৮৯২৬৬৪
থেকে কমে ০.০০০২৮১-এ নেমে এসেছে (ইটারেশন ১২ শেষে চূড়ান্ত ম্যাট্রিক্স প্রায় ডায়াগোনাল)। এই
তিনটি ডায়াগোনাল মান ঠিক L38-এর পাওয়ার মেথড ও L39-এর শিফটেড ইনভার্স পাওয়ার মেথডে পাওয়া
তিনটি আইগেনভ্যালুর সাথে মিলে যায় — তিনটি ভিন্ন অ্যালগরিদম, একই প্রকৃত উত্তরে পৌঁছেছে, যা এই মেথডগুলোর
সঠিকতার একটি শক্তিশালী ক্রস-চেক।
৪ · কেন এটি একবারে সবগুলো আইগেনভ্যালু দেয়
পাওয়ার মেথড শুধু একটি আইগেন-দিকের "প্রাধান্য" ব্যবহার করে — কিন্তু QR অ্যালগরিদম প্রতি ধাপে পুরো
স্পেস-এর একটি অর্থোগোনাল বেসিসকে পুনর্গঠন করে, যেখানে প্রতিটি কলাম একসাথে তার নিজস্ব আইগেন-দিকের
দিকে ঘুরতে থাকে — অনেকটা যেন nটি পাওয়ার মেথড একসাথে, সমান্তরালে চলছে, কিন্তু প্রতি ধাপে
Gram-Schmidt দিয়ে একে অপরের সাথে অর্থোগোনাল রাখা হচ্ছে যাতে সবাই একই ডমিন্যান্ট দিকে "ধসে" না পড়ে। এই কারণেই
উপরের আউটপুটে ডায়াগোনালের তিনটি মান একসাথে নিজ নিজ প্রকৃত আইগেনভ্যালুর দিকে কনভার্জ করছে,
এবং অফ-ডায়াগোনাল এন্ট্রি ধীরে ধীরে শূন্যের দিকে যাচ্ছে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
A_{k+1} = R_k Q_k কেন A_k-এর সাথে সবসময় একই আইগেনভ্যালু রাখে — গুণের
ক্রম উল্টালে ম্যাট্রিক্স তো সম্পূর্ণ বদলে যায়, তাই না?
ম্যাট্রিক্সের এন্ট্রিগুলো বদলায়, কিন্তু সিমিলারিটি ট্রান্সফর্মেশন (A_{k+1} =
Q_k^{-1} A_k Q_k) আইগেনভ্যালু সংরক্ষণ করে — এটি একটি প্রমাণিত বীজগাণিতিক বৈশিষ্ট্য, কারণ যদি
Av = λv হয়, তাহলে (Q⁻¹AQ)(Q⁻¹v) = Q⁻¹Av = λ(Q⁻¹v) — অর্থাৎ নতুন ম্যাট্রিক্সের
একটি আইগেনভেক্টর হলো Q⁻¹v, একই আইগেনভ্যালু λ-সহ। শুধু আইগেনভেক্টরের
"স্থানাঙ্ক" বদলাচ্ছে, আইগেনভ্যালু নয়।
প্র ০২
কোড সেলের আউটপুটে অফ-ডায়াগোনাল এন্ট্রিগুলো শূন্যের দিকে যাচ্ছে কিন্তু ঠিক শূন্য হচ্ছে না
(ইটারেশন ১২-এও ০.০০০২৮১)। এটি কি একটি বাগ?
না — এটি প্রত্যাশিত। QR অ্যালগরিদম একটি ইটারেটিভ, কনভার্জিং পদ্ধতি (বাইসেকশনের মতো, L01/M2), কোনো সসীম-ধাপের সঠিক সমাধান নয়। যত বেশি ইটারেশন চালানো হবে, অফ-ডায়াগোনাল এন্ট্রি তত ছোট হতে থাকবে, তাত্ত্বিকভাবে কখনো ঠিক শূন্যে না পৌঁছালেও ব্যবহারিক নির্ভুলতার জন্য যথেষ্ট ছোট হয়ে যায় (এটিই M1/L04-এর কনভারজেন্স ধারণার সরাসরি প্রয়োগ)।
প্র ০৩ এই পাঠের সরলীকৃত Gram-Schmidt QR সংস্করণ ও প্রোডাকশন-গ্রেড লাইব্রেরির (LAPACK-ভিত্তিক) সংস্করণের মধ্যে মূল পার্থক্য কী, এবং কেন সেই পার্থক্য গুরুত্বপূর্ণ?
প্রোডাকশন-গ্রেড সংস্করণ Householder রিফ্লেকশন ব্যবহার করে (সংখ্যাগতভাবে বেশি স্থিতিশীল), ম্যাট্রিক্সকে প্রথমে Hessenberg ফর্মে রূপান্তর করে (প্রতি ইটারেশন অনেক সস্তা করতে), এবং শিফট প্রয়োগ করে (L39-এর মতো, কনভারজেন্স বহুগুণ ত্বরান্বিত করতে)। ছোট, সুবোধ ম্যাট্রিক্সে (যেমন এই পাঠের ৩×৩ উদাহরণ) সরল Gram-Schmidt সংস্করণও ভালো কাজ করে, কিন্তু বড়, প্রায়-সিঙ্গুলার বা কাছাকাছি আইগেনভ্যালুওয়ালা ম্যাট্রিক্সে সরল সংস্করণ ধীর বা সংখ্যাগতভাবে অস্থিতিশীল হতে পারে — তাই বাস্তব ইঞ্জিনিয়ারিং সফটওয়্যার সবসময় পরীক্ষিত লাইব্রেরি ব্যবহার করে।
অনুশীলন
-
চিন্তা করুন: ইটারেশন ৬-এ সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি
০.০২৫৪২৫, এবং ইটারেশন ৭-এ তা কমে০.০১২০০০— প্রায় অর্ধেক। এই প্যাটার্ন অনুযায়ী ইটারেশন ৮-এ সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি মোটামুটি কত হবে বলে আপনার ধারণা?০.০১২০০০ / ২ ≈ ০.০০৬— আর কোড সেলের প্রকৃত আউটপুটে ইটারেশন ৮-এর সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি হলো ০.০০৫৬৬৪, যা এই আনুমানের সাথে খুব কাছাকাছি। এই ধারাবাহিক অর্ধেক-হওয়া প্যাটার্নটি এখানে|λ₂/λ₁|ও|λ₃/λ₂|অনুপাতগুলোর সাথে সম্পর্কিত, ঠিক L38-এর পাওয়ার মেথডের কনভারজেন্স রেটের মতোই। -
পরীক্ষা করুন: কোড সেলে
range(1, 13)-কেrange(1, 21)-এ বদলে (২০ ইটারেশন পর্যন্ত চালিয়ে) Run চাপুন। সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি কতটা আরও ছোট হয় দেখুন।ইটারেশন ২০-এ সর্বোচ্চ অফ-ডায়াগোনাল এন্ট্রি আরও কয়েকগুণ ছোট হয়ে যাবে (প্রতি ধাপে মোটামুটি একই অনুপাতে কমতে থাকে), আর ডায়াগোনাল মান ইতিমধ্যেই
[৫.২১৪৩২, ২.৪৬০৮১১, ১.৩২৪৮৬৯]-এ প্রায় নিখুঁতভাবে স্থির — অর্থাৎ ১২ ইটারেশনের পরেই ব্যবহারিক নির্ভুলতার জন্য যথেষ্ট কনভার্জ করে গিয়েছিল।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- প্রয়োগ — ভাইব্রেশন, স্ট্যাবিলিটি ও PCA-এর সংযোগ পরবর্তী পাঠ আইগেনভ্যালু মেথড বাস্তবে কোথায় ব্যবহৃত হয় — ভাইব্রেশন মোড, স্ট্যাবিলিটি বিশ্লেষণ ও PCA।
- সিঙ্গুলার ভ্যালু ডিকম্পোজিশন (SVD) M10 QR ও পাওয়ার মেথডের ধারণাগুলো পরে SVD-এর একটি সরলীকৃত সংস্করণ তৈরি করতে পুনর্ব্যবহৃত হবে।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ এরর অ্যানালাইসিস, রুট-ফাইন্ডিং, লিনিয়ার সিস্টেম, ইন্টারপোলেশন, নিউমেরিক্যাল ইন্টিগ্রেশন, ODE সলভিং, আইগেনভ্যালু মেথড, অপ্টিমাইজেশন ও ক্যাপস্টোন — সবগুলো পাঠ।