행렬방정식 - 특수행렬 with Scipy & 여러 식을 한꺼번에 풀기

Toeplitz 행렬 Solver

linalg.solve_toeplitz((c, r), b) : c/r - 1D array (vector)
기본 알고리즘 : Levinson-Durbin Recursion 계산량 \(\sim n^2\) 행렬사이즈의 2승에 비례하는 량
행렬 사이즈가 커질 수록 solve_toeplitz 함수가 유리함

Toeplitz Matrix 구축

linalg.toeplitz(c,r) 이게 꼭 필요할까? 작은사이즈 외에 경우에는 필요하지 않음

Circulant 행렬 Solver

0번째 컬럼만 알면 가능

linalg.solver_circulant(c, b)

기본 알고리즘 : Discrete Fourier Transform → 실질적으로 Fast Fourier transform 으로 문제를 해결

행렬사이즈 n의 log(n)에 비례하는 계산량 : \(\sim nlog(n)\)

Circulant Matrix 구축

linalg.circulant(c) : 추천하지 않음


여러 식을 한꺼번에 풀기 !

행렬방정식을 푸는 함수는 \(A\mathbf{x} = b\) 뿐만 아니라 \(AX = B\) 형태도 적용가능하다~!

→ b벡터가 여러개일 때 한번에 푸는 방법
→ A가 불변하고 B는 이미 주어진 상황이라면,

일반행렬

  • linalg.solve(A, B, {assume_a = 'gen'})
  • linalg.solve_triangular(A, B, {lower = False})

밴드행렬

  • linalg.solve_banded((lbw, ubw), band_a, B)
  • linalg.solveh_banded(band_a_h, B, lower=False)

특수행렬

  • linalg.solve_toeplitz((c, r), B)
  • linalg.solve_circulant(c, B)

→ 모두 B 벡터를 행렬로 넣어주면 결과를 반환함