首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sympy‘`factor`’和‘`simplify`’不能正常工作?

Sympy‘`factor`’和‘`simplify`’不能正常工作?
EN

Stack Overflow用户
提问于 2021-04-22 11:58:36
回答 2查看 356关注 0票数 1

由于我正在进行一个涉及平方根的项目,我需要将平方根简化为最大值。然而,一些平方根表达式并不会产生二值结果。请考虑检查此示例:

代码语言:javascript
复制
>>> from sympy import * # just an example don't tell me that import * is obsolete
>>> x1 = simplify(factor(sqrt(3 + 2*sqrt(2))))
>>> x1 # notice that factoring doesn't work
sqrt(2*sqrt(2) + 3)
>>> x2 = sqrt(2) + 1
>>> x2 
sqrt(2) + 1
>>> x1 == x2
False
>>> N(x1)
2.41421356237309
>>> N(x2)
2.41421356237309
>>> N(x1) == N(x2)
True

正如您所看到的,数字实际上是相等的,但是numpy不能识别这一点,因为它不能分解和简化x1。那么,我如何获得简化形式的x1,使等式在不需要转换为浮动的情况下是正确的?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 14:49:31

当您使用嵌套的sqrt表达式时,sqrtdenest是一个很好的尝试选项。但是nsimplify是一个很好的退路,它在某些情况下可能更有用。由于这可以给出与输入不完全相同的答案,所以我喜欢使用这个“安全”函数来简化:

代码语言:javascript
复制
def safe_nsimplify(x):
    from sympy import nsimplify
    if x.is_number:
        ns = nsimplify(x)
        if ns != x and x.equals(ns):
            return ns
    return x

>>> from sympy import sqrt, sqrtdenest
>>> eq = (-sqrt(2) + sqrt(10))/(2*sqrt(sqrt(5) + 5))
>>> simplify(eq)
(-sqrt(2) + sqrt(10))/(2*sqrt(sqrt(5) + 5))  <-- no change
>>> sqrtdenest(eq)
-sqrt(2)/(2*sqrt(sqrt(5) + 5)) + sqrt(10)/(2*sqrt(sqrt(5) + 5))  <-- worse
>>> safe_nsimplify(eq)
sqrt(1 - 2*sqrt(5)/5)  <-- better

关于你的表情

代码语言:javascript
复制
>>> safe_nsimplify(sqrt(2 * sqrt(2) + 3))
1 + sqrt(2)

如果您想在更大的表达式中找到这样的表达式,则可以使用

代码语言:javascript
复制
>>> from sympy import bottom_up, tan
>>> bottom_up(tan(eq), safe_nsimplify)
tan(sqrt(1 - 2*sqrt(5)/5))

接受sqrtdenest的结果可能更有利,而不是使用

代码语言:javascript
复制
def safe_nsimplify(x):
  from sympy import nsimplify, sqrtdenest, Pow, S
  if x.is_number:
    if isinstance(x, Pow) and x.exp is S.Half:
        ns = sqrtdenest(x)
        if ns != x:
            return ns
    ns = nsimplify(x)
    if ns != x and x.equals(ns):
        return ns
  return x
票数 2
EN

Stack Overflow用户

发布于 2021-04-22 12:58:56

多亏了Oscar Benjamin,我要找的函数是sqrtdenest

代码语言:javascript
复制
>>> from sympy import *
>>> sqrtdenest(sqrt(2 * sqrt(2) + 3))
1 + sqrt(2)

我希望这个答案能帮助其他人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67212861

复制
相关文章

相似问题

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