如何在matlab脚本中拦截此近似误差?

时间:2015-04-26 15:07:59

标签: algorithm matlab approximation

我正在尝试使用此算法找到函数的最小值。 这不是一个最佳算法,但我现在不在乎。

此外,您不必知道算法如何工作才能回复,但如果您感到好奇,我会在本文结尾处讨论它。这真的不那么难。

歧视算法

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_errorr1未正确计算。在某些时候,这两个数字将超出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)的计算存在一些错误,但我不知道如何证明它。

问题

最后,我的问题是

  1. 此时,我们是否可以确定在计算f(d)f(c)中的任何一个时提交错误?
  2. 我们可以用一些代码来证明吗?或者更好的是,我们可以编写算法,以便在它应该返回时返回吗?
  3. 算法如何运作(问题不是严格固有的)

    这是一种迭代算法。基本上,该想法是从初始间隔[a,b]开始生成包含解的间隔序列,其中给定函数f(d)是单峰的。 在每一步中,我们会随机选择两个数字fc,以便d。现在,如果我们发现a <= c <= d <= b这意味着我们确定我们可以丢弃函数在f(c) > f(d)之前作为最小值的有效候选者所假定的值,因为它是单峰的。因此,我们限制间隔并在区间c中重复该过程。相反,如果是[c,b],我们可以将值从f(c) < f(d)丢弃到d,因此我们会在b区间内重复此过程。

    在每次迭代时,间隔变短。当其长度小于指定的[a,d]值时,算法将最后一个间隔的中点作为最小值的近似值返回。

    修改

    我看到有一个人想要关闭这个问题,因为它太宽泛了。 请先生,您能在评论中详细说明吗?

1 个答案:

答案 0 :(得分:0)

这种细分方法只适用于你的函数是(准)凸的特殊情况(一个局部最小值,单调落在左边,在右边抬起)。在几个局部最小值的情况下,它通常会收敛到其中一个,但绝不能保证算法找到全局最小值。从a减少到c。从bd可以跳过几个本地最小值。