我在'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()
同样的错误。
答案 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
。你可以像这样定义你的助手。
由于你没有在你的代码中使用它,我不知道你将如何继续。