如何用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
相关产品推荐
相关产品推荐

