为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlib.pyplot.contour 有问题

matplotlib.pyplot.contour 有问题

RISEBY 2021-12-09 18:24:25
我曾经matplotlib.pyplot.contour画过一条线,但结果很奇怪。我的python代码:import numpy as npfrom matplotlib import pyplot as pltN = 1000E = np.linspace(-5,0,N)V = np.linspace(0, 70,N)E, V = np.meshgrid(E, V)L = np.sqrt(-E)R = -np.sqrt(E+V)/np.tan(np.sqrt(E+V))plt.contour(V, E,(L-R),levels=[0])plt.show()结果是:但是当我使用 Mathematica 时,结果就不同了。Mathematica 代码是:ContourPlot[Sqrt[-en] == -Sqrt[en + V]/Tan[Sqrt[en + V]], {V, 0, 70}, {en, -5, 0}]结果是:我想要的结果是 Mathematica 的结果。为什么会matplotlib.pyplot.contour给出错误的结果?我很困扰!如果您能给我一些想法,将不胜感激!非常感谢!
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

给出的结果matplotlib.pyplot.contour在数值上是正确的,但在数学上是错误的。


如果您只是绘制 ,请检查会发生什么tan(x):


import numpy as np

from matplotlib import pyplot as plt


x = np.linspace(0,2*np.pi,1000)

y = np.tan(x)


plt.plot(x,y)

plt.show()

//img1.sycdn.imooc.com//61b1d9890001b56204130297.jpg

你会在两极得到一条线。这是因为后续的点是相连的。

您可以通过使用np.inf大于特定数字的点来规避此问题。例如添加

y[np.abs(y)> 200] = np.inf

会导致

//img1.sycdn.imooc.com//61b1d991000164a804000308.jpg

相同的方法可用于轮廓。


import numpy as np

from matplotlib import pyplot as plt


N = 1000


x = np.linspace(0, 70,N)

y = np.linspace(-5,0,N)

X,Y = np.meshgrid(x, y)


F = np.sqrt(-Y) + np.sqrt(Y+X)/np.tan(np.sqrt(Y+X))

F[np.abs(F) > 200] = np.inf


plt.contour(X, Y, F, levels=[0])

plt.show()

//img1.sycdn.imooc.com//61b1d99c000119d104090305.jpg

查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信