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

在Python/SymPy中交换微分与实部/虚部运算符的顺序

解决SymPy中微分与实部/虚部运算符交换顺序的问题

你可以通过SymPy的replace方法自定义替换规则,直接将「微分作用于实部/虚部」的表达式替换为「实部/虚部作用于微分」的形式,无需拆分复变量的实虚部。

具体实现步骤

  1. 导入SymPy库并定义复变量:
from sympy import symbols, re, im, Derivative

# 定义独立复变量u、w,以及微分变量x
u, w, x = symbols('u w x', complex=True)
  1. 构建目标表达式(比如对re(w)关于x求导):
expr = Derivative(re(w), x)
  1. 自定义替换规则,交换微分与re/im的顺序:
# 替换Derivative(re(f), var)为re(Derivative(f, var))
expr_simplified = expr.replace(
    lambda expr: isinstance(expr, Derivative) and expr.expr.func is re,
    lambda expr: re(Derivative(expr.expr.args[0], expr.variables[0]))
)

# 同理处理im的情况
expr_im = Derivative(im(u), x)
expr_im_simplified = expr_im.replace(
    lambda expr: isinstance(expr, Derivative) and expr.expr.func is im,
    lambda expr: im(Derivative(expr.expr.args[0], expr.variables[0]))
)
  1. 此时化简后的表达式会自动计算微分(因u、w与x独立,微分结果为0),进而得到re(0)或im(0),SymPy会直接将其化简为0:
print(expr_simplified.doit())  # 输出0
print(expr_im_simplified.doit())  # 输出0

批量处理的优化

如果需要处理大量这类表达式,可以封装成一个通用函数:

def swap_deriv_re_im(expr):
    # 处理re的情况
    expr = expr.replace(
        lambda e: isinstance(e, Derivative) and e.expr.func is re,
        lambda e: re(Derivative(e.expr.args[0], *e.variables))
    )
    # 处理im的情况
    expr = expr.replace(
        lambda e: isinstance(e, Derivative) and e.expr.func is im,
        lambda e: im(Derivative(e.expr.args[0], *e.variables))
    )
    # 执行微分计算
    return expr.doit()

# 测试
test_expr = Derivative(re(u + 2*w), x)
print(swap_deriv_re_im(test_expr))  # 输出0

内容的提问来源于stack exchange,提问作者Ph_Ys321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:35:28