我正在尝试使用此算法找到函数的最小值。 这不是一个最佳算法,但我现在不在乎。
此外,您不必知道算法如何工作才能回复,但如果您感到好奇,我会在本文结尾处讨论它。这真的不那么难。
歧视算法
function result = fmin(f,a,b,max_error)
if abs(b-a) < max_error
result = (a+b)/2;
else
r1 = a+(b-a)*rand(1,1); r2 = a+(b-a)*rand(1,1);
c = min([r1,r2]); d = max([r1,r2]);
fc = f(c); fd = f(d);
if fc <= fd
b = d;
else
a = c;
end
result = fmin(f,a,b,max_error);
end
现在,问题是这个算法返回的最小值远远超过实际最小值(通过matlab预定义函数计算fminbnd
)超过max_error
,如果我使用值{ {1}}。这种情况,从理论的角度来看是不可能的。
作为递归,如果永远不满足条件max_error <= 1e-10
,则算法永远不会返回。
所以,我认为从数字的近似中出现了一些错误。起初,我认为abs(b-a) < max_error
或r1
未正确计算。在某些时候,这两个数字将超出r2
区间,从而使算法正在运行的假设无效。
为了证明这一点,我修改了上面的算法,包括检查每次迭代计算的间隔:
有罪的算法2 [检查极端情况]
[a,b]
但是我没有从控制台获得任何额外的输出。
所以,我认为function result = fmin(f,a,b,max_error)
if abs(b-a) < max_error
result = (a+b)/2;
else
r1 = a+(b-a)*rand(1,1); r2 = a+(b-a)*rand(1,1);
c = min([r1,r2]); d=max([r1,r2]);
% check that c and d are actually inside [a,b]
if ((c < a)||(d > b))
disp('Max precision reached');
result = (a+b)/2;
return;
end
fc = f(c); fd = f(d);
if fc <= fd
b = d;
else
a = c;
end
result = fmin(f,a,b,max_error);
end
或f(c)
的计算存在一些错误,但我不知道如何证明它。
问题
最后,我的问题是
f(d)
或f(c)
中的任何一个时提交错误?算法如何运作(问题不是严格固有的)
这是一种迭代算法。基本上,该想法是从初始间隔[a,b]开始生成包含解的间隔序列,其中给定函数f(d)
是单峰的。
在每一步中,我们会随机选择两个数字f
和c
,以便d
。现在,如果我们发现a <= c <= d <= b
这意味着我们确定我们可以丢弃函数在f(c) > f(d)
之前作为最小值的有效候选者所假定的值,因为它是单峰的。因此,我们限制间隔并在区间c
中重复该过程。相反,如果是[c,b]
,我们可以将值从f(c) < f(d)
丢弃到d
,因此我们会在b
区间内重复此过程。
在每次迭代时,间隔变短。当其长度小于指定的[a,d]
值时,算法将最后一个间隔的中点作为最小值的近似值返回。
修改
我看到有一个人想要关闭这个问题,因为它太宽泛了。 请先生,您能在评论中详细说明吗?
答案 0 :(得分:0)
这种细分方法只适用于你的函数是(准)凸的特殊情况(一个局部最小值,单调落在左边,在右边抬起)。在几个局部最小值的情况下,它通常会收敛到其中一个,但绝不能保证算法找到全局最小值。从a
减少到c
。从b
到d
可以跳过几个本地最小值。