如何在 Sympy 中匹配两个表达式的实数系数

How to match real numeric coefficients for two expression in Sympy

如果你看这个例子: 2Bsin(x)+ (B + ¾A)*cos(x) = sin(x) + 2cos(x) 很容易看出 2B = 1, B + ¾A = 2 并应用一些基本的线性代数 B = ½, A = 2 在 Python 中,使用 sympy,但是,您 运行 此代码:

from sympy import *; var('x A B')

P1 = (B/2)*sin(x) + (B + 3*A/4)*cos(x)
P2 = sin(x) + 2*cos(x)
solve(Eq(P1, P2), [A,B])

你明白了

[(-2*B*tan(x)/3 - 4*B/3 + 4*tan(x)/3 + 4/3, B)]

有没有办法根据 A 和 B 得到结果?

这看起来有点乱七八糟,但确实有效。我将 sin(x)cos(x) 替换为 xy 并将其转换为多项式。然后我就可以得到系数,从中得出一个方程式并很好地解决它。

from sympy import *; var('x y A B')

P1 = (B/2)*sin(x) + (B + 3*A/4)*cos(x)
P2 = sin(x) + 2*cos(x)
P1s = P1.subs({sin(x):x, cos(x):y})
P2s = P2.subs({sin(x):x, cos(x):y})

eqs = tuple(map(lambda x:Eq(*x),zip(Poly(P1s,[x,y]).coeffs(), Poly(P2s,[x,y]).coeffs())))

那些sympy确实解决了

sol = solve(eqs)
{A: 0, B: 2}

我什至可以将它们代入原始方程式,看看是否发生了奇怪的事情:

P1.subs(sol), P2.subs(sol)
(sin(x) + 2*cos(x), sin(x) + 2*cos(x))