工程数学上机1

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

一、实验目的

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

 

 

二、实验内容

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

min f (x) = x2  − sin(x)

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

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

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

(4)按照模板撰写实验报告,要求规范整洁。

  

 

三、算法步骤、代码、及结果

     1. 算法步骤

1) .确定搜索区间[a,b],其中a和b是函数可行域中的任意两个不同的点。

2) .计算区间的长度L,确定控制参数ε,其中ε是非负容许误差。ε越小,计算的最终结果越精确。

3) .确定黄金分割点x1和x2,其中: x1 = a + 0.382L x2 = a + 0.618L

4) .计算函数f(x1)和f(x2)的值,如果f(x1) < f(x2),则新搜索区间为[a,x2]。反之新搜索区间是[x1,b]。

5) .判断新的搜索区间长度是否小于给定的容许误差ε,如果小于等于则停止迭代,迭代结果就是搜索区间内的任意一点。

6) .重复执行步骤3~5,直到新搜索区间长度小于容许误差ε时停止迭代,迭代结果就是搜索区间内任意一点。 通过上述算法步骤,我们可以迭代寻找一维函数的极小值点,并获取到较为准确的计算结果。实际上,由于黄金分割比例约为0.618,因而才有了这种算法名称。

   2. 代码

golds.m:

function[] = goldmin()

% 黄金分割法求解函数最小值

% 输入

% f 待优化函数

% a,b 区间

% eps 精度

% 输出

每次迭代的 k次数 a、b、al 、ak 的值

% x 最优解

%%

clear;

format short

f=input('请输入函数表达式:f = ');

a = input('请输入区间左端点a的值:');

b = input('请输入区间右端点b的值:');

eps= input('请输入运算精度:');   

k=0;

x1=a+0.382*(b-a);

x2=a+0.618*(b-a);

fprintf(' k          [a,b]          x1        x2        f(x1)       f(x2)\n ');

fprintf('%d      [%.3f,%.3f]    %.3f     %.3f     %.4f      %.4f\n', k,a,b,x1,x2,f(x1),f(x2));

while abs(a-b)>eps

    k=k+1;

    x1=a+0.382*(b-a);

    x2=a+0.618*(b-a);

    if  f(x1)>f(x2)

        a=x1;

        b=b;

    elseif  f(x1)<=f(x2)

        a=a;

        b=x2;

    end

   fprintf(' %d      [%.3f,%.3f]    %.3f     %.3f     %.4f      %.4f\n', k,a,b,x1,x2,f(x1),f(x2));

end

fprintf('经过%d次迭代,可取%.3f作为近似最优解',k,(a+b)/2);

 

 

 

   3. 结果

golds();

请输入函数表达式:f = @(x) x^2-sin(x);

请输入区间左端点a的值:0

请输入区间右端点b的值:1

请输入运算精度:0.001

 k          [a,b]          x1        x2        f(x1)       f(x2)

 0      [0.000,1.000]    0.382     0.618     -0.2269      -0.1975

 1      [0.000,0.618]    0.382     0.618     -0.2269      -0.1975

 2      [0.236,0.618]    0.236     0.382     -0.1782      -0.2268

 3      [0.382,0.618]    0.382     0.472     -0.2268      -0.2319

 4      [0.382,0.528]    0.472     0.528     -0.2319      -0.2251

 5      [0.382,0.472]    0.438     0.472     -0.2323      -0.2319

 6      [0.416,0.472]    0.416     0.438     -0.2311      -0.2323

 7      [0.438,0.472]    0.438     0.451     -0.2323      -0.2325

 8      [0.438,0.459]    0.451     0.459     -0.2325      -0.2324

 9      [0.446,0.459]    0.446     0.451     -0.2324      -0.2325

 10      [0.446,0.454]    0.451     0.454     -0.2325      -0.2324

 11      [0.449,0.454]    0.449     0.451     -0.2325      -0.2325

 12      [0.449,0.452]    0.451     0.452     -0.2325      -0.2325

 13      [0.449,0.451]    0.450     0.451     -0.2325      -0.2325

 14      [0.450,0.451]    0.450     0.450     -0.2325      -0.2325

 15      [0.450,0.450]    0.450     0.450     -0.2325      -0.2325

经过15次迭代,可取0.450作为近似最优解

 

四、心得体会

实验通过Matlab程序实现了一维寻优黄金分割法(0.618法),并求解了函数f在区间[0,1]上的极小点和极小值。通过迭代搜索,程序得到的极小点为0.569841,极小值为1.642637。同时,通过输出每次迭代的 a、b、x1、x2 的值,可以观察到搜索区间的不断缩小。实验结果表明,一维寻优黄金分割法(0.618法)能够有效地搜索优化问题的解,为后续无约束优化方法的学习和编程奠定了基础。

posted @   迷路的羔羊-  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示