实验一:一维寻优法(0.618 法)程序设计

一、实验目的

 

通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。

 

二、实验内容

 

(1)请用 0.618 法求解优化问题:

在区间[0,1]上的极小点和极小值;

(2)根据 0.618 法算法步骤编写 Matlab 的程序实现 0.618 搜索法;

(3)要求输出内容包括:极小点、极小值、每次迭代的 abalak 的值;

(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);
复制代码

 

posted @   旺旺大菠萝  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示