Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy로 연립 선형 방정식 풀기 – np.linalg.solve() 사용법 완벽 정리

선형 행렬 방정식(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를 발생시킵니다. 따라서 이 메서드를 사용하기 전에 계수 행렬이 풀 랭크인지 확인하는 것이 좋습니다.