我刚开始使用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')
答案 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),我只需要比评论中更多的空间:)