2

我刚开始使用 Python 并且有一堆我想从 Matlab 转移过来的代码。我从一个简单的耦合 diff eq 开始,似乎无法弄清楚我做错了什么。似乎第二个 diff eq 几乎给了我适当的结果,但第一个方程在整个时间跨度内仅保持在其初始条件。第一个图像是 Python 结果,第二个是 Matlab 的正确结果。

1) 2)

from scipy.integrate import odeint
from pylab import *

minfH_ab = lambda v: 1/(1 + exp((v+70)/6))
taumH_ab = lambda v: 272 + 1499/(1 + exp(-(v+42.2)/8.73))


Csn = 9    
I_ab_sn  = 0
gL_ab_sn = 0.045 
El_ab_sn = -50
gH_ab   = 0.054
Eh_ab   = -20

def dy_dt(y, t):
    dy1 = (1/Csn)*(I_ab_sn -((gH_ab*y[1]*(y[0]-Eh_ab))+(gL_ab_sn*(y[0]-El_ab_sn))))
    dy2 = (minfH_ab(y[0])-y[1])/taumH_ab(y[0])
    return [dy1, dy2]


t = linspace(0,1000,10000)
y_init = [-50, .0004]

sol = odeint(dy_dt, y_init, t)
S0 = sol[:, 0]
S1 = sol[:, 1]

figure()
plot(t, S0)
xlabel('time')
ylabel('voltage')
title('H & L Current')
4

2 回答 2

4

因为这是答案:

小心整数算术。

如果您从默认情况下不执行此操作的语言移植,您可能会感到惊讶

x=50
y=6
z=5

x*y/z == 60
x*(y/z) == 50
x/y*z == 40
x*z/y == 41

等等。尝试将所有常量更改为双精度(5->5.0等),看看是否有帮助。

编辑:@BenDundee 指出,python 将把语法切换/为“真正的除法”,并用//运算符指定整数除法。您现在可以使用该行切换到该行为from __future__ import division,这也应该可以解决问题。

于 2013-08-01T18:15:37.027 回答
2

我只想指出,这种行为已从 Python2 更改为 Python3。如果你想要 Python3 的行为,你可以添加from __future__ import division到文件的顶部。

Python 2.7.3 (default, Aug 28 2012, 15:45:09) 
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.60))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/3
0
>>> from __future__ import division
>>> 1/3
0.3333333333333333
>>> 

无论如何,这并没有为@zebediah49 的回答添加任何内容(即,他应该得到支持),我只需要比评论中更多的空间:)

于 2013-08-01T18:21:18.027 回答