dum*_*ter 5 matlab scipy numerical-methods numerical-integration differential-equations
在MATLAB中,ode45有一个参数调用NonNegative,它将解决方案约束为非负.他们甚至写了一篇关于这种方法是如何工作的文章,以及它不是什么愚蠢的东西,只要将y_i设置为0就会变成负数,因为这通常不起作用.
现在,MATLAB也有dde23解决延迟微分方程的问题,但NonNegative该积分器没有等效参数.
不幸的是,我任务是将延迟到使用解决了现有的ODE系统ode45与NonNegative启用.
有什么想法我应该继续吗?
编辑:
我不确定这是否有用,但......
我的系统的DDE部分看起来像:
dx = 1/(1+y*z) - x;
dy = (y*z)^2/(1+(y*z)^2) - y;
dz = X - z;
Run Code Online (Sandbox Code Playgroud)
其中X(第三个等式中的大写字母变量)是延迟版本x.然后,我通过添加几个方面的方程此DDE系统连结至现有的(以及更大)的ODE系统x和z,然后将合并的系统集成在一起.
您遇到了一个棘手的问题,我不确定是否有一步解决方案。我很乐意为任何愿意提供替代答案的人提供荣誉。
根据延迟的长度,一种选择是多次运行方程,每次迭代将 x 的旧值传递到最新更新。
例如,假设您的延误时间为一小时。在第一个小时内,运行带有 NonNegative 标记的 ode45。将值与时间参数一起存储到新矩阵中,然后再次运行算法。这次请确保添加两个输入参数:旧的解矩阵和旧的时间矩阵
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;
Run Code Online (Sandbox Code Playgroud)
现在清洗、漂洗,然后重复。请注意,X 现在是一个准时间相关项,如ode45中的示例 3 所示。