6.5
上午进行了工程数学的实验。
实验一:黄金分割法(0.618法)程序设计
一、实验目的
通过一维寻优黄金分割法的程序设计,培养学生计算机的应用能力,并为今后无约束优化方法的学习和编程,奠定基础;掌握缩小寻优区间的黄金分割法。
二、实验内容
(1)请用0.618法求解优化问题:
的极小点和极小值(进退法确定初始区间),精度为10-6;
(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
(1)确定初始区间:
首先随机选取两个不同的初始点a和b,并计算函数在这两个点上的取值f(a)和f(b)。
如果f(a) < f(b),则初始区间为[a, b];如果f(b) < f(a),则初始区间为[b, a]。
(2)迭代计算:
根据黄金分割比例,将当前区间[a, b]分成两个子区间c和d,使得c到d的比例与b到a的比例相同,即c = b - 0.618(b - a),d = a + 0.618(b - a)。
计算函数在c和d上的取值f(c)和f(d),并比较大小。
如果f(c) < f(d),则新的区间为[a, d];如果f(d) < f(c),则新的区间为[c, b]。
不断迭代以上步骤,直到达到设定的精度要求(即区间长度小于等于10^-6)为止。
(3)输出结果:
当达到精度要求时,取区间中点作为极小点的近似值,计算该点的函数值作为极小值的近似值。
输出极小点和极小值的近似值作为最终结果。
2. 代码
function [xmin, fmin, a_vals, b_vals, al_vals, ak_vals] = golds(f, a, b, epsilon)
% 黄金分割法求极小值
% 输入:
% f - 目标函数句柄
% a, b - 初始区间
% epsilon - 精度要求
% 输出:
% xmin - 极小值点
% fmin - 极小值
% a_vals, b_vals, al_vals, ak_vals - 每次迭代的 a, b, al, ak 值
phi = (1 + sqrt(5)) / 2; % 黄金比例常数
resphi = 2 - phi; % 1 / phi
% 记录每次迭代的 a, b, al, ak 值
a_vals = [];
b_vals = [];
al_vals = [];
ak_vals = [];
% 计算初始 al 和 ak
al = b - resphi * (b - a);
ak = a + resphi * (b - a);
fal = f(al);
fak = f(ak);
% 迭代
while (b - a) > epsilon
% 记录当前迭代的 a, b, al, ak 值
a_vals = [a_vals, a];
b_vals = [b_vals, b];
al_vals = [al_vals, al];
ak_vals = [ak_vals, ak];
if fal < fak
b = ak;
ak = al;
fak = fal;
al = b - resphi * (b - a);
fal = f(al);
else
a = al;
al = ak;
fal = fak;
ak = a + resphi * (b - a);
fak = f(ak);
end
end
% 极小值点和极小值
xmin = (a + b) / 2;
fmin = f(xmin);
end
实例调用代码:
% 示例函数
f = @(x) (x - 2)^2 + 3;
% 初始区间和精度
a = 0;
b = 4;
epsilon = 1e-6;
% 调用黄金分割法函数
[xmin, fmin, a_vals, b_vals, al_vals, ak_vals] = golds(f, a, b, epsilon);
% 输出结果
fprintf('极小值点: %.6f\n', xmin);
fprintf('极小值: %.6f\n', fmin);
% 显示每次迭代的值
fprintf('迭代次数: %d\n', length(a_vals));
for i = 1:length(a_vals)
fprintf('迭代 %d: a = %.6f, b = %.6f, al = %.6f, ak = %.6f\n', i, a_vals(i), b_vals(i), al_vals(i), ak_vals(i));
end