【发布时间】:2019-06-10 19:40:49
【问题描述】:
我正在创建一个函数,该函数使用 sympy 执行方程的 Legendre transform。我正在尝试获取代码来简化表达式,但简化函数不起作用(我假设是因为表达式的大小)。这是一个一般的勒让德变换,所以我不能告诉它寻找具体的简化。
作为示例,一个输出方程具有三角关系: 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 倍。
【问题讨论】:
-
方程
a和b之间没有明显的相似性,因此输出也不会相似。你确实意识到b没有a的形状? -
我的意思是形式。
a部分显然有效。但是,b和a没有任何关系,为什么要提呢?此外,如果函数返回与b不同的输出,那么它已经对b有效,除非您在b输出中输入错误?最后一个等式中是否缺少y*? -
不同的形状是什么意思? a = x - xsy.cos(tht)^2 -> a = x*(1 - cos(tht)^2 -> a = xsin(tht)^2 part_of_b = -m1 - m2*cos(q1 - q2)^2 + m2 -> -m1 + m2*(1 - cos(q1 - q2)^2) -> m1 + m2*sin(q1 - q2)^2 它们是不同的,但三角函数简化的作用仍然相同。我的数学运算有误吗?
-
基本上我只是说 trigsimp 似乎只适用于非常简单和明显的情况。 b 证明即使是一点复杂性也会使函数难以处理。我试图简化的方程比 b 长大约 20 倍,所以我没有机会简化它。我一直在寻找可以的东西。我也过早地发送了我之前的评论,因此为什么有些东西丢失了。
-
我明白你的意思。你在评论中打错了,最后一部分是-m1,否则看起来很好。不过这并不容易注意到,因此我建议将其包含在问题中。