SymPy含矩阵的符号函数梯度与海森矩阵计算问题求解
错误原因
你使用MatrixSymbol定义的x是整体符号矩阵对象,fx.free_symbols只会识别到这个整体的矩阵符号,不会自动拆分出矩阵内的独立元素符号。SymPy内置的jacobian和hessian默认对标量符号变量求导,对整体矩阵对象求导时会出现逻辑不匹配,才会得到[0,0]的错误结果和形状报错。
正确实现代码
首先将x拆分为独立的标量符号构造函数,再进行求导计算:
from sympy import symbols, Matrix, hessian, display # 1. 定义变量与目标函数 x1, x2 = symbols('x1 x2') x = Matrix([x1, x2]) # 原函数的系数矩阵、向量与常数项 A = Matrix([[1, 2], [4, 7]]) b = Matrix([3, 5]) const = 6 # 提取1x1矩阵的标量值作为目标函数 fx = (x.T * A * x + x.T * b + const)[0, 0] # 2. 计算梯度 grad_f = Matrix([fx.diff(x1), fx.diff(x2)]) # 代入指定点 x=[1, 2]^T grad_val = grad_f.subs({x1: 1, x2: 2}) print("指定点处梯度:") display(grad_val) # 3. 计算海森矩阵 hess_f = hessian(fx, [x1, x2]) # 二次函数海森矩阵为常数,代入点后结果不变 hess_val = hess_f.subs({x1: 1, x2: 2}) print("指定点处海森矩阵:") display(hess_val)
运行后即可得到预期的梯度和海森矩阵结果。
内容的提问来源于stack exchange,提问作者duk
相关产品推荐
相关产品推荐

