简体   繁体   中英

Logical Error in Python Simulation

This python program is supposed to simulate an object being thrown off a 50 meter building, with some initial velocity and constant gravitational acceleration. I am using arrays to store the different components, but when it's time to do my computations, my resulting matrix is not turning out like it should. In fact, the resulting matrix is for the most part still empty. What could be causing this problem?

 x = z = vz = vy = ax = ay = time = 0.0
 y = 50 #Initial Height: 50 meters
 vx = 25 #Initial velocity in the x direction: 25 m/s
 az = -9.8 #Constant acceleration in the z direction: -9.8 m/s^2
 deltaTime = .000001

 #Initializes a matrix with 3 columns and 1000 rows for each column: Will hold the corresponding x,y,z coordinate of the particle at time t
 positionMatrix = [[None]*1000 for x in range(3)] 

 posArray = [x, y, z] 
 velArray = [vx, vy, vz] 
 accArray = [ax, ay, az]
 timeArray = [i*deltaTime for i in range(1000)]

 j = 1 #time increment

 for j in range (1,500): #j is the time increment
     for i in range (1,3): #i is each component (x, y, z)

         #x = x + vx*time + .5*ax*(time*time); #y = y + vy*time + .5*ay*(time*time); #z =    z + vz*time + .5*az*(time*time)
         positionMatrix[i][j] = posArray[i] + velArray[i] * timeArray[j] +  1/2*accArray[i] * timeArray[j] * timeArray[j]
         print(positionMatrix)

I am not sure you have a valid question? How are you judging failure? Is it because you are printing out positionMatrix each time?

It just looks like nothing is there because you are printing out 3k None's each iteration. Change your line of code from:

print(positionMatrix)

to

print(positionMatrix[i][j])

I did a

cnt=0
for j in range (1,500): #j is the time increment
  for i in range (1,3): #i is each component (x, y, z)
    positionMatrix[i][j] = posArray[i] + velArray[i] * timeArray[j] +  1/2*accArray[i] * timeArray[j] * timeArray[j]
    if(positionMatrix[i][j] == None):
        cnt +=1
print 'none count' , cnt

Result was

none count 0

So you can see that each row is getting set to something. At least the ones you are processing, start your range at 0(dont specify 1).

for j in range (500): #j is the time increment
  for i in range (3): #i is each component (x, y, z)

Your ranges are wrong - posArray is indexed from 0 to 2 (so posArray[0] = x, posArray[1] = y, posArray[2] = z). Also, you're printing out the matrix every time, so you'll see lots of None there.

You also put 1000 rows in the array, but then only fill 500 of them in.

You should replace the last block of code with:

 for j in range (1000):
     for i in range (3):
         positionMatrix[i][j] = posArray[i] + velArray[i] * timeArray[j] +  1/2*accArray[i] * timeArray[j] * timeArray[j]

 print(positionMatrix)

我不知道这是你代码中唯一的甚至是最重要的问题,但是你的范围是1开始。这意味着你永远不会遍历数组的第一个元素,索引为0。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM