如何在SymPy中对无具体定义的d维向量到实数的符号函数求梯度?
如何在SymPy中对无具体定义的d维向量到实数的符号函数求梯度?
你好~我明白你的需求:想要定义一个抽象的符号函数(比如π: ℝ^d → ℝ),然后得到它的符号化梯度(类似∇π(x)的形式),但目前用SymPy求导总是得到0,哪怕换成英文符号也不行。
其实问题出在你定义的函数没有和求导的变量绑定——SymPy会把不依赖任何变量的函数当成常数,求导自然是0。下面是正确的做法,分步骤给你讲:
核心思路
必须让你的抽象函数明确依赖于d维的符号变量,然后用SymPy的梯度工具来计算,就能得到符号化的导数表达式。
具体代码示例
1. 处理具体维度(比如d=3)
如果你的维度d是确定的数值,比如3,可以这样写:
from sympy import symbols, Function, derive_by_array # 定义3个维度的变量x1, x2, x3 x = symbols('x1 x2 x3') # 定义抽象函数π,让它依赖于这三个变量 pi = Function('pi')(*x) # 计算梯度:对每个变量求导,组成向量 gradient = derive_by_array(pi, x) print(gradient)
运行后会输出:
[Derivative(pi(x1, x2, x3), x1), Derivative(pi(x1, x2, x3), x2), Derivative(pi(x1, x2, x3), x3)]
这就是你想要的符号化梯度,对应∇π(x1,x2,x3)的形式。
2. 处理一般维度d(符号化维度)
如果想要保留d作为符号(不确定具体数值),可以这样:
from sympy import symbols, Function, derive_by_array, Matrix # 定义符号化的正整数维度d d = symbols('d', integer=True, positive=True) # 创建d维的符号向量x1到xd x = Matrix(symbols(f'x1:{d+1}')) # 定义依赖于这个向量的抽象函数π pi = Function('pi')(x) # 计算梯度 gradient = derive_by_array(pi, x) print(gradient)
这样会得到一个d维的导数向量,每个元素对应π对xi的符号导数。
为什么之前的方法得到0?
你之前的操作里,应该是只定义了函数本身(比如pi = Function('pi')()),没有给它传入任何变量参数——SymPy会把这种无参数的函数视为常数,所以对任何变量求导结果都是0。只要让函数明确依赖于你要对其求导的变量,就能解决这个问题啦~
备注:内容来源于stack exchange,提问作者ayandas
相关产品推荐
相关产品推荐

