黄金分割法
(1)用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
1. 算法步骤
首先定义黄金分割比例r = (sqrt(5)-1)/2; 再初始化区间和初始值 L = b-a; x1 = a + (1-r)*L; x2 = a + r*L; fx1 = f(x1); fx2 = f(x2); 给定初始区间 [𝑎,𝑏][a,b] 和精度要求,计算区间长度 𝐿=𝑏−𝑎L=b−a,计算初始点 𝑥1x1 和 𝑥2x2,计算 𝑓(𝑥1)f(x1) 和 𝑓(𝑥2)f(x2)。
记录每次迭代的值、初始区间和初始点,最后进行迭代计算。
2. 代码
function [xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol)
% f: 待优化的目标函数
% a,b: 初始区间
% tol: 精度要求
% xm,fm: 最优解和相应的最优函数值
% 黄金分割比例
r = (sqrt(5)-1)/2;
% 初始值
L = b-a;
x1 = a + (1-r)*L;
x2 = a + r*L;
fx1 = f(x1);
fx2 = f(x2);
% 记录每次迭代的值
i = 1;
aList(i) = a;
bList(i) = b;
alList(i) = x1;
akList(i) = x2;
% 迭代计算
while L > tol
if fx1 > fx2
a = x1;
x1 = x2;
fx1 = fx2;
x2 = a + r*(b-a);
fx2 = f(x2);
else
b = x2;
x2 = x1;
fx2 = fx1;
x1 = a + (1-r)*(b-a);
fx1 = f(x1);
end
i = i+1;
aList(i) = a;
bList(i) = b;
alList(i) = x1;
akList(i) = x2;
L = b-a;
end
% 输出结果
xm = (a+b)/2;
fm = f(xm);
end
% 定义函数
f = @(x) x^2 - x+6;
% 定义区间和精度
a = 0; b = 1; tol = 1e-6;
% 调用 golds 函数求解
[xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol);
% 输出结果
fprintf('The minimum point is %f, and the minimum value is %f.\n', xm, fm);
fprintf('The a values are:\n'); disp(aList);
fprintf('The b values are:\n'); disp(bList);
fprintf('The al values are:\n'); disp(alList);
fprintf('The ak values are:\n'); disp(akList);