2

Python を使い始めたばかりで、Matlab から移行したいコードがたくさんあります。私は単純な連結差分 eq から始めましたが、何が間違っているのかわかりません。2 番目の diff 式はほぼ適切な結果を示しているようですが、最初の式は全期間にわたって初期状態のままです。最初の画像は Python の結果で、2 番目の画像は 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

等々。すべての定数を double ( 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の答えに何も追加していません(つまり、(s)彼は賛成票を得る必要があります)、コメントよりも多くのスペースが必要でした:)

于 2013-08-01T18:21:18.027 に答える