如何在矩阵/向量乘法后最小化 sympy 偏导数表达式?

问题描述

我正在使用 sympy 来计算矩阵/向量乘法的偏导数(参见下面的代码),但结果表达式很复杂,我想知道是否有办法简化它。

from sympy import symbols,MatrixSymbol,diff,Matrix,symarray,expand,factor,simplify
import numpy as np

Ca = Matrix(symarray('Ca',(2,4)))
Cb = Matrix(symarray('Cb',4)))
Cc = Matrix(symarray('Cc',4)))

qi = Matrix(symarray('qi',(4,1)))
qj = Matrix(symarray('qj',1)))

R90 = Matrix(symarray('R90',2)))

u = (Ca*qi - Cb*qj)
v = (Cc*qj - Cb*qj)

u_tilde = R90*u

# Equation
constr_eq = (u_tilde).T*v

# Partial derivatives
u_diff = u.diff(qi)

constr_eq_diff_wrt_qi  = constr_eq.diff(qi)
constr_eq_diff_wrt_qj  = constr_eq.diff(qj)

输出

print('u_diff : ',u_diff)

[[[[Ca_0_0],[Ca_1_0]]],[[[Ca_0_1],[Ca_1_1]]],[[[Ca_0_2],[Ca_1_2]]],[[[Ca_0_3],[Ca_1_3]]]]

而我只想成为

Ca

因此输出

'constr_eq_diff_wrt_qi' 

constr_eq_diff_wrt_qj

不可读。

谢谢。 伊沃

解决方法

基于@asmeurer 的帮助,这里有一个工作示例:

from sympy import MatrixSymbol,diff

# Initialize simbolic matrices 
Ca = MatrixSymbol('Ca',2,4)
Cb = MatrixSymbol('Cb',4)
Cc = MatrixSymbol('Cc',4)

qi = MatrixSymbol('qi',4,1)
qj = MatrixSymbol('qj',1)

R90 = MatrixSymbol('R90',2)

# Initialize vectors 
u = (Ca*qi - Cb*qj)
v = (Cc*qj - Cb*qj)

u_tilde = R90*u

# Constraint Equation
constr_eq = (u_tilde).T*v

# Partial derivatives
generalized_coordinates = [qi,qj]

# Get contraint equations partial derivatives 
for _ in generalized_coordinates:
    print('jacobian wrt ' + str(_) + ' : ',constr_eq.diff(_))