优化一个模拟或常微分方程
什么是优化模拟或ODE?
有时你的目标函数或非线性约束函数值只能通过模拟或常微分方程(ODE)的数值解来获得。这样的优化问题有几个共同的特征和挑战,讨论潜在问题及解决方案金宝搏官方网站.
有关优化ODE的基于问题的示例,请参见使用优化变量拟合ODE参数.有关基于求解器的示例,请参见拟合常微分方程(ODE).
有关避免其他方法遇到的许多问题的方法,请参见离散最优轨迹,基于问题.该方法可在优化过程中使用自动微分。然而,由于该方法是基于固定步长且可能是低阶ODE求解算法,因此精度相对较低。
优化Simulink金宝app®建模容易,尝试使用金宝appSimulink设计优化™.
潜在问题及解决方案金宝搏官方网站
有限差分问题
优化工具箱™求解器内部使用目标函数和约束函数的导数。默认情况下,他们使用这种形式的有限差分近似来估计这些导数
或
这些有限差分近似可能是不准确的,因为:
很大的价值δ允许更多的非线性影响有限差分。
一个很小的值δ由于数字精度有限,导致不准确。
具体来说,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].对于这种方法和有限差分方法的计算经验,请参见Raue等人的图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. X.-R。曹,M. A. Zazanis和R. Suri。无穷小摄动分析估计的收敛性.《管理科学》34,第11期,第1281-1302页,1988。
[2]莱斯,J. R.和克莱默,硕士常微分方程组方程组的联立解与灵敏度分析。ACM反式。《数学软件》,Vol. 14, No. 1, pp. 45 - 60,1988。
[3]劳伊,A.等。系统生物学定量动力学建模的经验教训。可以在https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0074335
, 2013年。
m.i.a Weiss和Reiman。通过似然比进行敏感性分析.第十八届冬季模拟会议进程,纽约,第285-289页,1986。