python - Sympy `factor` 和 `simplify` 不能正常工作?
问题描述
由于我正在从事一个涉及平方根的项目,因此我需要将平方根简化到最大值。但是,某些平方根表达式不会产生不想要的结果。请考虑检查此示例:
>>> 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 的简化形式,以便相等性正确而不必将它们转换为 float ?
提前致谢。
解决方案
当您使用嵌套sqrt
表达式时,sqrtdenest
这是一个不错的选择。但是一个很好的后备使用是nsimplify
在某些情况下可能更有用。由于这可以给出与输入不完全相同的答案,我喜欢使用这个“安全”函数来进行简化:
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
在你的表情上
>>> safe_nsimplify(sqrt(2 * sqrt(2) + 3))
1 + sqrt(2)
如果你想在更大的表达式中找到这样的表达式,你可以使用
>>> from sympy import bottom_up, tan
>>> bottom_up(tan(eq), safe_nsimplify)
tan(sqrt(1 - 2*sqrt(5)/5))
接受结果而不是使用as in可能是有利的sqrtdenest
nsimplify
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
推荐阅读
- python - Python pip install 以“退出状态为 1 的命令出错:...”结束
- fabricjs - fabricjs 并非所有下流区域都是可选的
- php - php 登录 $_SESSION
- javascript - Mongoose 不创建索引 - 自动过期文档
- java - 如何在 spring-data-elasticsearch 中为存储库接口建模,以实现独占保存和读取访问以管理索引中的数据
- javascript - 如何在 D3 中设置具有多个子部分的自定义色阶?
- xcode - Azure 管道使用 ionic 构建 iOS
- android - 如何检查耳机或内置麦克风是否用于麦克风输入?
- javascript - Angular -> 将 JSON 数据解析为 Chart.js 条形图
- tensorflow - 关于tensorflow lite量化代码、论文和文档不一致的问题