def construct_explicit_matrix(name, n, m, symmetric=False, diagonal=0,
dynamic=False, **kwass):
"""
construct a matrix of symbolic elements
Parameters
----------
name : string
Base name for variables; each variable is name_ij, which
admitedly only works clearly for n,m < 10
n : int
Number of rows
m : int
Number of columns
symmetric : bool, optional
Use to enforce a symmetric matrix (repeat symbols above/below diagonal)
diagonal : bool, optional
Zeros out off diagonals. Takes precedence over symmetry.
dynamic : bool, optional
Whether to use sympy.physics.mechanics dynamicsymbol. If False, use
sp.symbols
kwargs : dict
remaining kwargs passed to symbol function
Returns
-------
matrix : sympy Matrix
The Matrix containing explicit symbolic elements
"""
if dynamic:
symbol_func = dynamicsymbols
else:
symbol_func = sp.symbols
if n != m and (diagonal or symmetric):
raise ValueError("Cannot make symmetric or diagonal if n != m")
if diagonal:
return sp.diag(
*[symbol_func(
name+'_{}{}'.format(i+1, i+1), **kwass) for i in range(m)])
else:
matrix = sp.Matrix([
[symbol_func(name+'_{}{}'.format(j+1, i+1), **kwass)
for i in range(m)] for j in range(n)
])
if symmetric:
for i in range(1, m):
for j in range(i):
matrix[i, j] = matrix[j, i]
return matrix