h=1/(n+1)
및 n>=1
을 고려하십시오. Id
는 단위 행렬이다블록 삼중 대 매트릭스,이 종류의 행렬을 프로그래밍하는 방법?
매트릭스 L = 1/h² Id
, 우리는 K
같은 매트릭스를 고려한다.
내가 K
및 L
,하지만 어떻게 A
을 프로그램하는 프로그램 할 수 있습니다 :
A
프로그램 싶습니다
? A는 행렬로 구성된 행렬입니다. 이것을 파이썬으로 구현하는 방법은?
h=1/(n+1)
및 n>=1
을 고려하십시오. Id
는 단위 행렬이다블록 삼중 대 매트릭스,이 종류의 행렬을 프로그래밍하는 방법?
매트릭스 L = 1/h² Id
, 우리는 K
같은 매트릭스를 고려한다.
내가 K
및 L
,하지만 어떻게 A
을 프로그램하는 프로그램 할 수 있습니다 :
A
프로그램 싶습니다
? A는 행렬로 구성된 행렬입니다. 이것을 파이썬으로 구현하는 방법은?
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]])
을 순수한 파이썬 :
매트릭스의 매트릭스를 만들고 zip
을 사용하여 중간 차원 및 편평한 목록 이해력으로 2D를 만듭니다. 의
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
numpy.eye 함수를 사용하면 대각선에있는 행과 0을 제외한 항등 행렬을 얻을 수 있습니다. 선택적 매개 변수 k=x
을 사용하여 대각선의 오프셋을 지정할 수 있습니다. 이 항등 행렬에 스칼라를 곱하면 L
과 K
을 소개 할 수 있습니다. 행렬을 함께 추가하면 원하는 대칭 행렬을 얻을 수 있습니다. 당신이 열려 있으면
import numpy as np
m, n = 4, 4
L = 1
K = 4
A = np.eye(m, n, k=-1) * (-L) + np.eye(m, n) * K + np.eye(m, n, k=1) * (-L)
가능한 복제 [블록 삼중 대각 행렬 파이썬 (https://stackoverflow.com/questions/5842903/block-tridiagonal-matrix-python) – RagingRoosevelt
@RagingRoosevelt 그것은 나에게 잘 속는 사람처럼 보이지 않는다. 링크 된 OP는 블록 행렬이 실제로 무엇인지 알지 못하는 반면 이것은 진정한 블록 행렬을 요구합니다. –
네가 옳은 것 같아. 내가 잘못 읽은 것 같아. – RagingRoosevelt