我如何定义 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()
将适当的部分连接在一起形成两个表达式(不等式)。一个是前三件,另一个是后三件。 eq1
和 eq2
的结果是:
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()
产生两个不相交的不等式。
我试图在 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)
.
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()
将适当的部分连接在一起形成两个表达式(不等式)。一个是前三件,另一个是后三件。 eq1
和 eq2
的结果是:
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()
产生两个不相交的不等式。