绘制 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}])
我想创建一个程序,它会随机生成线条(不等式)并显示满足约束条件的区域。
我不介意使用哪些库,所以请随意使用 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}])