有时,目标函数或非线性约束函数值只能通过模拟或常微分方程(ODE)的数值解来获得。这类优化问题有几个共同的特点和挑战,在潜在问题及解决方案金宝搏官方网站.
有关优化ODE的基于问题的示例,请参见适合的颂歌,具体问题具体分析.有关基于求解器的示例,请参见拟合常微分方程(ODE).
优化Simulink金宝app®模型容易,试用使用金宝app仿真软件优化设计™.
最优化工具箱™求解器在内部使用目标函数和约束函数的导数。默认情况下,他们使用有限差分近似的形式来估计这些导数
或
这些有限差分近似可能是不准确的,因为:
很大的价值δ允许更多的非线性影响有限差分。
小值δ由于数值的精度有限,导致不准确。
具体来说,对于ode的模拟和数值解:金宝搏官方网站
模拟通常对参数的微小变化不敏感。这意味着如果你使用的微扰太小δ,模拟可以返回一个伪估计导数为0。
微分方程的模拟解和数值解在函数评价中都存在误差。金宝搏官方网站在有限差分近似中,这些误差会被放大。
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.扎扎尼斯,R.苏瑞。微扰分析估计的收敛性.《管理科学》34卷第11期,第1281-1302页,1988。
Leis, J. R.和Kramer, M.A.常微分方程描述系统的联立解及灵敏度分析。ACM反式。数学软件,Vol. 14, No. 1, pp. 45-60, 1988。
Raue, A.等。从系统生物学定量动力学建模中吸取的教训。可以在https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0074335
, 2013年。
莱曼,m.i.和A. Weiss。通过似然比进行敏感性分析.第十八届冬季模拟大会, ACM,纽约,第285-289页,1986。