2015-11-05 71 views
0

相關我剛纔的問題:Having much trouble with 'preallocating cell arrays' in Python類型錯誤「浮動」對象在數組賦值沒有屬性「__getitem__」

我實現的建議,現在有兩個代碼 - 一個運行odeint在SciPy的,和一個正在運行的vode。他們都給我同樣的錯誤,我不知道如何解決。

這是我的註釋的代碼:

import numpy as np 
from scipy.integrate import odeint 

#Constants and parameters 
N = 2 
K00 = np.logspace(0,3,101,10) 
len1 = len(K00) 
epsilon = 0.01 
y0 = [0]*(3*N/2+3) 
u1 = 0 
u2 = 0 
u3 = 0 
Kplot = np.zeros((len1,1)) 
Pplot = np.zeros((len1,1)) 
S = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
KS = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
PS = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
Splot = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
KSplot = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 
PSplot = [np.zeros((len1,1)) for kkkk in range(N/2+1)] 

for alpha in range(0,(N/2+1)): 
    Splot[alpha] = np.zeros((len1,1)) 
for beta in range((N/2)+1,N+1): 
    KSplot[beta-N/2-1] = np.zeros((len1,1)) 
for gamma in range(N+1,3*N/2+1): 
    PSplot[gamma-N] = np.zeros((len1,1)) 

for series in range(0,len1): 
    K0 = K00[series] 
    Q = 10 
    r1 = 0.0001 
    r2 = 0.001 
    a = 0.001 
    d = 0.001 
    k = 0.999 
    S10 = 1e5 
    P0 = 1 
    tfvec = np.tile(1e10,(1,5)) 
    tf = tfvec[0,0] 
    time = np.linspace(0,tf,len1) 

    #Defining dy/dt's 
    def f(t,y): 
     for alpha in range(0,(N/2+1)): 
      S[alpha] = y[alpha] 
     for beta in range((N/2)+1,N+1): 
      KS[beta-N/2-1] = y[beta] 
     for gamma in range(N+1,3*N/2+1): 
      PS[gamma-N] = y[gamma] 
     K = y[3*N/2+1] 
     P = y[3*N/2+2] 

     # The model equations 
     ydot = np.zeros((3*N/2+3,1)) 
     B = range((N/2)+1,N+1) 
     G = range(N+1,3*N/2+1) 
     runsumPS = 0 
     runsum1 = 0 
     runsumKS = 0 
     runsum2 = 0 

     for m in range(0,N/2): 
      runsumPS = runsumPS + PS[m+1] 
      runsum1 = runsum1 + S[m+1] 
      runsumKS = runsumKS + KS[m] 
      runsum2 = runsum2 + S[m]  
      ydot[B[m]] = a*K*S[m]-(d+k+r1)*KS[m] 

     for i in range(0,N/2-1): 
      ydot[G[i]] = a*P*S[i+1]-(d+k+r1)*PS[i+1] 

     for p in range(1,N/2): 
      ydot[p] = -S[p]*(r1+a*K+a*P)+k*KS[p-1]+ \ 
         d*(PS[p]+KS[p]) 

     ydot[0] = Q-(r1+a*K)*S[0]+d*KS[0]+k*runsumPS 
     ydot[N/2] = k*KS[N/2-1]-(r2+a*P)*S[N/2]+ \ 
        d*PS[N/2] 
     ydot[G[N/2-1]] = a*P*S[N/2]-(d+k+r2)*PS[N/2] 
     ydot[3*N/2+1] = (d+k+r1)*runsumKS-a*K*runsum2 
     ydot[3*N/2+2] = (d+k+r1)*(runsumPS-PS[N/2])- \ 
         a*P*runsum1+(d+k+r2)*PS[N/2] 

     for j in range(0,3*N/2+3): 
      return ydot[j] 

    # Initial conditions 
    y0[0] = S10 
    for i in range(1,3*N/2+1): 
     y0[i] = 0 
    y0[3*N/2+1] = K0 
    y0[3*N/2+2] = P0 

    # Solve the DEs 
    soln = odeint(f,y0,time) 
    for alpha in range(0,(N/2+1)): 
     S[alpha] = soln[:,alpha] 
    for beta in range((N/2)+1,N+1): 
     KS[beta-N/2-1] = soln[:,beta] 
    for gamma in range(N+1,3*N/2+1): 
     PS[gamma-N] = soln[:,gamma] 

    for alpha in range(0,(N/2+1)): 
     Splot[alpha][series] = soln[len1-1,alpha] 
    for beta in range((N/2)+1,N+1): 
     KSplot[beta-N/2-1][series] = soln[len1-1,beta] 
    for gamma in range(N+1,3*N/2+1): 
     PSplot[gamma-N][series] = soln[len1-1,gamma] 

    for alpha in range(0,(N/2+1)): 
     u1 = u1 + Splot[alpha] 
    for beta in range((N/2)+1,N+1): 
     u2 = u2 + KSplot[beta-N/2-1] 
    for gamma in range(N+1,3*N/2+1): 
     u3 = u3 + PSplot[gamma-N] 

    K = soln[:,3*N/2+1] 
    P = soln[:,3*N/2+2] 
    Kplot[series] = soln[len1-1,3*N/2+1] 
    Pplot[series] = soln[len1-1,3*N/2+2] 
    utot = u1+u2+u3 

錯誤消息是如下:

 45  def f(t,y): 
    46   for alpha in range(0,(N/2+1)): 
---> 47    S[alpha] = y[alpha] 
    48   for beta in range((N/2)+1,N+1): 
    49    KS[beta-N/2-1] = y[beta] 

TypeError: 'float' object has no attribute '__getitem__' 

我需要S的每個元素,這是一個數組指派,一個位置在y陣列。儘管如何?

在此先感謝您的幫助。

+2

明顯地,'S'或'y' **中的一個或兩個不是**數組;這是一個浮動,每個錯誤消息。 – jonrsharpe

+1

如果您預先將'S'分配爲一個零數組(實際上是一個零數組列表,看起來很奇怪,但可能不是問題),它將如何成爲一個浮點數?更有可能的是'y'參數是浮點數,但'print type(S),type(y)'會告訴你。 – jonrsharpe

+0

明白了,但type(y)給了我「NameError:name'y'沒有定義」。 'f'裏面有 –

回答

相關問題