在重现Matlab时遇到问题导致Python用于ODE的耦合系统

时间:2013-08-01 17:53:42

标签: python matlab

我刚开始使用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')

2 个答案:

答案 0 :(得分: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切换到该行为,这也应解决问题。

答案 1 :(得分: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的答案添加任何内容(即,他应该得到upvote),我只需要比评论中更多的空间:)