MATLAB实验一:一维寻优法(0.618法)程序设计

发布时间 2023-05-27 15:06:38作者: 冰稀饭Aurora

一、实验目的

通过一维寻优黄金分割法的程序设计,培养计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。

二、实验内容

(1)用0.618法求解优化问题:min f(x)=x^2 - sin(x)

在区间[0,1]上的极小点和极小值;

(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;

(3)输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;

三、算法步骤、代码、及结果

   1. 算法步骤

1.搜索初始区间

2.终止条件

3.1次计算左、右试探点

4.循环搜索

5.左试探点函数

6.判断最优解,并存放到xopt最优解,fmin最小函数值

7.将每次迭代变量存放到txt文件中

 

%实验1 0.618法
clear all
close all
clc
% 搜索初始区间
a=0;
b=1;
% 终止条件
err=10^-5;
% tao=0.618
tao=0.618;
% 第1次计算左、右试探点
phia = a^2+sin(a);  %左边界函数值
phib = b^2+sin(b);  %右边界函数值
p=a+(1-tao)*(b-a);  %左试探点
phip=p^2+sin(p);    %左试探点函数值
q=a+tao*(b-a);      %右试探点
phiq=q^2+sin(q);    %右试探点函数值
k=1;                % 循环变量 k
G(k,:)=[a,b,p,q];   % 用于存储 每次迭代的左右边界,左右试探点
%循环搜索
while abs(b-a)>err
   if phip<phiq
        b = q;               %右边界更新:用上一次迭代的右试探点更新右边界          
        q = p;               %右试探点更新;
        phiq = phip;         %更新右试探点函数值;
        p = a+(1-tao)*(b-a); %左试探点更新        
        phip = p^2+sin(p);   %左试探点函数值
   else
        a = p;               % 右边界更新:用上一次迭代的右试探点更新右边界
        p = q;               % 左试探点更新
        phip = phiq;         % a_left(k)^2+sin(a_left(k)); %左试探点函数值
        q = a+tao*(b-a);     % 右试探点更新        
        phiq=q^2+sin(q);     % 右试探点函数值   
   end
   k=k+1;
   G(k,:)=[a,b,p,q];
end
% 判断最优解,并存放到xopt最优解,fmin最小函数值
if phip<phiq
    xopt=p;      %最优解
    fmin=phip;   %最小函数值
else
    xopt=q;      
    fmin=phiq;
end
%将每次迭代变量存放到txt文件中
fileID=fopen('data2.txt','w');
fprintf(fileID,'%6s %5s %10s %10s %10s \r\n','迭代次数','a','b','p','q');
for m=1:k
    fprintf(fileID,'%6.0f %10.6f %10.6f %10.6f %10.6f \r\n',m,G(m,1),G(m,2),G(m,3),G(m,4));
end
fprintf(fileID,'     x_opt=%10.7f, f_min=%10.7f',xopt,fmin);
fclose(fileID);

 

 3. 结果

 

 迭代次数     a          b          p          q

     1   0.000000   1.000000   0.382000   0.618000

     2   0.000000   0.618000   0.236076   0.382000

     3   0.000000   0.382000   0.145924   0.236076

     4   0.000000   0.236076   0.090181   0.145924

     5   0.000000   0.145924   0.055743   0.090181

     6   0.000000   0.090181   0.034449   0.055743

     7   0.000000   0.055743   0.021294   0.034449

     8   0.000000   0.034449   0.013160   0.021294

     9   0.000000   0.021294   0.008134   0.013160

    10   0.000000   0.013160   0.005027   0.008134

    11   0.000000   0.008134   0.003107   0.005027

    12   0.000000   0.005027   0.001920   0.003107

    13   0.000000   0.003107   0.001187   0.001920

    14   0.000000   0.001920   0.000734   0.001187

    15   0.000000   0.001187   0.000453   0.000734

    16   0.000000   0.000734   0.000280   0.000453

    17   0.000000   0.000453   0.000173   0.000280

    18   0.000000   0.000280   0.000107   0.000173

    19   0.000000   0.000173   0.000066   0.000107

    20   0.000000   0.000107   0.000041   0.000066

    21   0.000000   0.000066   0.000025   0.000041

    22   0.000000   0.000041   0.000016   0.000025

    23   0.000000   0.000025   0.000010   0.000016

    24   0.000000   0.000016   0.000006   0.000010

    25   0.000000   0.000010   0.000004   0.000006

     x_opt= 0.0000037, f_min= 0.0000037