在PyDSTool中定义微分方程中的变量相关函数

时间:2016-11-04 15:25:49

标签: python

我在'PyDSTool'中是全新的,请原谅我,如果它看起来很傻。我想在'PyDSTool'中定义两个非线性微分方程。有一个非线性函数将变量作为输入:

  S(x1) = 1/(1+exp(x1-a))

所以我写道:

from PyDSTool import *
icdict = {'x':0,'y':0.2}
pardict = {
  'c1': 16.0,
  'c2': 12,
  'c3':15,
  'c4':3,
  'ax':1.3,
  'ay':2.,
  'rx':1.,
  'ry':1.,
  'P':1.25,
  }

def Func(x,a): #nonlinear function
  return (['x'],'1./(1. + exp(x-%.2f))'% a)

auxfndic = {'funx': Func(c1*x -c2*y+P,ax),'funy': Func(c3*x -c4*y,ay)}
xstr = ' (-x + (1 - rx * x)* funx(x,y))'
ystr = ' (-y + (1 - ry * y)* funy(x,y))'
vardict = {'x': xstr,'y':ystr}

DSargs = args()
DSargs.name = 'test_Equations'
DSargs.ics = icdict
DSargs.pars = pardict
DSargs.tdata = [0, 200]
DSargs.varspecs = vardict

DS = Generator.Vode_ODEsystem(DSargs)

traj = DS.compute('test')
pts = traj.sample()

plt.plot(pts['t'], pts['x'], 'k', label='x')
plt.legend()
plt.show()

c1无法被函数读取。

  NameError: name 'c1' is not defined

我不知道如何在ODE中定义Func,它将变量作为输入。感谢任何指南。

修改

...
def Func(x,a): #nonlinear function
  return (['x'],'1./(1. + exp(x-%.2f))'% a)


auxfndic = {'funx': lambda x,y,c1,c2: Func(c1*x -c2*y+P,ax),
            'funy': lambda x,y,c3,c4: Func(c3*x -c4*y,ay)}
xstr = ' (-x + (1 - rx * x)* funx(x,y))'
ystr = ' (-y + (1 - ry * y)* funy(x,y))'
vardict = {'x': xstr,'y':ystr}

DSargs = args()
DSargs.name = 'test_Equations'
DSargs.ics = icdict
DSargs.pars = pardict
DSargs.fnspecs = auxfndic
DSargs.tdata = [0, 200]
DSargs.varspecs = vardict    
DS = Generator.Vode_ODEsystem(DSargs)
traj = DS.compute('test')
pts = traj.sample()
plt.plot(pts['t'], pts['x'], 'k', label='x')
plt.legend()
plt.show()

同样的错误。

1 个答案:

答案 0 :(得分:2)

这显然不起作用:

auxfndic = {'funx': Func(c1*x -c2*y+P,ax),'funy': Func(c3*x -c4*y,ay)}

c1确实没有定义。您定义了paradict['c1']。如果要为func定义参数化包装函数,则需要以下内容:

lambda x,c1,c2: Func(c1*x -c2*y+P,ax),

这定义了一个可以接受参数的动作,但显然仍然需要x。你可以像这样定义你的助手。

由于你没有在你的代码中使用它,我不知道你将如何继续。