Matlab:优化器/求解器的准确性差

我很难在Matlab上找到足够的准确度。 我有一个函数Lik(k) ,并且想要找到其中Lik(k)=L0k的值。 基本上,问题是,各种内置的Matlab的求解器( fzerofminbndfmincon )没有得到尽可能接近,我想还是想到了解决方案。

Lik()是一个用户定义的函数,它涉及大量的编码来计算数值拉普拉斯逆变换等,因此我不包含完整的代码。 但是,我已经广泛地使用了这个功能,它似乎正常工作。 Lik()实际上需要几个输入参数,但对于当前步骤,除k之外,所有这些都是固定的。 所以它确实是一个一维的根发现问题。

我想找到其中Lik(k)-L0 = 0k >= 165.95的值。 Lik(165.95)小于L0 ,我期望Lik(k)从这里单调增加。 事实上,我可以在感兴趣的范围内评估Lik(k)-L0 ,并且它似乎平滑过零:例如Lik(165.95)-L0 = -0.7465, ..., Lik(170.5)-L0 = -0.1594, Lik(171)-L0 = -0.0344, Lik(171.5)-L0 = 0.1015, ... Lik(173)-L0 = 0.5730, ..., Lik(200)-L0 = 19.80 。 所以看起来这个函数表现得很好。

但是,我试图用几种不同的方法“自动”找到根,准确性不如我所期望的那么好......

使用fzero(@(k) Lik(k)-L0)如果约束到间隔(165.95,173) fzero返回k=170.96Lik(k)-L0=-0.045 。 好吧,虽然不是很好。 而且出于实际的目的,我不知道这样一个精确的上限,没有大量的手工试验和错误。 如果使用的时间间隔(165.95,200) fzero返回k=167.19其中Lik(k)-L0 = -0.65 ,这是相当差的。 我一直在运行这些测试与显示设置为ITER所以我可以看到发生了什么事情,并且看起来fzero命中167.19四号迭代,然后在那里停留5日迭代,这意味着在改变k从一个迭代到接下来小于TolX (设为0.001),因此程序结束。 退出标志表示它已成功融合到解决方案中。

我还尝试使用fminbnd (给出k上限和下限)和fmincon (给出k的起始点abs(Lik(k)-L0)来最小化abs(Lik(k)-L0) fminbnd )并且遇到类似的准确性问题。 特别是,用fmincon可以设置TolXTolFun ,但是玩这些(低至10 ^ -6,比我需要的精度高得多)没有任何区别。 令人困惑的是,有时候优化器甚至会在早期的迭代中找到一个k值,这更接近于使目标函数为零而不是它返回的最终k值。

因此,似乎该算法正在迭代到某个点,然后没有采取任何足够大小的进一步步骤来找到更好的解决方案。 有谁知道为什么算法不需要另一个更大的步骤? 有什么我可以调整,以改变这一点? (我已经看过优化下的列表,但没有提出任何有用的东西。)

非常感谢!


由于您似乎有一个似乎在该地区单调的“野生”功能,这个功能范围相当小,对精度要求不是很高,我认为所有的标准都可以用来推荐强力方法。

假设它不需要太多时间来评估某个点的功能,请尝试以下操作:

查找上界xmax和下限xmin ,选择一个首选stepsize和在评估你的功能

xmin:stepsize:xmax 

如果需要(单调性真的适用),通过这样做可以得到另一个上限和下限,并重复该过程以获得更好的准确性。


我在使用fmincon时也遇到了这个问题。 这是我如何解决它。

我需要在优化循环(多个变量)中找到一个函数(单个变量)的解决方案。 正因为如此,我需要为解决单变量函数提供一个很大的时间间隔。 问题是如果搜索间隔太大,fmincon(或fzero)不会收敛到解决方案。 为了解决这个问题,我在一个while循环内解决了这个问题,用一个巨大的起始upperbound(1e200)来解决解算器产生的fval值。 如果得到的fval不够小,我会将上限减小一个因子。 代码看起来像这样:

fval = 1;
factor = 1;
while fval>1e-7
    UB = factor*1e200;
    [x,fval,exitflag] = fminbnd(@(x)function(x,...),LB,UB,options);
    factor = factor * 0.001;
end

当找到一个好的解决方案时,求解器会退出。 通过引入另一个因素和/或增加因子步骤,您当然也可以和LB一起玩。 我的第一语言不是英语,所以我对任何错误表示歉意。

干杯,克里斯蒂安


为什么不使用简单的二分法? 你总是评估一定间隔的中间值,然后将其减少到右边或左边部分,这样你总是有一个边界给出一个负值,另一个边界给出一个正值。 您可以很快降低到任意精度。 由于每次减少一半的时间间隔,它应该很快收敛。

但我怀疑该功能存在其他问题,因为它有不连续性。 fzero会如此糟糕地工作似乎很奇怪。 这是一个确定性的功能吗?

链接地址: http://www.djcxy.com/p/85733.html

上一篇: Matlab: poor accuracy of optimizers/solvers

下一篇: Python3.3: Square