在Python中用ODE的耦合系统再现Matlab结果时遇到问题

2024-05-23 13:48:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用Python,有一堆代码我想从Matlab转换过来。我从一个简单的耦合微分方程开始,似乎不知道我做错了什么。看起来第二个微分方程几乎给了我合适的结果,但是第一个方程在整个时间跨度内都保持在初始状态。第一幅图像是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')

Tags: lambdafromimportabghelmatlabsn
2条回答

既然答案是这样的:

注意整数运算

如果您是从一种默认情况下不这样做的语言进行移植,您可能会惊讶于

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,等等),看看是否有帮助。你知道吗

EDIT:@BenDundee指出python将把语法转换为/,意思是“实数除法”,整数除法是用//操作符指定的。现在可以使用from __future__ import division行切换到该行为,这也应该可以解决问题。你知道吗

我只想指出,这个行为已经从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的答案增加任何内容(即,(s)他应该获得投票权),我只是需要比评论中更多的空间:)

相关问题 更多 >