首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从(解析) Sympy结果中提取值的可靠方法

从(解析) Sympy结果中提取值的可靠方法
EN

Stack Overflow用户
提问于 2021-04-18 20:23:05
回答 1查看 154关注 0票数 1

我正在使用SymPy,一个用于符号数学的Python库,用于以编程方式读取的减少不平等,例如

代码语言:javascript
复制
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

或者,用字符串表示:

代码语言:javascript
复制
strReducedInequalities = str(ReducedInequalities)

开始{方程*}(0.5 <= x)和(x <= 0.7)\end{等式*}

我的问题是,是否有一种可靠的方法来解析这样的结果来提取常数0.5和0.7?我可以搜索结果strReducedInequalities,或者可能使用正则表达式来查找字符串'(‘’和'<= x‘)的位置,例如提取0.5。但这似乎很脆弱:如果SymPy改变其输出格式,代码可能会中断。

更可靠的是一种遍历输出的结构化方法,例如,strReducedInequalities可以表示为

代码语言:javascript
复制
[expression1, joiner, expression2]

哪里

  • expression1表示(0.5 <= x)
  • 联合代表&
  • expression2表示(x <= 0.7)

然后expression1可能会被分解为

代码语言:javascript
复制
[constant, inequality_type, variable]

哪里

  • 常数= 0.5
  • inequality_type表示<= (小于或等于)
  • 变量=x

解决方案

下面是我如何从@smichr实现优秀的解决方案

代码语言:javascript
复制
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)]]

或者在我最初的问题中使用编程生成的列表方法:

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 20:46:14

如果关系已得到解决,则一边有一个符号,另一边有一个值,canonical方法将它们按顺序排列,因此符号位于左边:

代码语言:javascript
复制
>>> 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)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67153048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档