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