我正在使用SymPy,一个用于符号数学的Python库,用于以编程方式读取的减少不平等,例如
from sympy.solvers.inequalities import reduce_rational_inequalities
# In reality, these inequalities are read in programmatically
inequality1 = 'x - 0.5 >= 0.0'
inequality2 = '0.49 - x**2 >= 0.0'
listOfInequalities = [sympy.parse_expr(inequality1), sympy.parse_expr (inequality2)]
ReducedInequalities = reduce_rational_inequalities([listOfInequalities], x)它产生与x对应的正确结果,介于0.5到0.7之间:
0.5≤∧≤0.7
或者,用字符串表示:
strReducedInequalities = str(ReducedInequalities)开始{方程*}(0.5 <= x)和(x <= 0.7)\end{等式*}
我的问题是,是否有一种可靠的方法来解析这样的结果来提取常数0.5和0.7?我可以搜索结果strReducedInequalities,或者可能使用正则表达式来查找字符串'(‘’和'<= x‘)的位置,例如提取0.5。但这似乎很脆弱:如果SymPy改变其输出格式,代码可能会中断。
更可靠的是一种遍历输出的结构化方法,例如,strReducedInequalities可以表示为
[expression1, joiner, expression2]哪里
然后expression1可能会被分解为
[constant, inequality_type, variable]哪里
解决方案
下面是我如何从@smichr实现优秀的解决方案
from sympy import *
from sympy.core.relational import Relational
x = symbols('x')
eq = solve([x >= 0.5, x <= 0.7])
[(i.rhs, i.rel_op, i.lhs) for i in [i.canonical for i in eq.atoms(Relational)]]或者在我最初的问题中使用编程生成的列表方法:
from sympy import *
from sympy.core.relational import Relational
x = symbols('x')
# In reality, these inequalities are read in programmatically
inequality1 = 'x - 0.5 >= 0.0'
inequality2 = '0.49 - x**2 >= 0.0'
listOfInequalities = [parse_expr(inequality1), parse_expr (inequality2)]
eq = solve(listOfInequalities)
[(i.rhs, i.rel_op, i.lhs) for i in [i.canonical for i in eq.atoms(Relational)]]采用两种方法的结果:
(0.500000000000000,‘>’,x),(0.700000000000000,'<=',x)
发布于 2021-04-18 20:46:14
如果关系已得到解决,则一边有一个符号,另一边有一个值,canonical方法将它们按顺序排列,因此符号位于左边:
>>> eq
(1/2 <= x) & (x <= 7/10)
>>> [(i.rhs, i.rel_op, i.lhs) for i in [i.canonical for i in eq.atoms(Relational)]]
[(7/10, '<=', x), (1/2, '>=', x)]https://stackoverflow.com/questions/67153048
复制相似问题