首页 > 解决方案 > matplotlib.pyplot.contour 出了点问题

问题描述

我曾经matplotlib.pyplot.contour画过一条线,但结果很奇怪。
我的python代码:

import numpy as np
from matplotlib import pyplot as plt

N = 1000

E = 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 时,结果就不同了。
数学代码是:

ContourPlot[Sqrt[-en] == -Sqrt[en + V]/Tan[Sqrt[en + V]], {V, 0, 70}, {en, -5, 0}]

结果是:

在此处输入图像描述

我想要的结果是 Mathematica 的结果。

为什么会matplotlib.pyplot.contour给出错误的结果?我很困扰!

如果您能给我一些想法,将不胜感激!非常感谢!

标签: pythonmatplotlib

解决方案


给出的结果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()

在此处输入图像描述

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

np.inf您可以通过使用大于某个数字的点来规避这种情况。例如添加

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

会导致

在此处输入图像描述

相同的方法可以用于轮廓。

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()

在此处输入图像描述


推荐阅读