sympy 矩阵求导零碎

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. 下次

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值