kachilous
kachilous

Reputation: 2529

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)

Upvotes: 0

Views: 168

Answers (3)

thomson_matt
thomson_matt

Reputation: 7691

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)

Upvotes: 1

Nix
Nix

Reputation: 58562

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)

Upvotes: 1

jhocking
jhocking

Reputation: 5577

I don't know if this is the only or even most important issue in your code, but you start your ranges at 1. That means you never loop through the first element of the arrays, index 0.

Upvotes: 0

Related Questions