盲人下山法:
在山頂上,小盲人拿著小拐棍,先確定方向,再確定步長,尋找下山的最優辦法(即最短路徑)。
上圖偽碼來自某 《數值線性代數》 教科書,非原創
下述**是原創
最速下降法
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維的二次函式來作為驗證函式...