利用0.618法(黄金分割法)求极小值

[书籍]马昌风-最优化方法与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
        
                                                                
                                                                

猜你喜欢

转载自blog.csdn.net/ZHUQIUSHI123/article/details/82814548