日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

共轭梯度法Matlab的实现

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 共轭梯度法Matlab的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 寫在前面
    • 共軛梯度法
    • 代碼實現(xiàn)
      • 標題函數(shù)定義部分
      • 函數(shù)測試
    • 畫圖顯示效果
    • 顯示方法
    • 運行方法

寫在前面

寫這篇博客是為了增加對共軛梯度的理解。最近最優(yōu)化課一直在講共軛梯度,雅克比,梯度下降啊,課上沒聽太懂,就課下花了點時間好好學一下,在此記錄一下。

這篇博客主要介紹了共軛梯度的matlab實現(xiàn),代碼可以運行看到效果。代碼分為2個部分,第一部分代碼是函數(shù)定義,第二部分代碼是測試代碼。

共軛梯度法

我是參考了下面這篇博客,以及B站的一個視頻

共軛梯度法的簡單直觀理解
https://www.bilibili.com/video/BV16a4y1t76z/

如果你了解梯度下降法的話,理解共軛梯度就很容易了。概念性的東西和數(shù)學公式我就不說了,用大白話直接說說吧,有需要數(shù)學公式推導(dǎo)的可以去檢索一下。

首先是初始點,你在初始點想去下一個點該怎么走,可以把它想象成一個人下山,第一步是不是先確定方向,第二步是不是確定走多遠。共軛梯度法就是一直迭代上面2個步驟。
確定方向該怎么確定,最速下降法是直接是梯度的方向,共軛梯度法在初始點時是梯度的方向,接著下一個點就不是梯度的方向了,它要一直更新了。

r0=b-A*x0 %起始點的梯度方向 p0=r0 %方向 新的方向用p1表示 p1=r1-bat*p0 可以把bat就是一個系數(shù)r1= b-A*x1 r1是新的殘差 ,b是已知的, x1是下一個點的位置 x1=x0+alp*p0 x0是初始點的位置現(xiàn)在可以連起來,假設(shè)你站在x0的位置上方向p0,走多遠是alp,到達下一個點x1。 到達下一個點之后從新計算方向,新的方向就是上面的p1,然后已知循環(huán)迭代就行了。 上方的bat和alp系數(shù)我就不介紹了可以直接按照公式來。

代碼實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。