【问题标题】:Simplifying large symbolic expressions简化大型符号表达式
【发布时间】: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 倍。

【问题讨论】:

  • 方程ab 之间没有明显的相似性,因此输出也不会相似。你确实意识到b 没有a 的形状?
  • 我的意思是形式。 a 部分显然有效。但是,ba 没有任何关系,为什么要提呢?此外,如果函数返回与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,否则看起来很好。不过这并不容易注意到,因此我建议将其包含在问题中。

标签: python sympy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多