大小为 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 )
我正在尝试创建一个一般大小(假设为 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 )