2017-12-11 1 views
0

h=1/(n+1)n>=1을 고려하십시오. Id는 단위 행렬이다블록 삼중 대 매트릭스,이 종류의 행렬을 프로그래밍하는 방법?

enter image description here

매트릭스 L = 1/h² Id, 우리는 K 같은 매트릭스를 고려한다.

enter image description here

내가 KL,하지만 어떻게 A을 프로그램하는 프로그램 할 수 있습니다 :

우리는 매트릭스 A 프로그램 싶습니다

? A는 행렬로 구성된 행렬입니다. 이것을 파이썬으로 구현하는 방법은?

+1

가능한 복제 [블록 삼중 대각 행렬 파이썬 (https://stackoverflow.com/questions/5842903/block-tridiagonal-matrix-python) – RagingRoosevelt

+3

@RagingRoosevelt 그것은 나에게 잘 속는 사람처럼 보이지 않는다. 링크 된 OP는 블록 행렬이 실제로 무엇인지 알지 못하는 반면 이것은 진정한 블록 행렬을 요구합니다. –

+0

네가 옳은 것 같아. 내가 잘못 읽은 것 같아. – RagingRoosevelt

답변

2

numpy/scipy (권장) :

줄무늬 행렬을 만드는 데 사용할 scipy.linalg.toeplitznumpy.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 
1

numpy.eye 함수를 사용하면 대각선에있는 행과 0을 제외한 항등 행렬을 얻을 수 있습니다. 선택적 매개 변수 k=x을 사용하여 대각선의 오프셋을 지정할 수 있습니다. 이 항등 행렬에 스칼라를 곱하면 LK을 소개 할 수 있습니다. 행렬을 함께 추가하면 원하는 대칭 행렬을 얻을 수 있습니다. 당신이 열려 있으면

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) 
관련 문제