SymPy:在欧拉恒等式中使用 solve

SymPy: using solve in Euler's identity

我正在尝试使用 sympy.solve 来解决一些简单的物理问题,但我在具体用法方面遇到了一些问题。因此我回过头来尝试 solve 一个更简单的问题:找到身份

sin(x) = (exp(i*x) - exp(-i*x)) / 2i

只是作为测试,但不知何故我无法让 SymPy 找到正确的解决方案。

首先我测试了cos(x):

import sympy as smp
a, b = smp.symbols('a b', real=True)
x = smp.symbols('x', real=True)

我定义了等式:

eq1 = smp.Eq(smp.cos(x), a * smp.exp(smp.I * x) + b * smp.exp(- smp.I * x))

然后解决:

smp.solve(eq1, (a, b))
>>> {a: 1/2, b: 1/2}

这当然是正确的。

但是如果我现在寻找 sin(x) 函数:

c, d = smp.symbols('c d', complex=True)
eq2 = smp.Eq(smp.sin(x), c * smp.exp(smp.I * x) + d * smp.exp(- smp.I * x))
smp.solve(eq2, (c, d))
>>> [((-d + exp(I*x)*sin(x))*exp(-2*I*x), d)]

解算器不工作。

我知道,我可以使用以下方法让它工作:

eq3 = smp.Eq(smp.sin(x), a * smp.I * smp.exp(smp.I * x) + b * smp.I * smp.exp(- smp.I * x))
smp.solve(eq3, (a, b))
>>> {a: -1/2, b: 1/2}

但这有点作弊。

您正在求解两个未知数的单个方程。在未知数(a 和 b)是实数的情况下,由于方程具有非平凡的实部和虚部,因此可以将它们分开,为两个实数未知数生成两个实方程。

如果未知数(c 和 d)本身不一定是真实的,那么您正在为两个复杂的未知数求解一个复杂的方程。这相当于有四个实数未知数的两个实数方程。

这意味着 solve(eq2, (c, d)) 发现系统未定,因此 returns 为系统设置了参数化解集。返回的解决方案对 d:

的任何可能值均有效
In [30]: sol = solve(eq2, (c, d), dict=True)[0]

In [31]: sol
Out[31]: 
⎧   ⎛      ⅈ⋅x       ⎞  -2⋅ⅈ⋅x⎫
⎨c: ⎝-d + ℯ   ⋅sin(x)⎠⋅ℯ      ⎬
⎩                             ⎭

In [32]: eq2.subs(sol)
Out[32]: 
            -ⅈ⋅x   ⎛      ⅈ⋅x       ⎞  -ⅈ⋅x
sin(x) = d⋅ℯ     + ⎝-d + ℯ   ⋅sin(x)⎠⋅ℯ    

In [33]: eq2.subs(sol).expand()
Out[33]: True

另一种方法是将 cd 设置为虚数:

In [51]: c, d = smp.symbols('c d', imaginary=True)

In [52]: eq2 = smp.Eq(smp.sin(x), c * smp.exp(smp.I * x) + d * smp.exp(- smp.I * x))

In [53]: solve(eq2, (c, d))
Out[53]: 
⎧   -ⅈ      ⅈ⎫
⎨c: ───, d: ─⎬
⎩    2      2⎭