简化大型符号表达式

时间:2019-06-10 19:40:49

标签: python sympy

我正在创建一个使用sympy执行方程Legendre transform的函数。我正在尝试获取用于简化表达式的代码,但是简化功能无法正常工作(我想是因为表达式的大小)。这是用于一般的Legendre转换,所以我不能告诉它寻求特定的简化。

作为示例,一个输出方程具有三角关系: sin ^ 2 = 1-cos ^ 2

设置问题

import sympy as sy
x, y, m1, m2, n, q1, q2, tht = sy.symbols("x, y, m1, m2, n, q1, q2, tht")

当我编写代码并使用trigsimp()

a = x - x*sy.cos(tht)**2
print(sy.trigsimp(a))

我明白了

x*sin(tht)**2
像我应该的那样。但是,当我把它放在一个更复杂的问题中时。

b = y*n**2/(x**2*y**2*(-m1 - m2*sy.cos(q1 - q2)**2 + m2))
print(sy.trigsimp(b))

我不认识触发关系并输出:

n**2/(x**2*y*(-m1 - m2*cos(q1 - q2)**2 + m2))

有什么方法可以简化大表达式吗?或者我可以在此应用程序中使用比sympy更好的选择?

编辑:

为澄清这个问题,适度的复杂性似乎阻碍了trigsimp(),如示例b所示,未适当简化。我正在寻找一种更严格地简化方程的方法。对于规模,我真正要简化的功能是示例b的3到20倍。

1 个答案:

答案 0 :(得分:0)

使用较大的表达式时,通常最好给出更直接的简化说明,例如

In [18]: b.replace(cos, lambda a: sqrt(1-sin(a)**2)).collect(m2)                                                                  
Out[18]: 
               2             
              n              
─────────────────────────────
 2   ⎛            2         ⎞
x ⋅y⋅⎝-m₁ + m₂⋅sin (q₁ - q₂)⎠

这可能无法解决您的实际问题,但应该可以。像trigsimp和simple这样的通用例程的困难在于,没有一种通用的简化策略,因此他们不得不尝试很多事情,而这些事情最终要么是缓慢的,要么是不完整的(或两者兼有)。实际上,并不总是清楚“最简单”的答案应该是什么。此示例中的改进似乎很小。