SymPy中在指定点计算梯度与海森矩阵的技术求助
计算Dixon-Price函数的梯度与海森矩阵值
先补全并修正你的SymPy代码,确保能正确计算目标点的梯度和海森矩阵:
import sympy as sp import numpy as np # 定义符号变量 x, y, z = sp.symbols('x y z') # Dixon-Price函数 f1 = ((1 - x)**2) + 2*(2*y**2 - x)**2 + 3*(2*z**2 - y)**2 # 梯度计算函数:返回列向量 gradient = lambda f, v: sp.Matrix([f]).jacobian(v).T grad_f1 = gradient(f1, [x, y, z]) # 海森矩阵 hess_f1 = sp.hessian(f1, [x, y, z]) # 目标点:转换为符号变量的字典形式 point = np.array([1, 2, 0]) subs_dict = {x: point[0], y: point[1], z: point[2]} # 计算梯度在目标点的数值 grad_value = grad_f1.subs(subs_dict).evalf() # 计算海森矩阵在目标点的数值 hess_value = hess_f1.subs(subs_dict).evalf() print("梯度值:") print(grad_value) print("\n海森矩阵值:") print(hess_value)
运行后即可得到(1,2,0)处的梯度与海森矩阵结果。
关于值为0的表达式计算耗时更长的原因
这和SymPy的符号运算逻辑直接相关:
- 当表达式最终结果为0时,SymPy不会直接返回0,而是会优先执行展开、合并同类项、化简等全量代数操作,确认所有项确实能完全抵消。这个过程需要遍历表达式的所有子结构,执行更多运算步骤。
- 如果结果非0,SymPy在代入数值后,往往不需要完成全部化简流程就能得到明确的非零结果,会提前终止部分计算环节,因此耗时更短。
- 加上Dixon-Price函数本身是多层嵌套的平方结构,代入特定值后产生的抵消项逻辑复杂,SymPy需要额外时间验证这些项的抵消关系,进一步拉长了计算耗时。
内容的提问来源于stack exchange,提问作者DynoMonster
相关产品推荐
相关产品推荐

