首页 > 解决方案 > 如何重写 sympy 中的表达式以遵循用于方程式的特定形式?

问题描述

我希望从以下形式重新格式化 Sympy 表达式: 示例 Sympy 方程

像这样:

所需的方程式格式

如果我能将第二种形式的 A、B 和 C 与第一种形式分开,那么进入这种形式将有助于我稍后快速进行一些重要的计算。在互联网上搜索了 3-4 多个小时后,没有任何文档或类似的东西可以帮助解决以某种形式重写表达式的问题。我发现最接近的是.rewrite()命令,但这并没有将sin()and隔离cos()在一起(除非该函数中有一些文档未提供的隐藏方式)。

谢谢!

标签: pythonsympysymbolic-math

解决方案


尽管这可能可以通过匹配来解决,但听起来您只想收集 和 的cos(th3)系数sin(th3)。我将展示一个类似的表达式,其中收集cos(x)sin(x)完成:

>>> eq = 2*cos(x) + cos(x)*y + sin(x)*cos(y) + 3*sin(x) + pi
>>> gens = cos(x), sin(x)
>>> collect(eq, gens)
(y + 2)*cos(x) + (cos(y) + 3)*sin(x) + pi
>>> [_.coeff(i) for i in gens]
[y + 2, cos(y) + 3]
>>> reps = dict(zip(symbols('A B'), _))
>>> reps[C] = eq.as_independent(*gens, as_Add=True)[0]
>>> dict(reps)
{A: y + 2, B: cos(y) + 3, C: pi}

将其编写为使用 Poly 进行收集和测试生成器中不存在交叉项的辅助函数给出:

def coeffs(eq, gens):
    c = Poly(eq, gens)
    co = [c.coeff_monomial(i) for i in gens]
    # alternative way to get constant term
    co.append(eq.xreplace(dict(zip(gens, [0]*len(gens)))))
    return dict(zip(numbered_symbols('C'), co))

>>> coeffs(eq, gens)
{C0: y + 2, C1: cos(y) + 3, C2: pi}

推荐阅读