在 MATLAB 中,ode45 http://www.mathworks.com/help/techdoc/ref/ode45.html有一个参数叫做NonNegative http://www.mathworks.com/help/techdoc/ref/odeset.html#f92-1016858这将解决方案限制为非负。他们甚至写了一篇关于这种方法如何运作的论文 http://www.sciencedirect.com/science/article/pii/S0096300304009683以及它如何不像每当 y_i 变为负数时将 y_i 设置为 0 那么愚蠢,因为这通常不起作用。
现在,MATLAB也有dde23 http://www.mathworks.com/help/techdoc/ref/dde23.html用于求解时滞微分方程,但没有等价的NonNegative
该积分器的参数。
不幸的是,我的任务是向现有的 ODE 系统添加延迟,该系统可以使用以下方法解决ode45 http://www.mathworks.com/help/techdoc/ref/ode45.html with NonNegative http://www.mathworks.com/help/techdoc/ref/odeset.html#f92-1016858已启用。
有什么想法我应该如何进行?
EDIT:
我不确定这是否有帮助,但是......
我系统的 DDE 部分基本上如下所示:
dx = 1/(1+y*z) - x;
dy = (y*z)^2/(1+(y*z)^2) - y;
dz = X - z;
where X
(第三个方程中的大写字母变量)是延迟版本x
。然后,我通过在方程中添加几个项,将此 DDE 系统链接到现有(和更大的)ODE 系统x
and 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;
现在清洗、漂洗,然后重复。请注意,X 现在是一个准时间相关项,如示例 3 所示ode45 http://www.mathworks.com/help/techdoc/ref/ode45.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)