黄金分割法
(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);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
2023-05-11 C++