我如何定义 sympy 中的不平等?

How can I define an inequality in sympy?

我试图在 sympy 中定义一个不等式 inecuacion = "19 < -25*x - 1 <= 37" 以便我可以在图表上打印解决方案集。当我用单个值打印时,即像这样:2*x-4 < 0,它可以被评估,但是当它是 19 < -25*x - 1 <= 37 时,我得到错误:

raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

我的代码片段:

  inecuacion = "19 < -25*x - 1 <= 37"
  ineq = parse_expr(inecuacion)
  interval = solveset(ineq, domain=S.Reals)

  plot_interval(title=latex(ineq, mode="inline"),  
                start=interval.start, end=interval.end, 
                start_open=interval.left_open, end_open=interval.right_open,
                x_axis=(-10, 10),
                color="#073065")

我怎样才能让 sympy 可以解释这种不等式 19 < -25*x - 1 <= 37?非常喜欢坦克。问候

这个链式不等式应该重写为ineq = And(19 < -25*x - 1, -25*x - 1 <= 37)。然后可以使用 interval = ineq.as_set() -> Interval.Ropen(-38/25, -4/5).

作为区间 re-written
import re
ineq = "20 < 3*x + 5 < 26"

parts = re.split(r"([<>]=?)", ineq)
eq1= "".join(parts[:3])
eq2 = "".join(parts[-3:])
print(eq1)
print(eq2)

如您所见,技巧是正则表达式 ([<>]=?),其含义如下:

  • 括号里,我们要创建一个捕获组。这将导致 re.split() 不仅 return 生成的“块”,而且 return 块之间的“分隔符”(这是不等式的不等号)。
  • 可以出现 <>
  • 的括号 [<>]
  • 带问号 =? 的等号可以选择与等号一起出现(因此它允许 >=<= 作为分隔符)

re.split() 的结果将是一个包含五个块的列表,只要您的输入字符串有一对不等式比较器。在此示例中,第一个块是 "20 "。下一个块将是第一个分隔符(示例中的 "<")下一个块将是 " 3*x +5"in this case. The next would be the second separator, again"<"in this example, and the fourth and last chunk would be"26"`.

下面的 .join() 将适当的部分连接在一起形成两个表达式(不等式)。一个是前三件,另一个是后三件。 eq1eq2 的结果是:

20 < 3*x + 5
 3*x + 5 < 26

这样分开后,我们可以用sympy来解决这两个不等式,例如:

from sympy import solve, S
ineq = [S(eq) for eq in (eq1, eq2)]
intervals = solve(ineq, domain=S.Reals)

sympy 找到的解决方案是两个区间之间的 And 运算,它显示如下:

(5 < x) & (x < 7)

如果你想将它减少到“单个间隔”,你可以计算这两个间隔与间隔 (-infinity, +infinity) 的交集,例如:

from sympy import Interval, solveset

solution = Interval(float("-inf"), float("+inf"))
for interval in intervals.args:
  interval = solveset(interval, domain=S.Reals)
  solution &= interval

如您所见,我们首先创建无限区间,然后遍历 intervals.args(这是之前用 solve() 获得的每个不等式),以解决所构成的不等式他们每个人,依此类推。具有与 solution 相交的区间,我们使用 &= 运算符计算。

solution中的结果是一个区间,在这种情况下即(5, 7),你已经可以用上面的解决方案绘制它。

注意:这个方案不是很通用,根据输入的不等式可能最后会得不到一个interval-solution ,但是两个 if solve() 产生两个不相交的不等式。