可以绘制隐式方程吗?

40 投票
6 回答
47470 浏览
提问于 2025-04-15 20:39

我想在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的说明:如果你传入的第四个参数是一个序列,那它就会指定要绘制哪些等高线。不过,绘制的效果好不好,还得看你设置的范围的分辨率。而且,有些特征可能永远都无法正确显示,尤其是在自交点的地方。

撰写回答