共轭梯度法Matlab的实现
文章目錄
- 寫在前面
- 共軛梯度法
- 代碼實現(xiàn)
- 標題函數(shù)定義部分
- 函數(shù)測試
- 畫圖顯示效果
- 顯示方法
- 運行方法
寫在前面
寫這篇博客是為了增加對共軛梯度的理解。最近最優(yōu)化課一直在講共軛梯度,雅克比,梯度下降啊,課上沒聽太懂,就課下花了點時間好好學一下,在此記錄一下。
這篇博客主要介紹了共軛梯度的matlab實現(xiàn),代碼可以運行看到效果。代碼分為2個部分,第一部分代碼是函數(shù)定義,第二部分代碼是測試代碼。
共軛梯度法
我是參考了下面這篇博客,以及B站的一個視頻
共軛梯度法的簡單直觀理解
https://www.bilibili.com/video/BV16a4y1t76z/
如果你了解梯度下降法的話,理解共軛梯度就很容易了。概念性的東西和數(shù)學公式我就不說了,用大白話直接說說吧,有需要數(shù)學公式推導(dǎo)的可以去檢索一下。
首先是初始點,你在初始點想去下一個點該怎么走,可以把它想象成一個人下山,第一步是不是先確定方向,第二步是不是確定走多遠。共軛梯度法就是一直迭代上面2個步驟。
確定方向該怎么確定,最速下降法是直接是梯度的方向,共軛梯度法在初始點時是梯度的方向,接著下一個點就不是梯度的方向了,它要一直更新了。
代碼實現(xiàn)
標題函數(shù)定義部分
function[x,obj]=cg_solver(A,b,x0,epsilon,max_iter) x=x0; %初始點 i=0; r=b-A*x; % 計算殘差 d=r; %方向 delta_new=r'*r; %殘差的內(nèi)積 delta0=delta_new; obj=0.5*x'*A*x-b'*x; %目標函數(shù) while(i<max_iter)&&(delta_new/delta0>epsilon^2)q=A*d;alpha=delta_new/(d'*q); %計算系數(shù) alphax=x+alpha*d; %迭代一步(向下走一步)obj=[obj,0.5*x'*A*x-b'*x];r=b-A*x; % 更新計算殘差delta_old=delta_new;delta_new=r'*r; %更新殘差的內(nèi)積beta=delta_new/delta_old; %更新下一步方向的系數(shù)d=r+beta*d; %更新下一步的方向i=i+1; end end函數(shù)測試
% Ax=bx_true=ones(1000,1);%x_true是向量 A=diag(1:1000); %矩陣對角元素的提取和創(chuàng)建對角陣 b=A*x_true; x0=zeros(1000,1); %x0是向量 [x,obj]=cg_solver(A,b,x0,1e-8,1000);畫圖顯示效果
顯示方法
步驟1
右鍵點擊obj,選擇plot(obj),就會出現(xiàn)上面的效果圖
運行方法
一個是函數(shù)定義部分也就是你實現(xiàn)共軛梯度法,下圖中的文件2,文件1是測試文件。點擊文件1運行,然后最右邊回顯示工作區(qū),按顯示方法進行操作顯示。
總結(jié)
以上是生活随笔為你收集整理的共轭梯度法Matlab的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: miui12 android系统耗电,m
- 下一篇: C语言:大小字母转换(ASCII码)