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

如何用SymPy获取Lambert W函数导数表达式并解决lambdify报错?

解决SymPy中LambertW实部导数未展开的问题

当你对sym.re(LambertW(x))求导时,SymPy无法自动展开该导数,会保留Derivative(re(LambertW(x)), x)对象,导致lambdify无法生成可用于matplotlib绘图的数值函数。可以通过以下两种方法解决:

方法一:用expand_complex展开实部后再求导

SymPy的expand_complex函数能将复数表达式的实部/虚部展开为实变量的显式表达式,后续求导即可得到可直接lambdify的结果。

import sympy as sym

x = sym.symbols('x', real=True)
w = sym.LambertW(x)
# 展开LambertW的实部
f_real = sym.expand_complex(sym.re(w))
# 对展开后的实部求导
der_x = sym.diff(f_real, x)
print(der_x)

# 转换为数值函数
f_der_lambda = sym.lambdify(x, der_x, modules=['numpy'])

方法二:手动构造导数表达式

根据LambertW函数的隐函数性质w*sym.exp(w) = x,对x求导可得:
w'*sym.exp(w) + w*sym.exp(w)*w' = 1
整理得w' = 1/(sym.exp(w)*(1 + w)) = w/(x*(1 + w))(因x = w*sym.exp(w))

针对实部的导数,结合实数x的取值情况构造表达式:

  • 当x ≥ -1/e,主分支W₀(x)为实数,sym.re(w) = w,导数即w/(x*(1 + w))
  • 当x < -1/e,W₀和W₁的实部相同,导数的实部为sym.re(w/(x*(1 + w)))

代码实现:

import sympy as sym

x = sym.symbols('x', real=True)
w = sym.LambertW(x)
# 构造实部的导数表达式
der_x = sym.re(w/(x*(1 + w)))
# 处理x=0的特殊情况(此时w=0,导数为1)
der_x = sym.simplify(sym.piecewise((1, x == 0), (der_x, True)))

print(der_x)

# 转换为数值函数
f_der_lambda = sym.lambdify(x, der_x, modules=['numpy'])

验证与绘图

得到可lambdify的导数表达式后,即可结合matplotlib绘图:

import numpy as np
import matplotlib.pyplot as plt

# 生成x的取值范围(注意x不能小于-1/e≈-0.3679)
x_vals = np.linspace(-1/np.e + 1e-6, 5, 1000)
y_vals = f_der_lambda(x_vals)

plt.plot(x_vals, y_vals)
plt.xlabel('x')
plt.ylabel("d/dx Re(LambertW(x))")
plt.title('导数图像')
plt.grid(True)
plt.show()

内容的提问来源于stack exchange,提问作者Srinivas C L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:52:47