我正在创建一个使用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倍。
答案 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这样的通用例程的困难在于,没有一种通用的简化策略,因此他们不得不尝试很多事情,而这些事情最终要么是缓慢的,要么是不完整的(或两者兼有)。实际上,并不总是清楚“最简单”的答案应该是什么。此示例中的改进似乎很小。