گرادیانِ مزدوج یا CG روشی تکراری برایِ حلِ Ax=b است؛ در قراردادِ این صفحه A حقیقی، متقارن و مثبتمعین است. بهجایِ حرکت با نرخِ ثابت در منفیِ گرادیان، جهتهایِ جستوجو با توجه به A ساخته میشوند. یک دستگاهِ۲×۲ را با کسرهایِ دقیق حل میکنیم و در هر گام جواب، باقیمانده و جهت را نگه میداریم.
مسئلهٔ کوچک و فرضهایِ روشن
A سطرهایِ(۴،۱) و(۱،۳)، b=(۱،۲) و جوابِ آغازین(۰،۰) دارد. تقارن برقرار است؛ خانهٔ نخستِ قطر۴ و دترمینان۱۱ مثبتاند، که برایِ این ماتریسِ حقیقیِ متقارنِ۲×۲ شرطِ مثبتمعینبودن را کنترل میکند. صرفِ دیدنِ انحنایِ مثبت در چند جهت، گواهِ عمومیِ SPD بودنِ ماتریسِ دلخواه نیست.
روشِ بدونِ پیششرطساز را اجرا میکنیم. r=b−Ax و در آغاز p=r است. در هر مرحله α=(rᵀr)÷(pᵀAp)، سپس x تازه=x+αp و r تازه=r−αAp. برایِ ادامه β=(r تازهᵀr تازه)÷(rᵀr) و p تازه=r تازه+βp است. همهٔ این تقسیمها در کد Fraction هستند.
گامِ اول را با دست کنترل کنیم
r₀=p₀=(۱،۲) و Ap₀=(۶،۷) است. پس r₀ᵀr₀=۵، p₀ᵀAp₀=۲۰ و α₀=۱÷۴. جوابِ جدید(۱÷۴،۱÷۲) میشود و باقیمانده(−۱÷۲،۱÷۴) باقی میماند. طولِ مربعِ این باقیمانده۵÷۱۶ است؛ هنوز به جوابِ دقیق نرسیدهایم.
β₀=(۵÷۱۶)÷۵=۱÷۱۶ و جهتِ بعدی p₁=(−۷÷۱۶،۳÷۸) میشود. ضربِ داخلیِ r₀باr₁ صفر است. مهمتر برایِ جهتها، p₀ᵀAp₁ هم صفر میشود؛ این تعامد با معیارِ A همان «مزدوج» بودنِ موردِ اشاره است. آن را تعامدِ معمولِ خودِ دو p ننامید.
گامِ دوم و کنترل با جوابِ مستقیم
Ap₁=(−۱۱÷۸،۱۱÷۱۶) و p₁ᵀAp₁=۵۵÷۶۴ است؛ پس α₁=(۵÷۱۶)÷(۵۵÷۶۴)=۴÷۱۱. بهروزرسانی، x=(۱÷۱۱،۷÷۱۱) میدهد و هر دو مؤلفهٔ r دقیقاً صفر میشوند. حلِ مستقیمِ مستقلِ دو معادله نیز همین دو کسر را برمیگرداند.
| وضعیت | x | r=b−Ax | توقفِ موفق؟ |
|---|---|---|---|
| آغاز | (۰،۰) | (۱،۲) | خیر |
| پس از گامِ۱ | (۱÷۴،۱÷۲) | (−۱÷۲،۱÷۴) | خیر |
| پس از گامِ۲ | (۱÷۱۱،۷÷۱۱) | (۰،۰) | بله، در حسابِ دقیقِ تمرین |
تمامشدنِ بودجهٔ گام، همگرایی نیست
کد را یک بار با سقفِ دو گام و یک بار با سقفِ یک گام اجرا میکنیم. اجرایِ دوم خروجیِ میانی را نگه میدارد، اما converged را false مینویسد. تعدادِ گام، مجوزِ نامیدنِ جواب بهعنوانِ حلِ نهایی نیست. اگر جوابِ آغازین را همان جوابِ مستقیم بدهیم، باقیمانده از ابتدا صفر است و هیچ گامی اجرا نمیشود.
برایِ حسابِ دقیق و فرضهایِ استانداردِ روش، بحثِ پایان در حداکثر n گام مطرح است؛ اینجا همان حالتِ دوبعدی را دیدهایم. در ممیزشناور، تعامد میتواند از بین برود و معیارِ توقف با تلرانس لازم میشود. SciPy در مستنداتِ خودش نرمِ باقیمانده، rtol و atol را جدا تعریف میکند. تابعِ آموزشیِ ما آن رفتارِ تلرانس را پیاده نکرده است.
آزمونِ نامعتبر را پنهان نکنیم
ماتریسِ قطریِ(۱،−۱) در آزمونِ منفی با کنترلِ کاملِ SPDِ۲×۲ رد میشود. برنامه در حلقه نیز pᵀAp غیرمثبت را خطا مینامد؛ آن کنترل جایِ اثباتِ فرضِ ورودی را نمیگیرد. ورودیِ نامتقارن هم در همین قرارداد پذیرفته نیست. این نسخه فقط دو مجهول و دادهٔ کسریِ تعریفشده را پوشش میدهد.
باقیماندهٔ کوچک، با خطایِ جوابِ دادهٔ واقعی یکی نیست؛ حساسیتِ مسئله هم مهم است. عددِ شرط و کرانِ حساسیت را کنارِ گزارشِ residual بخوانید. برایِ مسئلهٔ بزرگ، پیششرطساز و نمایشِ تنک ممکن است مطرح شوند، اما این تمرین سرعت، حافظه یا کیفیتِ آنها را اندازه نگرفته و SciPy را اجرا نکرده است.
فرق با مثالِ گرادیانِ نزولی
راهنمایِ گرادیانِ نزولی بهروزرسانی با نرخِ انتخابشده را نشان میدهد؛ اینجا جهتِ مزدوج، α و β و residualِ دستگاه موضوعاند. برایِ شکلِ عملیات، بردار و ماتریس مکمل است. در پروژهٔ پاسخگویی یا پیگیریِ مشتری، مسئله و خروجیِ قابلِ آزمایش را در راهکارهایِ اپرا بیان کنید؛ حلِ این دستگاه، شاهدِ نتیجهٔ محصول نیست.
فایل تمرین و منبع
دو گامِ دقیق با x و r و p و آلفا و بتا؛ Python · مقایسهٔ پایانِ موفق، سقفِ یک گام و جوابِ مستقیم
- SciPy؛ فرضِ SPD و معیارِ توقفِ مبتنی بر باقیمانده
- منبعِ اصلیِ cg؛ بخشِ تابع و ترتیبِ α، جهت و residual خوانده شد؛ اجرایِ کتابخانه انجام نشده است
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.