对于我的天文学作业,我需要模拟太阳周围行星的椭圆轨道。要做到这一点,我需要使用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()
前几行只是一些起始参数。
提前感谢您的帮助!
答案 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()
方便用于创建具有固定数组的平铺)。