[书籍]马昌风-最优化方法与MATLAB程序设计
书中例题编程详解
利用0.618法(黄金分割法)求极小值
思路图解:
MATLAB程序如下:
clc,clear;
epsilon=10^-4;
phi=@(x) x^2-sin(x); %phi为目标函数
a=0;b=1; %a,b,分别为区间(a,b)的端点
t=(sqrt(5)-1)/2; %t为区间长度缩短率,即为每次迭代,区间缩短为原来的t倍
h=b-a; %h为区间长度
delta=10^-4; %delta为容许误差
phia=feval(phi,a); %phia为区间左端点函数值
phib=feval(phi,b); %phia为区间左端点函数值
p=a+(1-t)*h; %区间左端点取值表达式
q=a+t*h; %区间右端点取值表达式
phip=feval(phi,p); %计算经过一次缩短区间之后的左端点函数值
phiq=feval(phi,q); %计算经过一次缩短区间之后的右端点函数值
k=1; %k为迭代次数
while(abs(phib-phia)>epsilon)|(h>delta) %当区间长度大于容许误差时或
%两区间端点函数值大于精度时,一直运行
if(phip<phiq) %如果左区间函数值小于右区间函数值
b=q;
phib=phiq;
q=a+t*(b-a);
phiq=feval(phi,q);
h=b-a;
p=a+(1-t)*h;
phip=feval(phi,p);
else
a=p;
phia=phip;
p=q;
phip=phiq;
h=b-a;
q=a+t*h;
phiq=feval(phi,q);
end
k=k+1
end
ds=abs(b-a); %ds为区间的误差
dphi=abs(phib-phia); %dphi为函数值的误差
if(phip<phiq)
s=p; phs=phip;
else
s=q; phis=phiq;
end
s
ds
dphi