Python中SymPy求导后如何计算导函数在指定x值处的数值结果
报错原因
diff返回的是SymPy的符号表达式对象,不是Python可调用函数,因此不能直接用f(3.14)这种传参调用的写法。
解决方法
方法1:用subs方法直接代入求值
适合单次计算少数几个点的场景,直接调用表达式的subs方法传入变量和对应值即可,需要标准数值结果可以追加evalf()方法:
from sympy import * # 先定义符号变量x x = symbols('x') # 计算cos(x)的导数,结果为 -sin(x) f_prime = diff(cos(x), x) # 代入x=3.14计算数值 result = f_prime.subs(x, 3.14).evalf() print(result)
方法2:用lambdify转成可调用函数
适合需要批量计算大量点的场景,用lambdify把符号表达式转成和普通Python函数一致的可调用对象,还可以指定numpy作为后端支持数组输入,计算效率远高于subs:
from sympy import * import numpy as np x = symbols('x') f_prime = diff(cos(x), x) # 转成支持numpy数组输入的可调用函数 f_numeric = lambdify(x, f_prime, backend='numpy') # 单个点计算 print(f_numeric(3.14)) # 批量计算多个点 print(f_numeric(np.array([1, 2, 3, 3.14])))
其他可实现求导+数值计算的工具包
- 数值求导类:NumDiffTools,不需要定义符号表达式,直接对现成的数值函数求导,适合无法写出显式函数表达式的场景
- 自动微分类:PyTorch、TensorFlow、JAX,都是支持自动微分的数值计算框架,支持GPU/TPU加速,适合大规模计算、需要用到梯度做优化的场景
内容的提问来源于stack exchange,提问作者Parag
相关产品推荐
相关产品推荐

