我试图模拟三体问题,其中我有三个广义坐标(一个径向和两个角)和三个二阶(耦合)微分方程。我想看看系统在改变初始条件rho [0]时是如何演变的。 我的剧本有什么问题吗?上面已经很好地定义了变量和参数,所以我将省略它们;这是代码:
for i in range(1000000,10000000,1000000):
rho[0] = i
rho[1] = rho[0] + vrho*dt
theta[1] = theta[0] + vtheta*dt #angulos radianes
phi[1] = phi[0] + vphi*dt
for t in range(1, N-1):
#Velocidades de las coordenadas
v[0,t-1] = (rho[t] - rho[t-1])/dt
v[1,t-1] = (theta[t] - theta[t-1])/dt
v[2,t-1] = (phi[t] - phi[t-1])/dt
#"Ecuaciones diferenciales"
rho[t+1] = (2*rho[t] - rho[t-1]) + (rho[t]*(v[2,t-1]**2) - G*M/(rho[t]**2) - (9*G*M*((np.cos(theta[t]-phi[t]))**2)*(l**2))/(8*(rho[t]**4)))*(dt**2)
theta[t+1] = (2*theta[t] - theta[t-1]) + ((-3*G*M*np.sin(2*(theta[t]-phi[t])))/(2*(rho[t]**3)))*(dt**2)
phi[t+1] = (2*phi[t] - phi[t-1]) + ((3*G*M*np.sin(2*(theta[t]-phi[t]))*(l**2))/(8*(rho[t]**5)) - (2*v[0,t-1]*v[2,t-1])/(rho[t]))*(dt**2)
for j in range(0,N):
x[j] = rho[j]*np.cos(phi[j])
y[j] = rho[j]*np.sin(phi[j])
plt.plot(x,y)
这就是错误:
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-3-4c789e1dfc65> in <module>()
21 y[j] = rho[j]*np.sin(phi[j])
22
---> 23 plt.plot(x,y)
我尝试做的是让python解决不同初始条件下的ODE,保存orden中的rho,theta,phi和V向量来操纵它们。鉴于我想要身体的轨迹,对于rho和phi的那些值,我想将它们变成笛卡尔坐标,绘制轨迹,然后用rho的下一个初始条件重新启动ODE。 / p>
我必须引入j计数器,因为x和y被定义为np.zeros(N)以匹配rho,theta和phi的维度。计数器代表这种向量的位置,并且想法是对于rho和phi中的每个位置,笛卡尔等价物被保存在相同的位置。由于t上升到N-1,因此最后一个可用的是N-2,我不知道如何避免添加另一个;为了解决起点差异,我可以写下最后一个&#39; for&#39;切换j为t-1,但不会导致尺寸误差?
答案 0 :(得分:1)
您可以尝试以下代码:
for i in range(1000000,10000000,1000000):
rho[0] = i
rho[1] = rho[0] + vrho*dt
theta[1] = theta[0] + vtheta*dt #angulos radianes
phi[1] = phi[0] + vphi*dt
for t in range(1, N-1):
# Velocidades de las coordenadas
v[0,t-1] = (rho[t] - rho[t-1])/dt
v[1,t-1] = (theta[t] - theta[t-1])/dt
v[2,t-1] = (phi[t] - phi[t-1])/dt
# "Ecuaciones diferenciales"
rho[t+1] = (2*rho[t] - rho[t-1]) + (rho[t]*(v[2,t-1]**2) - G*M/(rho[t]**2) - (9*G*M*((np.cos(theta[t]-phi[t]))**2)*(l**2))/(8*(rho[t]**4)))*(dt**2)
theta[t+1] = (2*theta[t] - theta[t-1]) + ((-3*G*M*np.sin(2*(theta[t]-phi[t])))/(2*(rho[t]**3)))*(dt**2)
phi[t+1] = (2*phi[t] - phi[t-1]) + ((3*G*M*np.sin(2*(theta[t]-phi[t]))*(l**2))/(8*(rho[t]**5)) - (2*v[0,t-1]*v[2,t-1])/(rho[t]))*(dt**2)
for j in range(0,N):
x[j] = rho[j]*np.cos(phi[j])
y[j] = rho[j]*np.sin(phi[j])
plt.plot(x,y)
我认为在绘图阶段有一些不好的缩进,这意味着每次你想绘制一行时,你实际上是在绘制N ^ 2行!