有没有办法在Python中定义一个float数组?

时间:2015-03-15 12:55:45

标签: python arrays numpy physics astronomy

对于我的天文学作业,我需要模拟太阳周围行星的椭圆轨道。要做到这一点,我需要使用for循环来重复计算行星的运动。但是,每次我尝试运行该程序时,都会出现以下错误:

RuntimeWarning: invalid value encountered in power
r=(x**2+y**2)**1.5
Traceback (most recent call last):
File "planetenstelsel3-4.py", line 25, in <module>
ax[i] = a(x[i],y[i])*x[i]
ValueError: cannot convert float NaN to integer

我已经做了一些测试,我认为问题在于计算的值大于整数的值,并且数组被定义为int数组。因此,如果有一种方法可以将它们定义为float数组,那么它可能会起作用。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

dt = 3600 #s
N = 5000
x = np.tile(0, N)
y = np.tile(0, N)
x[0] = 1.496e11 #m
y[0] = 0.0
vx = np.tile(0, N)
vy = np.tile(0, N)
vx[0] = 0.0
vy[0] = 28000 #m/s
ax = np.tile(0, N)
ay = np.tile(0, N)
m1 = 1.988e30 #kg
G = 6.67e-11 #Nm^2kg^-2

def a(x,y):
    r=(x**2+y**2)**1.5
    return (-G*m1)/r

for i in range (0,N):
    r = x[i],y[i]
    ax[i] = a(x[i],y[i])*x[i]
    ay[i] = a(x[i],y[i])*y[i]
    vx[i+1] = vx[i] + ax[i]*dt
    vy[i+1] = vy[i] + ay[i]*dt
    x[i+1] = x[i] + vx[i]*dt 
    y[i+1] = y[i] + vy[i]*dt    
plt.plot(x,y)
plt.show()

前几行只是一些起始参数。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

当你进行物理模拟时,你绝对应该使用浮点数所有0是Python中的整数常量,因此np.tile创建整数数组;使用0.0作为np.tile的参数来做浮点数组;或者最好使用np.zeros(N)代替:

您可以从dtype成员检查任何数组变量的数据类型:

>>> np.tile(0, 10).dtype
dtype('int64')
>>> np.tile(0.0, 10).dtype
dtype('float64')
>>> np.zeros(10)
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
>>> np.zeros(10).dtype
dtype('float64')

答案 1 :(得分:0)

您需要x = np.zeros(N)等:这将数组声明为float数组。

这是将零放入数组的标准方法(np.tile()方便用于创建具有固定数组的平铺)。