绘制 python 中的不等式

Graphing Inequalities in python

我想创建一个程序,它会随机生成线条(不等式)并显示满足约束条件的区域。

我不介意使用哪些库,所以请随意使用 sympy、numpy 等

我将展示我当前的代码,但这只是填充两行之间的区域,根本不使用不等式。

如果可能的话,一个图例会很好,但我总是可以自己添加一个。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,100,0.1)
y1 = 2*x
y2 = 0.5*x+5
plt.ylim(0, 20)
plt.xlim(0, 20)

# Plotting of lines
plt.plot(x, y1,
         x, y2)

# Filling between line y3 and line y4
plt.fill_between(x, y1, y2, color='grey', alpha=0.5)
plt.show()

实际上使用 sympy 你可以在一行中完成。 (正如前面提到的不平等和所有)

from sympy import *
x, y, z, t = symbols('x y z t')
p1 = plot_implicit(And(x+y > 1, y < 10, x**2 > y))

剧情:

注:OP说的是满足约束的区域。对于仅具有相等性的 3 条线将产生共线线或 3、2 或 1 个点。除非我们使用不等式,否则它不会给我们一个区域。 sympy 也允许 plot_implicit.

中的等式

Sympy 确实提供了 plot_implicit,这是一个很好的起点,因为它显示了由整体不等式表示的填充区域。但是,它不足以显示 OP 明确询问的限制曲线。由于 OP 不介意正在使用的库,我将使用 SymPy Plotting Backend module,这是对 SymPy 当前提供的功能的全面改进(免责声明:我是该模块的开发人员。希望有一天它将成为 SymPy 的一部分)。

这是一个例子:

from sympy import var
from spb import * # SymPy Plotting Module
var("x, y")

c = 3
# a boolean expression composed of multiple inequalities
expr = (y < x + c) & (y < -x + c) & (y > x - c) & (y > -x - c)

# assuming y is on the LHS of the inequality, here we extract
# the RHS, which are going to create the limiting lines
expressions = []
for a in expr.args:
    rhs = a.args[1]
    # append to expression the tuple (RHS, label)
    expressions.append((rhs, str(a)))

# plot the limiting lines
p1 = plot(*expressions, (x, -5, 5), aspect="equal",
         line_kw={"linestyle": "--"})
# plot the region represented by the overall expression
p2 = plot_implicit(expr, (x, -5, 5), (y, -5, 5))
# combine the plots
(p1 + p2).show()

您可以 combine multiple sympy plots 通过 show=False 并附加图表。这可用于添加行:

from sympy import symbols, Eq, plot_implicit

x, y = symbols('x y')
p1 = plot_implicit(And(x > 3, y > x), show=False)
p2 = plot_implicit(Eq(x, 3), line_color='crimson', show=False)
p3 = plot_implicit(Eq(x, y), line_color='crimson', show=False)
p1.append(p2[0])
p1.append(p3[0])
p1.show()

或者,您可以使用 参数来添加线或点。 annotations= 可用于添加文字。

from sympy import symbols, Eq, plot_implicit

x, y = symbols('x y')
plot_implicit(And(x > 3, y > x),
              markers=[{'args': [[3, 3], [-5, 5]], 'color': 'r', 'ls': '--'},
                       {'args': [[-5, 5], [-5, 5]], 'color': 'r', 'ls': '--'}],
              annotations=[{'xy': (3, 2), 'text': " $x = 3$",
                            'ha': 'left', 'va': 'center', 'color': 'r'},
                           {'xy': (2, 2), 'text': "$x = y$",
                            'ha': 'right', 'va': 'center', 'color': 'r', 'rotation': 45}])