一、实验目的
通过一维寻优黄金分割法的程序设计,培养计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(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
标签:0.618,迭代,0.000000,寻优法,MATLAB,tao,sin,试探 From: https://www.cnblogs.com/rsy-bxf150/p/17436758.html