2017-11-22 14 views
0
import numpy as np 

# constants 
n=1000     # number of time steps to simulate 
m=90     # number of angles 
rho=1.225    # kg/m^3 
g=-9.8     # m/s^2 
start=0.0    # seconds 
end=10     # seconds 
initial_velocity=70  # meters/second 
initial_height=5 

# object 
A=.8   # surface area m^2 
C=1.4   # drag coefficient 
mass=65   # mass of object in kg 

# parameters of simulation 
angles=np.array([i for i in range(1,m+1)]) 
radians=np.radians(angles) 

#initalize state variables 
t=np.linspace(start,end,n+1) 
vx=np.zeros((m,n+1),dtype=np.float64) 
vy=np.zeros((m,n+1),dtype=np.float64) 
x=np.zeros((m,n+1),dtype=np.float64) 
y=np.zeros((m,n+1),dtype=np.float64) 

for i in range(m): 
     y[i][0]=initial_height 
     vx[i][0]=initial_velocity*np.cos(radians[i]) 
     vy[i][0]=initial_velocity*np.sin(radians[i]) 

# begin simulation 
for i in range(m): 
    for j in range(1,n+1): 
     if y[i,j-1]<=0: 
      vx[i,j]=0 
      vy[i,j]=0 
      y[i,j]=0 
      x[i,j]=x[i,j-1] 
     else: 
      # the following code is _corrected_ from the wrong math 
      v = np.sqrt(vx[ j-1 ]**2 + vy[ j-1 ]**2) 
      ax = -(0.5*rho*C*A/mass) * v**2 * (vx[ j-1 ]/v) 
      ay = g - (0.5*rho*C*A/mass) * v**2 * (vy[ j-1 ]/v) 
      dt=t[j]-t[j-1] 
      vx[i,j]=vx[i,j-1]+ax*dt 
      vy[i,j]=vy[i,j-1]+ay*dt 
      x[i,j]=x[i,j-1]+vx[i,j]*dt 
      y[i,j]=y[i,j-1]+vy[i,j]*dt 
      if y[i,j]<=0: 
       y[i,j]=0 
       x[i,j]=x[i,j-1] 
       vx[i,j]=0 
       vy[i,j]=0 

best_distance=0 
best_angle=0 
for i in range(m): 
    if x[i,-1]>best_distance: 
     best_distance=x[i,-1] 
     best_angle=i+1 

問題は、加速度と前回の速度をdtの間隔で計算しようとしています。すべての式がすべてvx [i、j]に関する数字なので、ここで何が問題なのですか?助けてください! vxとvyはすべてデータを格納する2次元配列なので、ドラッグを含む実際の速度を計算します。私は投影についてよりよくシミュレートするためにvを導入しました。あなたが追加し、乗算ときにエラー:シーケンスを使用して配列を設定する

array([-51.70596988,   nan,   nan, ...,   nan, 
       nan,   nan]) 

:ちょうど私はあなたが言及してエラーが出る時点で、あなたのエラーを見るためにあなたのコードを実行している

+0

ここで問題は何ですか?あなたはどんな結果を得ますか? –

+0

'angles = np.array([範囲(1、m + 1)])')は 'angles = np.arange(1、m + 1)'として表現するのが良いでしょう。同じ振る舞いのために '、dtype = np.int'をargsに追加する必要があります。なんらかの理由で 'np.array'を使う必要があるならば、少なくとも' list(range(1、m + 1)) 'だけで' [iは範囲(1、m + 1) 。 –

答えて

0

ValueError        Traceback (most recent call last) 
<ipython-input-12-2458d409946f> in <module>() 
    46    ay = g - (0.5*rho*C*A/mass) * v**2 * (vy[ j-1 ]/v) 
    47    dt=t[j]-t[j-1] 
---> 48    vx[i,j]=vx[i,j-1]+ax*dt 
    49    vy[i,j]=vy[i,j-1]+ay*dt 
    50    x[i,j]=x[i,j-1]+vx[i,j]*dt 

ValueError: setting an array element with a sequence. 

axはnumpyの配列ですスカラーで配列を取得した後、vx[i,j]に割り当てようとします。これは単一の要素です(ベクトルを割り当てることはできません)。そう、nanの束がaxにあるのを見ているので、何かが間違っている可能性があります。このコードのロジックにはデバッグが必要です。

+0

ありがとうございます、私はvxとvyが実際には2D配列であることを発見しました。インデックス用に余分なiが必要です –

関連する問題