MATLAB最速下降法,牛頓法和共軛梯度法求解的方法

2022-05-09 08:09:02 字數 3484 閱讀 3680

實驗要求

1、所屬課程名稱:

最優化方法

2、實驗日期:

2023年5月10日~2023年5月15日

3、實驗目的

掌握最速下降法,牛頓法和共軛梯度法的演算法思想,並能上機程式設計實現相應的演算法。

二、實驗要求

用matlab實現最速下降法,牛頓法和共軛梯度法求解例項。

四、實驗原理

最速下降法是以負梯度方向最為下降方向的極小化演算法,相鄰兩次的搜尋方向是互相直交的。牛頓法是利用目標函式在迭代點處的taylor展開式作為模型函式,並利用這個二次模型函式的極小點序列去逼近目標函式的極小點。共軛梯度法它的每乙個搜尋方向是互相共軛的,而這些搜尋方向僅僅是負梯度方向與上一次接待的搜尋方向的組合。

五.執行及結果如下:

最速下降法:

題目:f=(x-2)^2+(y-4)^2

m檔案:

function [r,n]=steel(x0,y0,eps)

syms x;

syms y;

f=(x-2)^2+(y-4)^2;

v=[x,y];

j=jacobian(f,v);

t=[subs(j(1),x,x0),subs(j(2),y,y0)];

temp=sqrt((t(1))^2+(t(2))^2);

x1=x0;y1=y0;

n=0;

syms kk;

while (temp>eps)

d=-t;

f1=x1+kk*d(1);f2=y1+kk*d(2);

ft=[subs(j(1),x,f1),subs(j(2),y,f2)];

fun=sqrt((ft(1))^2+(ft(2))^2);

mini=gold(fun,0,1,0.00001);

x0=x1+mini*d(1);y0=y1+mini*d(2);

t=[subs(j(1),x,x0),subs(j(2),y,y0)];

temp=sqrt((t(1))^2+(t(2))^2);

x1=x0;y1=y0;

n=n+1;

endr=[x0,y0]

呼叫**分割法:

m檔案:

function mini=gold(f,a0,b0,eps)

syms x;format long;

syms kk;

u=a0+0.382*(b0-a0);

v=a0+0.618*(b0-a0);

k=0;

a=a0;b=b0;

array(k+1,1)=a;array(k+1,2)=b;

while((b-a)/(b0-a0)>=eps)

fu=subs(f,kk,u);

fv=subs(f,kk,v);

if(fu<=fv)

b=v;

v=u;

u=a+0.382*(b-a);

k=k+1;

elseif(fu>fv)

a=u;

u=v;

v=a+0.618*(b-a);

k=k+1;

endarray(k+1,1)=a;array(k+1,2)=b;

endmini=(a+b)/2;

輸入:[r,n]=steel(0,1,0.0001)

r = 1.99999413667642 3.99999120501463

r = 1.99999413667642 3.99999120501463

n = 1

牛頓法:

題目:f=(x-2)^2+(y-4)^2

m檔案:

syms x1 x2;

f=(x1-2)^2+(x2-4)^2;

v=[x1,x2];

df=jacobian(f,v);

df=df.';

g=jacobian(df,v);

epson=1e-12;x0=[0,0]';g1=subs(df,,);g1=subs(g,,);k=0;mul_count=0;sum_count=0;

mul_count=mul_count+12;sum_count=sum_count+6;

while(norm(g1)>epson)

p=-g1\g1;

x0=x0+p;

g1=subs(df,,);

g1=subs(g,,);

k=k+1;

mul_count=mul_count+16;sum_count=sum_count+11;

end;

k x0

mul_count

sum_count

共軛梯度法:

題目:f=(x-2)^2+(y-4)^2

m檔案:

function f=conjugate_grad_2d(x0,t)

x=x0;

syms xi yi a

f=(xi-2)^2+(yi-4)^2;

fx=diff(f,xi);

fy=diff(f,yi);

fx=subs(fx,,x0);

fy=subs(fy,,x0);

fi=[fx,fy];

count=0;

while double(sqrt(fx^2+fy^2))>t

s=-fi;

if count<=0

s=-fi;

else

s=s1;

endx=x+a*s;

f=subs(f,,x);

f1=diff(f);

f1=solve(f1);

if f1~=0

ai=double(f1);

else

break

x,f=subs(f,,x),count

endx=subs(x,a,ai);

f=xi-xi^2+2*xi*yi+yi^2;

fxi=diff(f,xi);

fyi=diff(f,yi);

fxi=subs(fxi,,x);

fyi=subs(fyi,,x);

fii=[fxi,fyi];

d=(fxi^2+fyi^2)/(fx^2+fy^2);

s1=-fii+d*s;

count=count+1;

fx=fxi;

fy=fyi;

endx,f=subs(f,,x),count

輸入:conjugate_grad_2d([0,0],0.0001)

結果:x = 0.24998825499785 -0.24999998741273

f = 0.12499999986176

count = 10

ans = 0.12499999986176

6、結論如下:

最速下降法越接近極小值,步長越小,前進越慢。牛頓法要求二階導數,計算量很大。共軛梯度法是介於最速下降和牛頓法之間的演算法,克服了最速下降法的收斂速度慢的缺點,又避免了牛頓法的大計算量。

使用精確搜尋演算法確定步長的最速下降法

數學與計算科學學院 實驗報告 實驗專案名稱使用精確搜尋演算法確定步長的最速下降法 所屬課程名稱最優化方法 實驗型別演算法程式設計 實驗日期 201 班級學號 姓名成績 附錄1 源程式 附錄2 實驗報告填寫說明 1 實驗專案名稱 要求與實驗教學大綱一致.2 實驗目的 目的要明確,要抓住重點,符合實驗教...

成績下降反思

篇一 中學生成績下降檢討書 中學生成績下降檢討書 這次我懷著萬分的抱歉給你寫下了這份檢討書。因為期末考試我考的很不理想,和半期比起,下降了百位之多,讓我非常的驚訝,所以我在這份檢討書中說明了成績靠差了的原因。我首先從英語說起,在英語課上,我經常走神,而且還在你的不注意時偷偷做小動作或和同學說悄悄話,...

職業自測 選擇和你最速配的工作

曬曬自己最適合什麼工作,5分鐘職業自測 天說冷就冷,滿街的落葉,讓人有些許憂傷啊!閒來沒事,在一些職業社交 轉轉,找點好玩的和大家分享一下。今天給大家推薦個小測評,五分鐘就可以知道你最適合做什麼工作,據說準確率98 沒耐性的就不要做了!我做了一下,發現我適合做技術人員,現在我的工作是銷售,看來不太匹...