如果您对numpy/scipy(推荐)持开放态度:
使用scipy.linalg.toeplitz 创建带状矩阵,使用numpy.kron 创建重复块的模式:
import numpy as np
import scipy.linalg
h = 10
K = np.zeros((4,))
K[:2] = (4 / h**2, -1 / h**2)
K = scipy.linalg.toeplitz(K)
L = np.identity(4) / h**2
KK = np.identity(3)
LL = scipy.linalg.toeplitz((0, -1, 0))
A = np.kron(LL, L) + np.kron(KK, K)
# array([[ 0.04, -0.01, 0. , 0. , -0.01, -0. , 0. , 0. , 0. , 0. , 0. , 0. ],
# [-0.01, 0.04, -0.01, 0. , -0. , -0.01, -0. , 0. , 0. , 0. , 0. , 0. ],
# [ 0. , -0.01, 0.04, -0.01, 0. , -0. , -0.01, -0. , 0. , 0. , 0. , 0. ],
# [ 0. , 0. , -0.01, 0.04, 0. , 0. , -0. , -0.01, 0. , 0. , 0. , 0. ],
# [-0.01, -0. , 0. , 0. , 0.04, -0.01, 0. , 0. , -0.01, -0. , 0. , 0. ],
# [-0. , -0.01, -0. , 0. , -0.01, 0.04, -0.01, 0. , -0. , -0.01, -0. , 0. ],
# [ 0. , -0. , -0.01, -0. , 0. , -0.01, 0.04, -0.01, 0. , -0. , -0.01, -0. ],
# [ 0. , 0. , -0. , -0.01, 0. , 0. , -0.01, 0.04, 0. , 0. , -0. , -0.01],
# [ 0. , 0. , 0. , 0. , -0.01, -0. , 0. , 0. , 0.04, -0.01, 0. , 0. ],
# [ 0. , 0. , 0. , 0. , -0. , -0.01, -0. , 0. , -0.01, 0.04, -0.01, 0. ],
# [ 0. , 0. , 0. , 0. , 0. , -0. , -0.01, -0. , 0. , -0.01, 0.04, -0.01],
# [ 0. , 0. , 0. , 0. , 0. , 0. , -0. , -0.01, 0. , 0. , -0.01, 0.04]])
如果它必须是纯 Python:
制作矩阵矩阵并使用zip转置中间维度和平面列表理解以制作二维。
K = [[0.04 if i==j else -0.01 if i-j in {-1, 1} else 0.0 for j in range(4)] for i in range(4)]
L = [[-0.01 if i==j else 0.0 for j in range(4)] for i in range(4)]
Z = [[0.0 for j in range(4)] for i in range(4)]
# matrix of matrices
A = [[K if i==j else L if i-j in {-1, 1} else Z for j in range(3)] for i in range(3)]
# make 2d
A = [[a_IJij for a_IJi in a_Ii for a_IJij in a_IJi] for a_I in A for a_Ii in zip(*a_I)]
for a in A:
print(' '.join(f'{i:5.2f}' for i in a))
# 0.04 -0.01 0.00 0.00 -0.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# -0.01 0.04 -0.01 0.00 0.00 -0.01 0.00 0.00 0.00 0.00 0.00 0.00
# 0.00 -0.01 0.04 -0.01 0.00 0.00 -0.01 0.00 0.00 0.00 0.00 0.00
# 0.00 0.00 -0.01 0.04 0.00 0.00 0.00 -0.01 0.00 0.00 0.00 0.00
# -0.01 0.00 0.00 0.00 0.04 -0.01 0.00 0.00 -0.01 0.00 0.00 0.00
# 0.00 -0.01 0.00 0.00 -0.01 0.04 -0.01 0.00 0.00 -0.01 0.00 0.00
# 0.00 0.00 -0.01 0.00 0.00 -0.01 0.04 -0.01 0.00 0.00 -0.01 0.00
# 0.00 0.00 0.00 -0.01 0.00 0.00 -0.01 0.04 0.00 0.00 0.00 -0.01
# 0.00 0.00 0.00 0.00 -0.01 0.00 0.00 0.00 0.04 -0.01 0.00 0.00
# 0.00 0.00 0.00 0.00 0.00 -0.01 0.00 0.00 -0.01 0.04 -0.01 0.00
# 0.00 0.00 0.00 0.00 0.00 0.00 -0.01 0.00 0.00 -0.01 0.04 -0.01
# 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -0.01 0.00 0.00 -0.01 0.04