5.22
工程数学 黄金分割法
function [xmin, fmin, iter] = golds(func, a, b, tol)
% func: 要优化的函数句柄
% a, b: 初始搜索区间的下界和上界
% tol: 精度要求
% 黄金分割比例
phi = (sqrt(5) - 1) / 2;
c1 = b - phi * (b - a); % ak,即右测试点
c2 = a + phi * (b - a); % al,即左测试点
f1 = func(c1);
f2 = func(c2);
iter = 0;
while abs(b - a) > tol
if f1 < f2
b = c2;
ak = c1;
f1_old = f2;
c2 = c1;
f2 = f1;
c1 = b - phi * (b - a);
f1 = func(c1);
else
a = c1;
al = c2;
f2_old = f1;
c1 = c2;
f1 = f2;
c2 = a + phi * (b - a);
f2 = func(c2);
end
iter = iter + 1;
fprintf('迭代次数 %d: a = %f, b = %f, al = %f, ak = %f, f(al) = %f, f(ak) = %f\n', iter, a, b, al, ak, f2, f1);
end
% 确定极小点和极小值
if f1 < f2
xmin = c1;
fmin = f1;
else
xmin = c2;
fmin = f2;
end
end
% 使用示例函数 f(x) = x^2
func = @(x) x.^2;
% 假设的初始区间 [a, b]
a = -2;
b = 2;
% 精度要求
tol = 1e-6;
% 调用 golds 函数
[xmin, fmin, iter] = golds(func, a, b, tol);
fprintf('极小点是: %f\n', xmin);
fprintf('极小值是: %f\n', fmin);
fprintf('迭代次数: %d\n', iter);