선형 행렬 방정식(linear matrix equation)을 풀 때 Python에서는 numpy.linalg.solve() 메서드를 사용합니다. 이 메서드는 잘 정의된(well-determined), 즉 풀 랭크(full rank)인 선형 행렬 방정식 ax = b에 대한 '정확한(exact)' 해 x를 계산하며, 연립 방정식 ax = b의 해를 반환합니다. 반환되는 배열의 형태(shape)는 b와 동일합니다.
첫 번째 매개변수 a는 계수 행렬(coefficient matrix)이고, 두 번째 매개변수 b는 종속 변수(dependent variable) 값, 즉 상수항을 의미합니다.
np.linalg.solve() 사용 단계
1단계: 필요한 라이브러리 임포트
가장 먼저 NumPy 라이브러리를 임포트합니다.
import numpy as np
2단계: 2차원 배열 생성
array() 메서드를 사용해 두 개의 2D NumPy 배열을 생성합니다. 예제에서는 다음 연립 방정식을 풀어보겠습니다.
- x0 + 2 * x1 = 1
- 3 * x0 + 5 * x1 = 2
arr1 = np.array([[1, 2], [3, 5]]) arr2 = np.array([1, 2])
3단계: 배열 출력하기
생성된 두 배열을 화면에 출력해 확인합니다.
print("Array1...\n", arr1)
print("\nArray2...\n", arr2)4단계: 배열의 차원 확인
ndim 속성으로 각 배열의 차원(dimension)을 확인할 수 있습니다.
print("\nDimensions of Array1...\n", arr1.ndim)
print("\nDimensions of Array2...\n", arr2.ndim)5단계: 배열의 형태(shape) 확인
shape 속성으로 각 배열의 형태를 확인합니다.
print("\nShape of Array1...\n", arr1.shape)
print("\nShape of Array2...\n", arr2.shape)6단계: 선형 행렬 방정식 풀기
이제 numpy.linalg.solve() 메서드를 호출하여 방정식의 해를 구합니다.
print("\nResult...\n", np.linalg.solve(arr1, arr2))전체 예제 코드
import numpy as np
# array() 메서드로 두 개의 2D NumPy 배열 생성
# 연립 방정식: x0 + 2 * x1 = 1, 3 * x0 + 5 * x1 = 2
arr1 = np.array([[1, 2], [3, 5]])
arr2 = np.array([1, 2])
# 배열 출력
print("Array1...\n", arr1)
print("\nArray2...\n", arr2)
# 배열의 차원 확인
print("\nDimensions of Array1...\n", arr1.ndim)
print("\nDimensions of Array2...\n", arr2.ndim)
# 배열의 형태(shape) 확인
print("\nShape of Array1...\n", arr1.shape)
print("\nShape of Array2...\n", arr2.shape)
# numpy.linalg.solve() 메서드로 선형 행렬 방정식 풀기
print("\nResult...\n", np.linalg.solve(arr1, arr2))실행 결과
Array1... [[1 2] [3 5]] Array2... [1 2] Dimensions of Array1... 2 Dimensions of Array2... 1 Shape of Array1... (2, 2) Shape of Array2... (2,) Result... [-1. 1.]
결과 해석
실행 결과 x0 = -1, x1 = 1이라는 해가 도출되었습니다. 실제로 검증해 보면 다음과 같습니다.
- x0 + 2 * x1 = -1 + 2 × 1 = 1 ✓
- 3 * x0 + 5 * x1 = 3 × (-1) + 5 × 1 = 2 ✓
두 방정식 모두 만족하므로, numpy.linalg.solve()가 올바른 해를 반환했음을 확인할 수 있습니다.
참고 사항
numpy.linalg.solve()는 계수 행렬 a가 특이(singular) 행렬이거나 정사각 행렬이 아닌 경우 LinAlgError를 발생시킵니다. 따라서 이 메서드를 사용하기 전에 계수 행렬이 풀 랭크인지 확인하는 것이 좋습니다.