0

私はPythonを初めて使用するので、次の質問に「当たり前」の答えがある場合はすみません。

そのため、odeint を使用して ODE を解こうとしていて、配列を渡したいと考えています。しかし、 TypeError: can't duplicate sequence by non-int of type 'float' は次の行で発生し続けます:

CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))

したがって、コードは次のとおりです。

from scipy.integrate import odeint
import numpy as np

Ap_data = [2, 7, 91, 1.6, 0.4, 5]
tdata= [0, 1, 4, 5, 4, 20]
Cv_data = [43, 580, 250, 34, 30, 3]

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (derivCAb, CA_init, tdata, (Cv_data,))

print CAb_soln

助けてください。

4

2 に答える 2

0

当面の問題は、deriv関数が通常の Python list, Cv_data(として渡されるCv) をfloat値で乗算しようとしていることです。この操作をベクトル化したい場合は、NumPy 配列を使用します。

Ap_data = np.array([2, 7, 91, 1.6, 0.4, 5])
tdata= np.array([0, 1, 4, 5, 4, 20])
Cv_data = np.array([43, 580, 250, 34, 30, 3])

これを解決するために。odeintあなたは今、あなたが与えた入力に対して失敗する問題を抱えています...

 intdy--  t (=r1) illegal      
      in above message,  r1 =  0.4000000000000D+01
      t not in interval tcur - hu (= r1) to tcur (=r2)       
      in above,  r1 =  0.4287484688360D+01   r2 =  0.5551311182627D+01
 lsoda--  trouble from intdy. itask = i1, tout = r1ls
      in above message,  i1 =         1
      in above message,  r1 =  0.4000000000000D+01
Illegal input detected (internal error).
Run with full_output = 1 to get quantitative information.
[[ 21.6       ]
 [ 20.37432613]
 [ 17.09897165]
 [ 16.12866355]
 [ 16.12866355]
 [ -0.90614016]]

おそらく、あなたの方程式が何であり、それが にどのように関係しているかについて、より多くの情報を提供できますCv_data. 特に、導関数は に依存しませんtが、このパラメーターの値の範囲は ですCv

更新: 面白い時系列のために失敗します。odeint単調な場合、適切に機能します。たとえば、次のようになります。

from scipy.integrate import odeint
import numpy as np

Ap_data = [2, 7, 91, 1.6, 0.4, 5]
tdata= np.array([0, 1, 4, 5, 10, 20])
Cv_data = np.array([43, 580, 250, 34, 30, 3])

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (deriv, CA_init, tdata, (Cv_data,))
print CAb_soln

結果:

[[ 21.6       ]
 [ 20.37432613]
 [ 17.09897165]
 [ 16.12866355]
 [ 12.04306424]
 [  6.71431758]]
于 2015-02-06T23:56:10.957 に答える
0

結局のところ、私はまだ画像を投稿できません (stackoverflow は初めてです)。それで、私が使用したコードは-

from scipy.integrate import odeint
import numpy as np

Ap_data = np.array([2, 7, 91, 1.6, 0.4, 5])
tdata= [0, 1, 4, 5, 4, 20]
Cv_data = np.array([43, 580, 250, 34, 30, 3])

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (deriv, CA_init, tdata, (Cv_data,), full_output=True)

print CAb_soln
于 2015-02-08T23:50:40.560 に答える