2017-06-09 10 views
1

これは私が取り組んでいるプロジェクトです。私は地殻の中のいくつかの宿主または国の岩の中でマグマ冷却の侵入的な堤防をモデル化しようとしています。私はかなり新しいコーディングです。このコードを別のコーディング言語からPythonに変換するために最善を尽くしました。私は何が起こっているのか基本的な考えがあります。私は範囲外のもののインデックスを作成しようとしていることを知っていますが、どこでどのように修正するかはわかりません。私が得ることができるどんな助けも大いに評価されるでしょう!前もって感謝します。なぜこのエラーが発生するのかわかりませんが、アイデアはありますが、修正方法がわかりません

import numpy as np 
import matplotlib.pyplot as plt 

#Physical parameters 
L = 100 #Length of modeled domain [m] 
Tmagma = 1200 #Temp. magma [°C] 
Trock = 300 #Temp. of country rock [°C] 
kappa = 1e-6 #Thermal diffusivity of rock [m^2/s] 
W = 5 #Width of dike [m] 
day = 3600*24 #seconds per day 
dt = 1*day #Timestep 
print(kappa) 
print(day) 
print(dt) 



#Numerical parameters 
nx = 201 #Number of gridpoints in x-direction 
nt = 500 #Number of timesteps to compute 
dx = L/(nx-1) #Spacing of grid 
x = np.linspace(-50,50,100) #Grid 
print(dx) 
print(x) 

#Setup initial temp. profile 
T = np.ones(np.shape(x))*Trock 
T[x>=-W/2] = 1200 
T[x>=W/2] = 300 
print(T) 


time = 0 
for n in range(0,nt): #Timestep loop 
    #compute new temp. 
    Tnew = np.zeros((1,nx)) 
    print(Tnew) 
    for i in range(2,nx-1): 
     Tnew[i] = T[i]+kappa*dt*((T[i+1]-2*T[i]+T[i-1])/(dt**2))    # Set BC's 
    Tnew[1] = T[1] 
    Tnew[nx] = T[nx] 

    #update temp. and time 
    T = Tnew 
    time = time+dt 

    #Plot solution 
    plt.figure() 
    plt.plot(x,Tnew) 
    plt.xlabel('x [m]') 
    plt.ylabel('Temerpature [°C]') 
    plt.legend() 
    surf = ax.plot_surface(X, Y, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
    fig.colorbar(surf, shrink=0.5, aspect=5) 
    plt.show() 

IndexError        Traceback (most recent call last) 
<ipython-input-51-e80d6234a5b4> in <module>() 
    37  print(Tnew) 
    38  for i in range(2,nx-1): 
---> 39   Tnew[i] = T[i]+kappa*dt*((T[i+1]-2*T[i]+T[i-1])/(dt**2)) 
    40 
    41  # Set BC's 

IndexError: index 2 is out of bounds for axis 0 with size 

答えて

0
Tnew = np.zeros((1,nx)) 

この意志はあなたに、アレイ内のNX要素(二次元配列)の1つの配列を与える、あなたは[0] [i]は

だけ

に変更しTnewのようにアクセスする必要があります
Tnew = np.zeros((nx)) 

チェックnumpy.zeros DOC

NO TE:このエラーを解決した後は、「i」が最後の要素に到達したときに「i + 1」要素を取得しないため、「T [i + 1]」のインデックスエラーが発生します。 T '。

0

もしTnewを与えた形状、すなわち、それは1バイnx 2次元配列の、(1,nx)あります。

1Dアレイのみが必要な場合は、代わりにTnew = np.zeros(nx)と設定します。または、2Dを維持したい場合は、Tnew[0,i]にアクセスしてください。

関連する問題