如何在Python(Jupyter)中分离复指数函数的实部与虚部?
分离Sympy复数微分方程解的实部与虚部
首先,你遇到的问题核心是:Sympy生成的符号表达式(比如你得到的微分方程解)不是Python原生的complex对象,也不是numpy数组,所以不能直接用.real或.imag属性,得用Sympy专门提供的实部/虚部处理函数来操作。
解决步骤
- 使用Sympy的
re(expr)函数提取表达式的实部,im(expr)函数提取虚部,这两个函数专门针对符号化的复数表达式设计。 - 不需要手动用欧拉公式展开,Sympy会自动帮你完成复数指数到三角函数的转换(如果需要可视化展开形式的话)。
修改后的代码示例
针对你现有的代码,只需要在代入数值前先提取实部(或虚部)即可正常运行:
import scipy as sp from sympy import* import sympy as syp from scipy.integrate import odeint t, z, w, C2=symbols('t, z, w, C2') x=Function('x') eq=x(t).diff(t,2)+2*z*w*x(t).diff(t,1)+w**2*x(t) sol=dsolve(eq,x(t),ics={x(0):0,x(t).diff(t,1).subs(t,0):2*C2*w*sqrt(z**2-1)}) # 提取解的实部(如果需要虚部就替换为im(sol.rhs)) sol_real = re(sol.rhs) step = [i for i in range(1000)] numdata = [] for i in step: # 代入实部表达式计算数值解 num_val = N(sol_real.subs(t,i).subs(w,10).subs(z,0.001)) numdata.append(num_val)
额外说明
- 如果你想查看复数指数展开后的三角函数形式(对应欧拉公式的结果),可以用
expand_complex()函数自动展开:expanded_sol = expand_complex(sol.rhs) print(expanded_sol) - 为什么之前的
exp(complex(2,1)).real会报错?因为在Sympy环境下,exp(complex(2,1))生成的是Sympy的Exp符号对象,不是Python原生的复数类型,所以没有.real属性。必须用Sympy的re()函数来处理这类符号表达式。
内容的提问来源于stack exchange,提问作者Mixalhs
相关产品推荐
相关产品推荐

