大小为 NxN 的符号矩阵的元素

elements of symbolic matrix of size NxN

我正在尝试创建一个一般大小(假设为 LxL)的符号矩阵 (S),我想将矩阵的每个元素设置为索引的函数,即:

S[m,n] = (u+i/2*(n-m))/(u-i/2*(n-m)) * (u+i/2*(n+m))/(u-i/2*(n+m))

我在 sympy 中尝试了 运行 这个,我得到了

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-a456d47e99e7> in <module>()
      2 S_l = MatrixSymbol('S_l',2*l+1,2*l+1)
      3 S_k = MatrixSymbol('S_k',2*k+1,2*k+1)
----> 4 S_l[m,n] = (u+i/2*(n-m))/(u-i/2*(n-m)) * (u+i/2*(n+m))/(u-i/2*(n+m))

TypeError: 'MatrixSymbol' object does not support item assignment

通过 Stack Exchange 搜索我发现了去年的这个问题: Sympy - Dense Display of Matrices of Arbitrary Size 这是没有答案的,也不完全一样。这是同一个问题,还是我只是想在 sympy(或一般的计算机)中做一件不可能的事情?

这当然可以做到。 docs 提供了一些示例。这是一个

>>> Matrix(3, 4, lambda i,j: 1 - (i+j) % 2)
Matrix([
[1, 0, 1, 0],
[0, 1, 0, 1],
[1, 0, 1, 0]])

我知道这很古老,但我遇到了同样的问题,我想我会分享一个适合我的解决方案。 您需要使用 FunctionMatrix 对象 而不是 MatrixSymbol。对于背景,我在 Python 3.5.2.

上使用 SymPy 1.6.1

举个例子。使用下面的代码,我设置了一些迭代符号和函数 f(i,j) 我想用于我的矩阵 u.

的元素
# Import SymPy for symbolic computations 
import sympy as sym

# Index variables
i,j = sym.symbols('i j', integer=True);
N = sym.Symbol('N', real=True, integer=True, zero=False, positive=True);

# The function we'll use for our matrix
def f(i,j):
    # Some arbitrary function...
    return i + j;

# Define a function matrix where elements of the matrix
# are a function of the indices
U = sym.FunctionMatrix(N, N, sym.Lambda((i,j), f(i,j)));

现在,让我们尝试使用矩阵中的元素,将它们全部相加...

U_sum = sym.Sum(u[i,j], (i, 0, N), (j, 0, N));
U_sum
>>>
  N     N          
 ___   ___         
 ╲     ╲           
  ╲     ╲          
  ╱     ╱   (i + j)
 ╱     ╱           
 ‾‾‾   ‾‾‾         
j = 0 i = 0        

然后,让我们告诉 SymPy 计算总和

our_sum.doit().simplify()
>>> N * ( N**2 + 2*N + 1 )