是否可以使用Matplotlib绘制隐式方程?

Ged*_*des 30 python equation matplotlib implicit sympy

我想在Matplotlib中绘制隐式方程(形式为f(x,y)= g(x,y),例如X ^ y = y ^ x).这可能吗?

Ste*_*eve 26

我不相信对此有很好的支持,但你可以尝试类似的东西

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()
Run Code Online (Sandbox Code Playgroud)

参见API文档contour:如果第四个参数是一个序列,然后将它指定轮廓线绘制哪个.但是情节只会与你的范围的分辨率一样好,并且有些特征可能永远不会正确,通常是在自相交点.


Gar*_*err 21

既然你已经用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)
Run Code Online (Sandbox Code Playgroud)

  • 看起来新语法是`plot_implicit(Eq(x**5 + y**5,1))`,新的doc链接[在这里](http://docs.sympy.org/latest/modules /plotting.html). (3认同)

Mik*_*ham 7

matplotlib不绘制方程; 它描绘了积分.您可以使用一种工具,scipy?.optimize以数字方式从数值计算隐含方程的x值(反之亦然)或任意数量的其他工具.


例如,这是一个我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()
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的方法——与其他一些方法的粗离散化相比,它允许您更准确、更有效地找到零点的位置。 (2认同)

Kra*_*nov 5

sympy 中有一个隐式方程(和不等式)绘图仪。它是作为 GSoC 的一部分创建的,并将绘图生成为 matplotlib 图形实例。

http://docs.sympy.org/latest/modules/plotting.html#sympy.plotting.plot_implicit.plot_implicit 上的文档

从 sympy 版本 0.7.2 开始,它可以作为:

>>> from sympy.plotting import plot_implicit
>>> p = plot_implicit(x < sin(x)) # also creates a window with the plot
>>> the_matplotlib_axes_instance = p._backend._ax
Run Code Online (Sandbox Code Playgroud)