2
我正在做一個項目,涉及到使用SciPy集成器來模擬這個射擊遊戲中的子彈運動。我從來沒有必要在Python中編寫任何程序,而我的微積分有點生疏,但幾個小時後,我也很難確定究竟是什麼原因導致某些錯誤。經過幾個小時的反覆試驗,我已經將它與集成方法中的註釋代碼一起工作(我認爲這是一個歐拉集成,但我確實不是100%肯定的)。不過,我也應該使用SciPy庫中的兩個集成商,這些集成商尚未開展工作。無論在這同一個地方拋出同樣的錯誤信息:SciPy子彈ODE集成
" File "**file extension**", line 17, in eq
projX = x[0];
TypeError: 'float' object has no attribute '__getitem__'"
好像它是期待一個不同的對象類型,但老實說,我不知道這是怎麼回事。我不知道我是否使用了集成商,或者我在設置ODE時犯了錯誤。我真的很難過。任何幫助都將不勝感激。 下面的代碼:
from numpy import *
from scipy.integrate import ode
from scipy import *
# setup wind (it will be replaced with the current value of the wind at every
# instant in time)
wd = array([0, 0])
# computes the ODE
def eq(x, t):
# setup gravitational acceleration
#this is Acceleration for Y
GRAVITY = 9.81
# get out the positions and velocities
projX = x[0];
projY = x[1];
projVX = x[2];
projVY = x[3];
# TODO: setup the acceleration
#acceleration is the derivitive of velocity (VX..VY acceleration is GRAVITY) in this case it's 0 (no wind)?
ACCELERATION = 0 #will be effected by wind
#TODO ground force
# TODO: return appropriate things
#needs to return: (x,y Time derivatives and x,y acceleration)
#acceleration is derivative of velocity. Velocity derivative of position.
#is essentially dx/dt
return array([x[2], x[3], ACCELERATION, -GRAVITY])
# integrates a projectile forward in time using simple Euler integration
# t: the current time of the system
# dt: the time to step the system forward
# x: the current state of the system ([x position, y position, x velocity, y
# velocity)
# returns the new state of the system
def integrate(t, dt, x):
#Euler Method
#x[0] = x[0] + x[2]*dt
#x[2] = x[2]
#x[1] = x[1]+x[3]*dt
#x[3] = x[3]-(9.81*dt)
#SciPy Dopri5 Integration
#vode Integrator
method = ode(eq).set_integrator('vode', method = 'bdf')
method.set_initial_value(x, t)
method.integrate(method.t+dt)
return x
#write one function that represents one step of the diff equation
它從projectile.py調用。多數認爲只是圖紙和設置的pygame的,但在那裏這部分是有關的片段是:
# integrate the projectile forward in time
x = dynamics.integrate(fireT, dt, array([projX, projY, projVX, projVY]))
projX = x[0]
projY = x[1]
projVX = x[2]
projVY = x[3]
# update the time
fireT = fireT + dt
非常感謝您的回覆。它修正了TypeError,現在遊戲至少是繪製彈丸。然而,拋射物只是坐在那裏,並不像它應該的那樣向前移動。我不確定積分器是不是更新數組x中的值,或者它是否甚至成功調用積分器。我認爲這是後者,因爲在調用「method.integrate(method.t + dt)」之前添加「while method.successful():」會阻止PyGame中的射彈發射。有沒有人有任何想法,爲什麼這可能是? – user3458256
在這裏和那裏添加一些'print'語句來查看值是否更新。 – gg349
感謝您的建議。我實現了一個打印語句,x [0] -x [3]的值在每個時間步都是一樣的。不知道爲什麼它不更新值,但肯定會縮小它的值。感謝你的幫助。 'integration()'中的 – user3458256