Matlab:优化器/求解器的准确性差
我很难在Matlab上找到足够的准确度。 我有一个函数Lik(k)
,并且想要找到其中Lik(k)=L0
的k
的值。 基本上,问题是,各种内置的Matlab的求解器( fzero
, fminbnd
, fmincon
)没有得到尽可能接近,我想还是想到了解决方案。
Lik()
是一个用户定义的函数,它涉及大量的编码来计算数值拉普拉斯逆变换等,因此我不包含完整的代码。 但是,我已经广泛地使用了这个功能,它似乎正常工作。 Lik()
实际上需要几个输入参数,但对于当前步骤,除k
之外,所有这些都是固定的。 所以它确实是一个一维的根发现问题。
我想找到其中Lik(k)-L0 = 0
的k >= 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.96
与Lik(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
可以设置TolX
和TolFun
,但是玩这些(低至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