You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:08:12