1. Frobenius 范数对矩阵求导
from sympy import Matrix, MatrixSymbol, sqrt, diff
# 定义一个 3x3 符号矩阵 A
A = MatrixSymbol('A', 3, 3)
# 构造 Frobenius 范数的表达式
F_def = sqrt(sum(A[i, j]**2 for i in range(3) for j in range(3)))
# 对矩阵 A 的每个元素求导
dF_dA = [[diff(F_def, A[i, j]) for j in range(3)] for i in range(3)]
# 显示结果
for i in range(3):
for j in range(3):
print(f"∂F/∂A_{i + 1}{j + 1} =", dF_dA[i][j])
# 定义具体的矩阵 B
B = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 创建符号矩阵到具体矩阵的映射
symbol_to_value_map = {A[i, j]: B[i, j] for i in range(3) for j in range(3)}
# 替换导数表达式中的符号并计算具体的导数值
dF_dB = [[dF_dA[i][j].subs(symbol_to_value_map) for j in range(3)] for i in range(3)]
# 显示结果
for i in range(3):
for j in range(3):
print(f"∂F/∂B_{i + 1}{j + 1} =", dF_dB[i][j], "numerical value=", dF_dB[i][j].evalf())
import numpy as np
from sympy import MatrixSymbol, Function, sqrt, diff, lambdify
# 定义一个 3x3 符号矩阵 A
A = MatrixSymbol('A', 3, 3)
# 构造 Frobenius 范数的表达式
F = Function('F')(A)
F_def = sqrt(sum(A[i, j]**2 for i in range(3) for j in range(3)))
# 对矩阵 A 的每个元素求导
dF_dA = [[diff(F_def, A[i, j]) for j in range(3)] for i in range(3)]
# 使用 lambdify 将 SymPy 表达式转换为 Python 函数
gradient_func = lambdify(A, dF_dA)
# 定义具体的 NumPy 矩阵 B
B = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用 B 作为输入计算数值梯度
numerical_gradient = gradient_func(B)
# 显示结果
print("数值梯度:\n", numerical_gradient)
2. 下次