可以绘制隐式方程吗?
我想在Matplotlib中绘制隐式方程(比如形如f(x, y)=g(x, y)的方程,例如X^y=y^x)。这样做可以吗?
6 个回答
9
matplotlib 并不是用来直接画方程的,它是用来画一系列的点的。你可以使用像 scipy.optimize
这样的工具,通过数值计算从 x 值得到 y 值(或者反过来),这样就可以处理隐式方程,或者使用其他合适的工具。
举个例子,这里有一个例子,我在某个区域里画了隐式方程 x ** 2 + x * y + y ** 2 = 10
的图。
from functools import partial
import numpy
import scipy.optimize
import matplotlib.pyplot as pp
def z(x, y):
return x ** 2 + x * y + y ** 2 - 10
x_window = 0, 5
y_window = 0, 5
xs = []
ys = []
for x in numpy.linspace(*x_window, num=200):
try:
# A more efficient technique would use the last-found-y-value as a
# starting point
y = scipy.optimize.brentq(partial(z, x), *y_window)
except ValueError:
# Should we not be able to find a solution in this window.
pass
else:
xs.append(x)
ys.append(y)
pp.plot(xs, ys)
pp.xlim(*x_window)
pp.ylim(*y_window)
pp.show()
36
因为你在这个问题上标记了sympy,所以我会给你一个这样的例子。
来自文档的内容:http://docs.sympy.org/latest/modules/plotting.html。
from sympy import var, plot_implicit
var('x y')
plot_implicit(x*y**3 - y*x**3)
36
我觉得这个问题的支持不是很好,但你可以试试下面的代码:
import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid
delta = 0.025
xrange = arange(-5.0, 20.0, delta)
yrange = arange(-5.0, 20.0, delta)
X, Y = meshgrid(xrange,yrange)
# F is one side of the equation, G is the other
F = Y**X
G = X**Y
matplotlib.pyplot.contour(X, Y, (F - G), [0])
matplotlib.pyplot.show()
你可以查看这个链接,里面有关于contour
的说明:如果你传入的第四个参数是一个序列,那它就会指定要绘制哪些等高线。不过,绘制的效果好不好,还得看你设置的范围的分辨率。而且,有些特征可能永远都无法正确显示,尤其是在自交点的地方。