一、优化方法阐述
1.原理阐述:
黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法.
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算
[]
法的基础,但它只适用于一维区间上的凸函数6,即只在单峰区间内才能进行一维寻优,其收敛效率较低.其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩
[]
小搜索区间7。具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。如果f(a1)〉f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)〈f(a2) ,令b=a2,a2=a1,a1=b-r*(b-a),如果|(b-a)/b|和|(y1—y2)/y2|都大于收敛精度ε重新开始。因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。黄金分割法原理如图所示,
2。基本步骤:
1)在搜索区间[a,b]内对称地插入两个试点a1和a2,计算下式的函数值 a1=b—0.618(b-a), f1=f(a1) a2=a+0。618(b—a), f2=f(a2) 2)比较函数值f1与f2,缩短搜索区间
3)判断迭代终止条件。如果满足b—a<=ε时,取函数f(a)的近似极小点a*=(b+a)/2。否则,返回第2步,继续作收缩区间的迭代计算.
3.程序框图:
开始 给定a=-3 b=5ε=0.001 λ←0.618 α1←b-λ(b-a) y1←f(α1) α2←a+λ(b-a) y2←f(α2) y1≧y2 ? a←α1 α1←α2 y1←y2 b←α2 α2←α1 y2←y1 α2←a+λ(b-a) y2←f(α2) α1←b-λ(b-a) y1←f(α1) |(a-b)/b |<ε和 |(y2-y1)/y2 |<ε α*←(a+b)/2 结束
二、优化程序(源代码、界面、结构、操作等)
f=inline(’x^2-10*x+36',’x');
a=2;b=8;epsilon=0。0001; x1=b—0。618*(b-a);f1=f(x1); x2=a+0.618*(b—a);f2=f(x2);
x=[];y=[]; for k=1:25 if f1〈=f2
b=x2;x2=x1;f2=f1;
x1=b—0。618*(b-a);f1=f(x1); else
a=x1;x1=x2;f1=f2;
x2=a+0。618*(b-a);f2=f(x2); end
temp=0.5*(b+a);temp_y=f(temp); x=[x,temp];y=[y,temp_y];
fprintf(1,'区间中点 x=%3。4f\\n’,x) end
ezplot(f,[2,8]),hold on plot(x,y,’r*’);
三、优化问题分析及结果
共 轭 梯 度 法
一、优化方法阐述 1. 原理阐述:
共轭梯度法为求解线性方程组而提出。后来,人们把这种方法用于求解无约束最优
化问题,使之成为一种重要的最优化方法。
共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。根据共轭方向的基本性质,这种方法具有二次终止性。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
2。 基本步骤:
1)给定初始点x0,迭代精度和维数n,置迭代次数K=0,按照梯度法进行第一次搜索。
2)计算搜索方向s(k)的修正值,按照公式构造共轭方向s(k+1),进行下一次迭代. 3)当K=n时,置x0=x(n),返回第一步;否则返回第2步。
3. 程序框图:
二、优化程序(源代码、界面、结构、操作等) function [Xmin,y]=gtidu(x0,e)
x0=[8,9]'; e=0。000001; syms a1 a2 b0;
y=4*(a1—5)^2+(a2-6)^2; f0=[diff(y,a1);diff(y,a2)]; k=0;
g0=subs(f0,{a1,a2},{x0(1),x0(2)}); d0=-g0; x1=sve(x0,d0);
g1=subs(f0,{a1,a2},{x1(1),x1(2)}); ezmesh(’4*(a1-5)^2+(a2—6)^2'); while double(sqrt(dot(g1,g1)))>e b0=dot(g1,g1)/dot(g0,g0); d1=-g1+b0*d0; x2=sve(x1,d1);
g2=subs(f0,{a1,a2},{x2(1),x2(2)}); k=k+1;
g0=g1;g1=g2;d0=d1;x1=x2;
end
fprintf('\\nThe number is :\\n\\nk=%d\\n\\n',k); disp('The result is :'); Xmin=x2;
y=subs(y,{a1,a2},{Xmin(1),Xmin(2)}); function xk=sve(x,d) syms a1 a2 s;
y=4*(a1—5)^2+(a2—6)^2; x=x+s*d;
f=subs(y,{a1,a2},{x(1),x(2)}); df=diff(f,s); s=solve(df); xk=subs(x,s);
三、优化问题分析及结果
因篇幅问题不能全部显示,请点此查看更多更全内容