Python 使用matplotlib绘制能量势图

Python 使用matplotlib绘制能量势图,python,matplotlib,mplot3d,Python,Matplotlib,Mplot3d,我想画出引力势能图来突出它的极值(两个天体周围的拉格朗日点) 以下是返回每组坐标x和y的电势的函数: def gravitational_potential(M,m,R,x,y): G = 6.674*10**(-11) omega2 = G*(M+m)/(R**3) r = np.sqrt(x**2+y**2) r2 = R*m/(M+m) r1 = R-r2 phi = -G*(M/abs(r-r1)+m/abs(r-r2))-1/2*ome

我想画出引力势能图来突出它的极值(两个天体周围的拉格朗日点)

以下是返回每组坐标x和y的电势的函数:

def gravitational_potential(M,m,R,x,y):
    G = 6.674*10**(-11)
    omega2 = G*(M+m)/(R**3)
    r = np.sqrt(x**2+y**2)
    r2 = R*m/(M+m)
    r1 = R-r2

    phi = -G*(M/abs(r-r1)+m/abs(r-r2))-1/2*omega2*(x**2+y**2)

    return phi
我想使用
meshgrid
plot\u surface
来绘制曲面和电势的轮廓,但它不起作用

我做错了什么

附言:我设法用沃尔夫拉玛法画出了潜力,所以我知道数学是可行的

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

def gravitational_potential(M,m,R,x,y):
    G = 6.674*10**(-11)
    omega2 = G*(M+m)/(R**3)
    r = np.sqrt(x**2+y**2)
    r2 = R*m/(M+m)
    r1 = R-r2

    phi = -G*(M/abs(r-r1)+m/abs(r-r2))-1/2*omega2*(x**2+y**2)

    return phi


fig = plt.figure()
ax = fig.gca(projection='3d')

X, Y = np.meshgrid(np.arange(-20, 20, 0.5), np.arange(-20, 20, 0.5))

M = 10
m = 1
R = 10
Z = gravitational_potential(M,m,R,X,Y)



ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.9)
cset = ax.contour(X, Y, Z, zdir='z', offset=-40, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-20, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='y', offset=20, cmap=cm.coolwarm)

ax.set_xlabel('X')
ax.set_xlim(-20, 20)
ax.set_ylabel('Y')
ax.set_ylim(-20, 20)
ax.set_zlabel('Z')
ax.set_zlim(-40, 40)


plt.show()
当我执行它时,我得到以下信息:

runfile('C:/Users/python/Google Drive/lagrangepoint_maths/potential/gravitational_potential.py', wdir='C:/Users/python/Google Drive/lagrangepoint_maths/potential')
C:/Users/python/Google Drive/lagrangepoint_maths/potential/gravitational_potential.py:13: RuntimeWarning: divide by zero encountered in divide
  phi = -G*(M/abs(r-r1)+m/abs(r-r2))-1/2*omega2*(x**2+y**2)

这不是我真正想要的。Z有点问题。我想要这样的东西:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm

fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.9)
cset = ax.contour(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)

ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)

plt.show()

所有这些都是我们可以逐一调试的:

  • 如果命名符小于分母,python 2中的整数除法将导致
    0
    。您可以从“未来”导入除法
    ,或将代码更正为用浮点数除法

  • 如果要显示介于-2 x 10^-8和+2 x 10^-8之间的数字,将z_限制设置为-40到40是没有用的

  • 如果要在绘图中显示小要素,不应将绘图分辨率粗略设置为
    rstride=8,cstride=8

  • 总的来说,你会得出这样的结论:


    为什么这个问题被否决得如此之多?“但它不起作用”不是一个有用的问题描述。您应该提供问题的详细信息和完整的错误回溯。由于代码中包含许多琐碎的错误(例如使用
    ^
    而不是
    **
    ,或者使用
    math
    而不是
    numpy
    ),因此不清楚您在哪一点上有问题。请纠正这些错误,并明确说明您不喜欢该绘图的地方。恐怕
    x^2
    没有做您认为正在做的事情。
    ^
    是一个xor运算符。我会回家纠正我的错误。对不起。我会编辑并告诉你我得到了什么。@ImportanceOfBeingErnest我编辑了我的文章。Z的绘图有问题。