Matlab實現 最速下降法 共軛梯度法

2021-09-25 03:11:45 字數 1316 閱讀 7770

盲人下山法:

在山頂上,小盲人拿著小拐棍,先確定方向,再確定步長,尋找下山的最優辦法(即最短路徑)。

上圖偽碼來自某 《數值線性代數》 教科書,非原創

下述**是原創

最速下降法

function [er,k]=fastdown(a)

%定義最速下降法函式檔案

%er:表示停機時實際絕對誤差

%k:表示停機時實際迭代次數

tol=1e-6;

[n,m]=size(a);

if n~=m %判斷輸入的合法性

error('wrong input!');

endb=ones(n,1);

x=zeros(n,1);%初始化列向量

r=b-a*x;k=0;

while norm(r,2)>tol

k=k+1;

a=(r'*r)/(r'*a*r);

x=x+a*r;%下降方向取殘量方向

r=b-a*x;

ender=norm(b-a*x,2);

共軛梯度法
function [er,k]=congra(a)

%共軛梯度法求解正定線性方程組

%er:表示停機時實際的絕對誤差

%k:表示停機時實際的迭代次數

tol=1e-6;%規定停機絕對誤差限

[n,m]=size(a);

if n~=m %判斷輸入的合法性

error('wrong input');

endx=zeros(n,1); %初始化解向量

b=ones(n,1);

r=b-a*x;%當前殘量

k=0;%記錄迭代次數

while norm(r,2)>tol

k=k+1;

if k==1

p=r;%第一步即最速下降法,取殘量方向

else

q=(r'*r)/(rq'*rq);

p=r+q*p;

enda=(r'*r)/(p'*a*p);

x=x+a*p;

rq=r;

r=r-a*a*p;

ender=norm(a*x-b,2);

比較&總結:從兩種計算方法的結果來看,達到相近的絕對誤差時,最速下降法需要的迭代次數明顯高於共軛梯度法。這體現出相對於最速下降法選取區域性最優下降方向,共軛梯度法中選取全域性最優下降方向使得收斂速度更快。

最速下降法 and 共軛梯度法

註明 程式中呼叫的函式jintuifa.m golddiv.m我在之前的筆記中已貼出 最速下降法 最速下降法求解f 1 2 x1 x1 9 2 x2 x2的最小值,起始點為x0 9 1 演算法根據最優化方法 天津大學出版社 97頁演算法3.2.1編寫 v1.0 author liuxi bit fo...

最小化 最速下降法matlab實現

1 matlab function min x,min f,k steepest destcent f,x0,var,eps 輸入目標函式f,初始點x0,以及自變數var和精度eps 利用newton迭代法計算無約束目標函式極小值 輸出最小值點min x,最小值min f以及迭代次數k。syms a...

Python 共軛梯度法與最速下降法之間的比較

在一般問題的優化中,最速下降法和共軛梯度法都是非常有用的經典方法,但最速下降法往往以 之 字形下降,速度較慢,不能很快的達到最優值,共軛梯度法則優於最速下降法,在前面的某個文章中,我們給出了牛頓法和最速下降法的比較,牛頓法需要初值點在最優點附近,條件較為苛刻。我們選用了64維的二次函式來作為驗證函式...