优化模拟或常微分方程
什么是优化模拟或ODE?
有时你的目标函数或非线性约束函数值只能通过模拟或常微分方程(ODE)的数值解来获得。这样的优化问题有几个共同的特征和挑战,讨论在潜在问题及解决办法.
有关优化ODE的基于问题的示例,请参见利用优化变量拟合ODE参数.有关基于求解器的示例,请参见拟合常微分方程(ODE).
有关避免其他方法遇到的许多问题的方法,请参见离散最优轨迹,基于问题.该方法可以在优化过程中使用自动微分。然而,该方法可能有相对较低的精度,因为它是基于固定步长,可能是低阶ODE求解算法。
优化一个Simulink®模型容易,尝试使用仿真软件优化设计™.
潜在问题及解决办法
有限差分问题
最优化工具箱™求解器在内部使用目标函数和约束函数的导数。默认情况下,它们使用该形式的有限差分近似来估计这些导数
或
这些有限差分近似可能是不准确的,因为:
的大值δ允许更多的非线性影响有限差分。
的小值δ由于数字精度有限,导致不准确。
具体来说,对于ode的模拟和数值解:
模拟通常对参数的微小变化不敏感。这意味着如果摄动太小δ,模拟可返回一个伪估计导数为0。
模拟和数值解在计算ode的函数时都可能存在误差。这些不准确性可以在有限差分近似中被放大。
ode的数值解在比机器精度大得多的值引入噪声。这种噪声可以在有限差分近似中被放大。
如果一个ODE求解器使用可变步长,那么有时计算中的ODE步数F(x+δ)可以不同的步骤的数量,在评估F(x).这种差异会导致返回值出现虚假的差异,从而对导数给出误导性的估计。
有限差分的一些建议
使用直接搜索避免有限差分。如果你有全局优化工具箱许可证,您可以尝试使用patternsearch
(全局优化工具箱)解算器。patternsearch
不尝试估计梯度,所以不受限制在有限差分问题.
如果你使用patternsearch
对于昂贵(耗时)的函数求值,请使用缓存
选择:
选择= optimoptions (“patternsearch”,“缓存”,“上”);
如果你不能使用patternsearch
,并且有一个相对低维的无约束最小化问题,尝试fminsearch
代替。fminsearch
不使用有限差分。然而,fminsearch
不是一个快速或可调的求解器。
设置更大的有限差分。有时你可以避免在有限差分问题通过采用比默认值更大的有限差分步骤。
如果你有MATLAB®R2011b或更高版本,将有限差步长选项设置为大于默认值的值
sqrt (eps)
或eps ^ (1/3)
,如:R2011b-R2012b:
选择= optimset (“FinDiffRelStep”1 e - 3);
为R2013a-R2015b和一个求解器命名为
“solvername”
:选择= optimoptions (“solvername”,“FinDiffRelStep”1 e - 3);
对于R2016a和一个求解器命名为
“solvername”
:选择= optimoptions (“solvername”,“FiniteDifferenceStepSize”1 e - 3);
如果在不同的分量中有不同的尺度,将有限差分步长设为与分量尺度成比例的向量。
如果你有MATLAB R2011a或更早版本,设置
DiffMinChange
选项设置为比默认值大的值1 e-8
,并可能设置DiffMaxChange
选项,例如:选择= optimset (“DiffMinChange”1 e - 3,“DiffMaxChange”1);
请注意
很难知道如何设置这些有限的差异大小。
你也可以尝试设置中心有限差分:
选择= optimoptions (“solvername”,“FiniteDifferenceType”,“中央”);
使用梯度评估函数。为了避免有限差分估计的问题,你可以在你的目标和非线性约束中给出一个近似的梯度函数。记得设置SpecifyObjectiveGradient
选项真正的
使用optimoptions
,如果相关,还设置SpecifyConstraintGradient
选项真正的
.
对于一些ODE,你可以在求解ODE的同时计算梯度。例如,假设目标函数的微分方程z(t,x)是
在哪里x是你最小化的参数向量。假设x是一个标量。然后是微分方程的导数y,
是
在哪里z(t,x)为目标函数ODE的解。你可以解出y(t,x)在同一个微分方程组中z(t,x).这个解给出了一个近似的导数而不需要取有限差分。对于nonscalarx,求解每个分量一个ODE。
关于这种方法的理论和计算方面,请参阅Leis和Kramer[2].对于这种方法和有限差分方法的计算经验,请参见raaue等人的图7。[3].
对于某些模拟,您可以在模拟中估计一个导数。例如,在Reiman和Weiss中描述的似然比技术[4]或者是Heidelberger, Cao, Zazanis和Suri所分析的无穷小摄动分析技术[1]在估计目标函数或约束函数的相同模拟中估计导数。
使用更严格的ODE公差。您可以使用odeset
设置AbsTol
或RelTol
ODE求解器对低于其默认值的公差。但是,选择过小的公差会导致解决方案缓慢、收敛失败或其他问题。永远不要选择一个容忍不到的人1 e-9
为RelTol
.的各组成部分的下限AbsTol
这取决于你的问题的严重程度,所以没有建议。
随机函数中的若干问题
如果模拟使用随机数,则对目标函数或约束函数计算两次会返回不同的结果。这既影响函数估计,也影响有限差分估计。有限差分的值可能由随机性引起的变化所决定,而不是由不同的评价点引起的变化所决定x而且x+δ.
关于随机函数的建议
如果您的模拟使用来自您控制的流的随机数,那么在每次评估目标或约束函数之前重置随机流。这种做法可以减少结果的可变性。例如,在一个目标函数中:
函数f = mysimulation(x) RNG默认%或任何其他重置方法…结束
有关详细信息,请参见生成可重复的随机数.
目标和约束条件的通用计算
通常,模拟会在同一模拟运行期间评估目标函数和约束。或者,目标函数和非线性约束函数都使用同样昂贵的计算。连接器等fmincon
分别计算目标函数和非线性约束函数。这可能导致极大的效率损失,因为求解器调用了两次昂贵的计算。要避免这个问题,可以使用中的技术同一函数中的目标约束与非线性约束,或者,当使用基于问题的方法时,目标和约束在串行或并行中具有共同功能,基于问题.
目标或约束函数评价失败
对于某些参数值,模拟或ODE可能会失败。
评估失败的建议
设置适当的界限。虽然您可能不知道参数空间的所有限制,但尝试为所有参数设置适当的边界,包括上下限。这可以加速优化,并帮助求解器避免有问题的参数值。
使用一个尊重边界的求解器。中描述的迭代可能会违反约束,有些算法在中间迭代时可能会违反约束。为了优化模拟和ode,使用始终服从约束的算法。看到满足约束条件的算法.
返回NaN。如果模拟或ODE求解器在某一点上不能成功地求出目标函数或非线性约束函数x函数返回南
.最优化工具箱和全局优化工具箱求解器有鲁棒性尝试不同的迭代步骤,如果他们遇到南
价值。这些健壮的求解器包括:
fmincon
内点
,sqp
,trust-region-reflective
算法fminunc
lsqcurvefit
lsqnonlin
patternsearch
有些人倾向于在不成功、不可行或其他糟糕的点返回任意大的目标函数值。但是,这种做法会使求解器感到困惑,因为求解器没有意识到返回值是任意的。当你返回南
,求解器可以尝试在不同的点上求值。
参考书目
海德堡,P。曹,M. A.扎赞尼斯,R.苏瑞。无穷小摄动分析估计的收敛性.《管理科学》34期,第11期,第1281-1302页,1988。
[2] j.r.雷丝和M.A.克莱默常微分方程描述系统的联立解与灵敏度分析。ACM反式。《数学软件》,1988年第14卷第1期,第45-60页。
[3]劳伊,A.等。系统生物学定量动力学建模的经验教训。可以在https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0074335
, 2013年。
[4]莱曼,m.i.和A.韦斯。通过似然比进行灵敏度分析.第十八届冬季模拟会议ACM,纽约,页285-289,1986。