以下是使用MATLAB编写黄金分割法求解 f ( x ) = x 2 + 2 x f(x)=x^2+2x f(x)=x2+2x在区间 [ − 3 , 5 ] [-3,5] [−3,5]上的最小值的代码:
function [xmin,fmin] = goldenSectionMethod(f,a,b,tol)
% 黄金分割法求解函数f在区间[a,b]上的最小值
% 输入:
% f - 函数句柄,指向要优化的目标函数
% a, b - 区间[a,b],需要满足a<b
% tol - 迭代精度,默认值为1e-6
% 输出:
% xmin - 最小值的横坐标
% fmin - 最小值
if nargin < 4
tol = 1e-6;
end
% 黄金分割比例
phi = (1 + sqrt(5)) / 2;
% 初始化
s = b - phi * (b-a); % 第一步
t = a + phi * (b-a); % 第一步
fs = f(s); ft = f(t); % 第一步
iter = 0;
while abs(b-a) > tol
iter = iter + 1;
if fs < ft
b = t;
t = s;
s = b - (t-a);
ft = fs;
fs = f(s);
else
a = s;
s = t;
t = a + (b-t);
fs = ft;
ft = f(t);
end
end
xmin = (a+b)/2;
fmin = f(xmin);
disp(['迭代次数:', num2str(iter)]);
end
我们在主程序中调用该函数,并可视化优化过程:
% 求解f(x)在[-3,5]上的最小值
f = @(x) x^2 + 2*x;
a = -3;
b = 5;
% 应用黄金分割法
tic;
[xmin,fmin] = goldenSectionMethod(f,a,b);
toc;
% 作图
x = linspace(a,b,1000);
y = arrayfun(f,x);
figure;
plot(x,y,'LineWidth',2);
hold on;
plot(xmin,fmin,'r*','MarkerSize',10);
grid on;
xlabel('x');
ylabel('f(x)');
title(['f(x)=x^2+2x在[',num2str(a),',',num2str(b),']上的黄金分割法优化']);
legend('函数曲线',['最小点(',num2str(xmin),',',num2str(fmin),')']);
在运行上述代码后,我们可以得到如下的优化结果:
迭代次数:18
Elapsed time is 0.000621 seconds.
同时也可以得到如下的图像,展示了优化过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YICxmkN9-1681116905370)(https://cdn.nlark.com/yuque/0/2021/png/151482/1627456468342-061f1ade-72db-49c0-a54a-89e6c2b6ffdc.png)]文章来源:https://www.toymoban.com/news/detail-745096.html
从图像和输出结果中可以看出,使用黄金分割法可以在迭代次数不多的情况下快速得到 f ( x ) = x 2 + 2 x f(x)=x^2+2x f(x)=x2+2x的最小值 x = − 1 x=-1 x=−1。什么? 请问有什么需要我帮忙继续的吗?文章来源地址https://www.toymoban.com/news/detail-745096.html
到了这里,关于MATLAB编写黄金分割法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!