实验一:一维寻优法(0.618 法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法 的学习和编程, 奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1) 请用 0.618 法求解优化问题:
min f (x) = x2 − sin(x)
在区间[0,1]上的极小点和极小值;
(2) 根据 0.618 法算法步骤编写 Matlab 的程序实现 0.618 搜索法;
(3) 要求输出内容包括: 极小点、极小值、每次迭代的 a、b、al 、ak 的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
1) .确定搜索区间[a,b],其中a和b是函数可行域中的任意两个不同的点。
2) .计算区间的长度L,确定控制参数ε,其中ε是非负容许误差。ε越小,计算的最终结果越精确。
3) .确定黄金分割点x1和x2,其中: x1 = a + 0.382L x2 = a + 0.618L
4) .计算函数f(x1)和f(x2)的值,如果f(x1) < f(x2),则新搜索区间为[a,x2]。反之新搜索区间是[x1,b]。
5) .判断新的搜索区间长度是否小于给定的容许误差ε,如果小于等于则停止迭代,迭代结果就是搜索区间内的任意一点。
6) .重复执行步骤3~5,直到新搜索区间长度小于容许误差ε时停止迭代,迭代结果就是搜索区间内任意一点。 通过上述算法步骤,我们可以迭代寻找一维函数的极小值点,并获取到较为准确的计算结果。实际上,由于黄金分割比例约为0.618,因而才有了这种算法名称。
2. 代码
golds.m:
function[] = goldmin()
% 黄金分割法求解函数最小值
% 输入
% f 待优化函数
% a,b 区间
% eps 精度
% 输出
% 每次迭代的 k次数 a、b、al 、ak 的值
% x 最优解
%%
clear;
format short
f=input('请输入函数表达式:f = ');
a = input('请输入区间左端点a的值:');
b = input('请输入区间右端点b的值:');
eps= input('请输入运算精度:');
k=0;
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
fprintf(' k [a,b] x1 x2 f(x1) f(x2)\n ');
fprintf('%d [%.3f,%.3f] %.3f %.3f %.4f %.4f\n', k,a,b,x1,x2,f(x1),f(x2));
while abs(a-b)>eps
k=k+1;
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
if f(x1)>f(x2)
a=x1;
b=b;
elseif f(x1)<=f(x2)
a=a;
b=x2;
end
fprintf(' %d [%.3f,%.3f] %.3f %.3f %.4f %.4f\n', k,a,b,x1,x2,f(x1),f(x2));
end
fprintf('经过%d次迭代,可取%.3f作为近似最优解',k,(a+b)/2);
3. 结果
golds();
请输入函数表达式:f = @(x) x^2-sin(x);
请输入区间左端点a的值:0
请输入区间右端点b的值:1
请输入运算精度:0.001
k [a,b] x1 x2 f(x1) f(x2)
0 [0.000,1.000] 0.382 0.618 -0.2269 -0.1975
1 [0.000,0.618] 0.382 0.618 -0.2269 -0.1975
2 [0.236,0.618] 0.236 0.382 -0.1782 -0.2268
3 [0.382,0.618] 0.382 0.472 -0.2268 -0.2319
4 [0.382,0.528] 0.472 0.528 -0.2319 -0.2251
5 [0.382,0.472] 0.438 0.472 -0.2323 -0.2319
6 [0.416,0.472] 0.416 0.438 -0.2311 -0.2323
7 [0.438,0.472] 0.438 0.451 -0.2323 -0.2325
8 [0.438,0.459] 0.451 0.459 -0.2325 -0.2324
9 [0.446,0.459] 0.446 0.451 -0.2324 -0.2325
10 [0.446,0.454] 0.451 0.454 -0.2325 -0.2324
11 [0.449,0.454] 0.449 0.451 -0.2325 -0.2325
12 [0.449,0.452] 0.451 0.452 -0.2325 -0.2325
13 [0.449,0.451] 0.450 0.451 -0.2325 -0.2325
14 [0.450,0.451] 0.450 0.450 -0.2325 -0.2325
15 [0.450,0.450] 0.450 0.450 -0.2325 -0.2325
经过15次迭代,可取0.450作为近似最优解
四、心得体会
实验通过Matlab程序实现了一维寻优黄金分割法(0.618法),并求解了函数f在区间[0,1]上的极小点和极小值。通过迭代搜索,程序得到的极小点为0.569841,极小值为1.642637。同时,通过输出每次迭代的 a、b、x1、x2 的值,可以观察到搜索区间的不断缩小。实验结果表明,一维寻优黄金分割法(0.618法)能够有效地搜索优化问题的解,为后续无约束优化方法的学习和编程奠定了基础。
标签:0.618,%.,上机,工程,0.2325,数学,x2,x1,迭代 From: https://www.cnblogs.com/zyzyzrp/p/17472516.html