我使用dde23 of pydelay软件包来求解一个时滞微分方程。我的问题是:如何有条件地编写方程?例如,目标方程有两个选项:
when x>1, dx/dt=0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x
otherwise, dx/dt=0.25 * x我尝试了两种方法,但似乎两种方法都没有用:
方法1(使用if else语句更新eqns,这是一个python ):
import numpy as np
import pylab as pl
from pydelay import dde23
eqn_1a='0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x'
eqn_1b='0.45 * x'
eqns = { 'x' : eqn_1a if 'x>1' else eqn_1b}
dde = dde23(eqns=eqns, params={'tau': 15})
dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3)
histfunc = {'x': lambda t: 0.5 }
dde.hist_from_funcs(histfunc, 51)
dde.run()
sol1 = dde.sample(2, 3, 0.1)
x1 = sol1['x']方法2(向求解者提供c代码):
eqns = { 'x' : 'f(x, tau)'}
# We can define a c function to be used in the equations
mycode = """
double f(double x, double tau) {
if (x>1){
return (0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x);
}
else{
return (0.45 * x);
}
}
"""
dde = dde23(eqns=eqns, params={'tau': 15}, supportcode=mycode)
dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3)
histfunc = {'x': lambda t: 0.5 }
dde.hist_from_funcs(histfunc, 51)
dde.run()
sol1 = dde.sample(1, 300, 1)
x1 = sol1['x']发布于 2013-10-18 22:14:58
第二种方法只需做一个小小的改动。延迟变量的值必须作为参数直接传递给函数。
eqns = { 'x' : 'f(x, x(t - tau))'}
mycode = """
double f(double x, double x_tau) {
if (x > 1.0){
return 0.25 * x_tau / (1.0 + pow(x_tau, 10.0)) -0.1*x;
}
else{
return 0.45 * x;
}
}
"""虽然这是运行的,但请注意,它不能给出一个非常准确的解决方案。这是由于x=1的不连续性。更高级的求解器可以显式地处理这种不连续(参见http://www.radford.edu/~thompson/ffddes/)。
如果您想为了方便而坚持使用pydelay解决程序,或者只是为了获得一个概述,您可以尝试将最大步长dtmax设置得足够小,以减少错误。
https://stackoverflow.com/questions/19457673
复制相似问题