运行Python脚本,'内存错误','用于'环

时间:2016-01-27 22:30:03

标签: python loops for-loop

我试图模拟三体问题,其中我有三个广义坐标(一个径向和两个角)和三个二阶(耦合)微分方程。我想看看系统在改变初始条件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,但不会导致尺寸误差?

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行!