首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析字符串时以渐近形式识别子表达式

解析字符串时以渐近形式识别子表达式
EN

Stack Overflow用户
提问于 2020-05-25 08:01:46
回答 2查看 151关注 0票数 0

我试图simplify一个相当复杂的表达同情。

代码语言:javascript
复制
from sympy import *
xi, eta = symbols('xi eta')
expr = (sin(eta)*sin(xi) - 1)**2*(sin(eta)*sin(xi) + 1)**2/((cos(eta)**2*tan(xi)**2 + 1)*(cos(xi)**2*tan(eta)**2 + 1)*cos(eta)**2*cos(xi)**2)

expr应该简化为1,但渐近不能自动完成。为了给它提供一点帮助,我需要改变变量:

代码语言:javascript
复制
X, Y = symbols('X Y')
xi = atan(X)
eta = atan(Y)

所以xieta不再是符号了。现在,我需要重新解析expr以更改变量。我目前所做的是:

代码语言:javascript
复制
simplify(repr(expr).replace('xi',repr(xi)).replace('eta', repr(eta)))

这个很管用。但这似乎是一种粗俗的做法。在解析xieta时,是否还有其他方法来识别repr(expr)是表达式而不是符号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-25 12:30:49

sympify (简称S )会将一个字符串转换为一个表达式,并且它可以选择在这样做时进行用户定义的替换。这个玩具例子应该对你有帮助:

代码语言:javascript
复制
>>> from sympy import S, cos
>>> from sympy.abc import x
S('x',dict(x=cos(x)))
cos(x)
票数 1
EN

Stack Overflow用户

发布于 2020-05-25 09:07:03

正如注释中提到的@mapf,可以使用替换(expr.subs):

代码语言:javascript
复制
from sympy import *
xi, eta = symbols('xi eta')
expr = (sin(eta)*sin(xi) - 1)**2*(sin(eta)*sin(xi) + 1)**2/((cos(eta)**2*tan(xi)**2 + 1)*(cos(xi)**2*tan(eta)**2 + 1)*cos(eta)**2*cos(xi)**2)

X, Y = symbols('X Y')
simplify( expr.subs( [(xi, atan(X)), (eta, atan(Y))] ) )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61998198

复制
相关文章

相似问题

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