今日总结

所学时间:135min
代码量:100
博客量:38
所学的知识点:
今天利用matlab实现了0.618法的实现,寻求最优解的实验:

0.618 法,又称黄金分割法,是一种用于优化问题的搜索算法,以下从原理、实施步骤、特点及应用等方面进行总结:

原理:0.618 法基于黄金分割原理,通过不断缩小搜索区间来逼近最优解。在搜索区间内选取两个点,这两个点将区间按照黄金分割比例划分,即较长段与全长的比值等于较短段与较长段的比值,这个比值约为 0.618。通过比较这两个点的函数值,确定保留区间,逐步缩小搜索范围,直至找到满足精度要求的最优解。

具体代码如下分为三个部分:
function [x_min, f_min, iter_data] = golds(f, tol)
% 设定初始点和步长
x0 = 0;
h = 0.01;
% 用进退法确定初始区间
[a, b] = bracket(@(x)f(x), x0, h);
% 黄金分割比例
phi = (sqrt(5) - 1) / 2;
% 初始化迭代数据存储
iter_data = [];
while (b - a) > tol
x1 = a + (1 - phi) * (b - a);
x2 = a + phi * (b - a);
f1 = f(x1);
f2 = f(x2);
% 存储每次迭代的数据
iter_data = [iter_data; a, b, x1, x2];
if f1 < f2
b = x2;
else
a = x1;
end
end
x_min = (a + b) / 2;
f_min = f(x_min);
end

二 、
function [a, b] = bracket(f, x0, h)
fa = f(x0);
x1 = x0 + h;
fx1 = f(x1);
if fx1 > fa
h = -h;
x1 = x0 + h;
fx1 = f(x1);
end
while true
h = 2 * h;
x2 = x1 + h;
fx2 = f(x2);
if fx2 > fx1
if x0 < x2
a = x0;
b = x2;
else
a = x2;
b = x0;
end
break
else
x0 = x1;
x1 = x2;
fa = fx1;
fx1 = fx2;
end
end
end

主函数
% 定义目标函数
f = @(x) x.^2 - x + 6;
% 设定精度
tol = 1e-6;
% 调用golds函数
[x_min, f_min, iter_data] = golds(f, tol);
% 输出结果
disp(['极小点为: ', num2str(x_min)]);
disp(['极小值为: ', num2str(f_min)]);
disp('每次迭代的a, b, a_l, a_k值:');
disp(iter_data);

posted @ 2025-05-06 21:39  真的不会qiao代码  阅读(23)  评论(0)    收藏  举报