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
另一种方法是将 c
和 d
设置为虚数:
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⎭
我正在尝试使用 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
另一种方法是将 c
和 d
设置为虚数:
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⎭