实验一:一维寻优法(0.618 法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用 0.618 法求解优化问题:
在区间[0,1]上的极小点和极小值;
(2)根据 0.618 法算法步骤编写 Matlab 的程序实现 0.618 搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的 a、b、al、ak 的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
step:
(1).在区间[a,b]上,假设插入试探点λ和μ,并且λ<μ。
(2).计算f(λ)和f(μ)的值
f(λ)>f(μ),则去掉左边[a,λ]区间,剩下[λ,b]区间
f(λ)<f(μ),则去掉右边[μ,b]区间,剩下[a,μ]区间
(3).继续迭代。
试探点应该遵循怎样的规则?
现在,使λ(k)和μ(k)满足两个条件:
λ(k)和μ(k)在子区间[a(k),b(k)]中的位置是对称的,即到两端点是等距的。
每次迭代区间长度缩短比率(α)相同。
golds 函数: function [xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol) % f: 目标函数 % a,b: 初始区间 % tol: 精度要求 % xm,fm: 最优解和相应的最优函数值 % 黄金分割比例 r = 0.618; % 初始值 L = b-a; 1al = a + (1-r)*L; ak = a + r*L; fal = f(al); fak = f(ak ); % 记录每次迭代的值 i = 1; aList(i) = a; bList(i) = b; alList(i) = al; akList(i) = ak ; % 迭代计算 while L > tol if fal > fak a = al; al = ak ; fal = fak ; ak = a + r*(b-a); fak = f(ak ); else b = ak ; ak = al; fak = fal; al = a + (1-r)*(b-a); fal = f(al); end i = i+1; aList(i) = a; bList(i) = b; alList(i) = al; akList(i) = ak ; L = b-a; end % 输出结果 xm = (a+b)/2; fm = f(xm); End 测试代码: % 定义函数 f = @(x) x^2 - sin(x); % 定义区间和精度 a = 0; b = 1; tol = 1e-6; % 调用 golds 函数求解 [xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol); % 输出结果 fprintf('极小点是 %f, 极小值是 %f.\n', xm, fm); fprintf('a的值是:\n'); disp(aList); fprintf('b的值是:\n'); disp(bList); fprintf('al的值是:\n'); disp(alList); fprintf('ak的值是:\n'); disp(akList);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统