求解延迟微分方程(DDE)系统受限于给出非负解

时间:2011-08-08 01:53:54

标签: matlab scipy numerical-methods differential-equations numerical-integration

在MATLAB中,ode45有一个名为NonNegative的参数,它将解决方案限制为非负。 They even wrote a paper about how this method works以及如果只是将y_i设置为0就不会像傻一样愚蠢,因为这通常不起作用。

现在,MATLAB还有dde23用于求解延迟微分方程,但该积分器没有等效的NonNegative参数。

不幸的是,我的任务是向现有的ODE系统添加延迟,该系统使用启用了ode45NonNegative来解决。

我应该如何处理?

编辑:

我不确定这是否有用,但是......

我系统的DDE部分看起来像:

 dx = 1/(1+y*z) - x;
 dy = (y*z)^2/(1+(y*z)^2) - y;
 dz = X - z;

其中X(第三个等式中的大写字母变量)是x的延迟版本。然后,我将这个DDE系统链接到现有(和更大的)ODE系统,方法是在xz的方程式中添加几个项,然后将组合系统集成在一起。

3 个答案:

答案 0 :(得分:2)

你有一个棘手的问题,我不确定是否有一步到位的解决方案。我很乐意为愿意提供替代答案的人提供荣誉。

根据延迟的长度,一个选项是多次运行方程,每次迭代都将x的旧值传递给最新更新。

例如,说你的延迟是一个小时。在第一个小时内,运行标记为NonNegative的ode45。将Value与Time参数一起存储到New矩阵中,然后再次运行算法。这次确保添加两个输入参数:旧解决方案矩阵和旧时矩阵

dx = 1/(1+y*z) - x; 
dy = (y*z)^2/(1+(y*z)^2) - y;
tindex = find(told>t,1) -1 % find the upper index which best approximates t
X = xold(tindex) + (xold(tindex+1)-xold(tindex))*(t-told(tindex))/(told(tindex+1)-told(tindex)) % or interpolation method of your choosing
dz = X - z;

现在洗,冲洗并重复。请注意,X现在是一个准时间相关项,如ode45中的示例3所示。

答案 1 :(得分:1)

我最近遇到了一些我的代码问题。 “最简单”的解决方案是执行以下操作,首先,一旦解决方案达到0,您必须将其保持为0, 因此改变

dx = 1/(1+y*z) - x; 

to(注意评估x == 0案例的地方)

if x > 0 
  dx = 1/(1+y*z) - x; 
else % if x <= 0
  dx = 0;
end

或者也许(取决于它为什么永远不会是0)

dxTmp = 1/(1+y*z) - x;
if x > 0 
  dx = dxTmp; 
elseif dxTmp > 0
  % x becomes positive again
  dx = dxTmp;
else
  dx = 0;
end

但请注意,这会在一阶导数中产生跳跃不连续性,当DDE求解器到达此点附近有t - delay的点时,它不能非常有效地解决它,除非它知道这个的确切位置不连续性(通常你会使用一个额外的选项来告诉Matlab它在哪里,但是如果你按照下面的步骤,则不需要)。

要确定此不连续的位置,您需要使用events的DDE选项(向下滚动到'事件位置属性',您还可以查看这些examples,其中一个示例实际上处理类似的系统,其中ODE中不允许负值 - ODE和DDE的事件几乎相同)。基本上事件是带有向量输出的Matlab函数,向量的每个条目都是对变量的一些或其他评估;在每一步中,Matlab检查其中一个是否等于0,当其中一个等于0时,DDE停止并返回到该点的解决方案,您必须从该部分解决方案重新启动DDE作为您的历史记录,即不是运行< / p>

sol = dde23(ddefun, lags, history, [t0 tEnd], options);

你跑(注意solt0已更改)

sol = dde23(ddefun, lags, sol, [tCurrent tEnd], options);

在这种情况下,向量的一个条目将是x(因为您希望DDE在x等于0时停止)。此外,代码行elseif dxTmp <= 0会创建另一个不连续性,因此当dxTmp变为0时需要一个事件,即1/(1+y*z) - x将是向量输出的另一个组件。

现在,当您重新启动ODE时,Matlab会自动认为此时存在不连续性,因此您不必担心告诉Matlab那里有一个。

接下来的问题是Matlab从未完全正确地实现它,xyzX的值将略微为负。因此,如果要创建问题,您需要使用

更正x(以及其他值类似)的值
if x < 0
  x = 0;
end

在计算衍生物之前。但这只会在本地更改x的值。因此,您可能希望将最终解决方案中x的所有负值更改为0。我建议您在将sol输入sol = dde23(ddefun, lags, sol, [tCurrent tEnd], options);之前不要尝试更改{{1}},因为我做了很多尝试,但我无法让它发挥作用。

答案 2 :(得分:-1)

更简单的答案,使用createOptimProblem来设置优化。您必须使用此方法为每个参数包含边界,但强制参数保持正值变得微不足道。

详细信息:http://www.mathworks.com/help/gads/createoptimproblem.html