[벡터#3 방정식] numpy.linalg.solve()로 빠르게 풀기
사과 2개 + 바나나 3개 = 8,000원? 손으로 풀면 5분, Python으로는 빠르게! 연립방정식을 코드 3줄로 해결하는 방법을 배웁니다.
워밍업: 이런 적 있으시죠?
편의점에서 사과 2개랑 바나나 3개 사니까 8,000원이었어요. 다음 날 사과 4개랑 바나나 1개 사니까 6,000원이었고요.
"어? 그럼 사과 1개, 바나나 1개는 각각 얼마지?" 궁금하신 적 있으시죠? 이게 연립방정식이에요.
선형 방정식 풀기 - 손계산은 이제 그만!
사과 2개, 바나나 3개 사면 8,000원. 사과 4개, 바나나 1개 사면 6,000원. 각각 얼마일까요?
중학교 때 배운 연립방정식 기억나시나요? 손으로 풀면 5분 걸리고, 계산 실수도 자주 나죠. 하지만 Python numpy.linalg.solve()로는 빠르게 정확한 답이 나옵니다.
왜 이걸 배워야 할까?
일상에서 이런 상황을 겪어본 적 있나요?
- 가격 역산: 묶음 상품 가격에서 개별 가격 알아내기
- 재무 계획: 저축, 투자, 지출 목표 달성을 위한 월별 금액 계산
- 자원 배분: 제한된 예산으로 최적의 물품 구매 계획
- 레시피 변환: 4인분 레시피를 7인분으로 변환할 때 재료량 계산
이런 문제들은 모두 선형 방정식으로 해결할 수 있어요. 그리고 Python은 이걸 1줄로 풀어냅니다!
1. 선형 방정식이 뭔가요?
일상 속의 방정식
마트에서 이런 상황을 겪었다고 해봐요:
상황 1: 사과 2개 + 바나나 3개 = 8,000원
상황 2: 사과 4개 + 바나나 1개 = 6,000원
Q. 사과 1개, 바나나 1개는 각각 얼마?
손으로 풀면 이렇게 하죠:
2x + 3y = 8,000 ... ①
4x + 1y = 6,000 ... ②
① × 2: 4x + 6y = 16,000
②에서 빼기: 5y = 10,000
∴ y = 2,000원 (바나나)
②에 대입: 4x + 2,000 = 6,000
∴ x = 1,000원 (사과)
→ 5분 소요
Python으로는?
import numpy as np
# 계수 행렬
A = np.array([
[2, 3],
[4, 1]
])
# 상수 벡터
b = np.array([8000, 6000])
# 해 구하기
solution = np.linalg.solve(A, b)
print(f"사과: {solution[0]:.0f}원, 바나나: {solution[1]:.0f}원")
→ 완료!
2. 계수 행렬과 상수 벡터
방정식을 컴퓨터가 이해할 수 있는 형태로 바꿔야 해요.
원래 방정식:
2x + 3y = 8,000
4x + 1y = 6,000
행렬로 표현:
계수 행렬 A (좌변의 계수들)
┌ ┐
│ 2 3 │ ← 첫 번째 방정식의 계수
│ 4 1 │ ← 두 번째 방정식의 계수
└ ┘
상수 벡터 b (우변의 상수들)
┌ ┐
│ 8000 │ ← 첫 번째 방정식의 우변
│ 6000 │ ← 두 번째 방정식의 우변
└ ┘
NumPy 코드로 표현:
import numpy as np
# 계수 행렬 A
A = np.array([
[2, 3], # 2x + 3y
[4, 1] # 4x + 1y
])
# 상수 벡터 b
b = np.array([8000, 6000])
print("계수 행렬 A:")
print(A)
print("
상수 벡터 b:")
print(b)
3. numpy.linalg.solve() 강력한 함수
이제 핵심을 배워볼게요!
단 1줄로 연립방정식 해결:
import numpy as np
# 연립방정식:
# 2x + 3y = 8,000
# 4x + 1y = 6,000
# 계수 행렬 A
A = np.array([
[2, 3],
[4, 1]
])
# 상수 벡터 b
b = np.array([8000, 6000])
# 해 구하기 (이 1줄이 핵심!)
solution = np.linalg.solve(A, b)
print(f"x (사과) = {solution[0]:.0f}원")
print(f"y (바나나) = {solution[1]:.0f}원")
# 출력:
# x (사과) = 1000원
# y (바나나) = 2000원
검증하기:
# 정말 맞는지 확인해볼까요?
verification = np.dot(A, solution)
print(f"
검증: A @ solution = {verification}")
print(f"원래 b = {b}")
print(f"일치 여부: {np.allclose(verification, b)}")
# 출력:
# 검증: A @ solution = [8000. 6000.]
# 원래 b = [8000 6000]
# 일치 여부: True
4. 실전 예제: 3x3 연립방정식
2개 미지수는 쉬웠죠? 3개도 똑같아요!
문제:
과일 가격 계산 문제
- 사과 1개 + 바나나 2개 + 오렌지 1개 = 7,000원
- 사과 2개 + 바나나 1개 + 오렌지 2개 = 9,000원
- 사과 1개 + 바나나 1개 + 오렌지 1개 = 5,000원
Q. 각 과일은 얼마?
손으로 풀면: 10분+ 소요
Python으로: 빠르게 완료!
import numpy as np
# 연립방정식:
# 1x + 2y + 1z = 7,000
# 2x + 1y + 2z = 9,000
# 1x + 1y + 1z = 5,000
# 계수 행렬 (3x3)
A = np.array([
[1, 2, 1], # 사과 1 + 바나나 2 + 오렌지 1
[2, 1, 2], # 사과 2 + 바나나 1 + 오렌지 2
[1, 1, 1] # 사과 1 + 바나나 1 + 오렌지 1
])
# 상수 벡터
b = np.array([7000, 9000, 5000])
# 해 구하기
solution = np.linalg.solve(A, b)
print("과일 가격:")
print(f" 사과: {solution[0]:.0f}원")
print(f" 바나나: {solution[1]:.0f}원")
print(f" 오렌지: {solution[2]:.0f}원")
# 검증
verification = np.dot(A, solution)
print(f"
검증: {np.allclose(verification, b)}")
실행 결과:
과일 가격:
사과: 2000원
바나나: 1000원
오렌지: 2000원
검증: True
5. 실무 활용 예제
예제 1: 가계부 최적화
상황: 월 300만원 수입으로 저축, 투자, 생활비를 배분하고 싶어요.
조건:
- 저축 + 투자 + 생활비 = 300만원
- 투자는 저축의 2배
- 생활비는 투자의 1.5배
Q. 각각 얼마씩 배분해야 할까?
import numpy as np
# 연립방정식:
# x + y + z = 300 (총합)
# y = 2x → -2x + y = 0
# z = 1.5y → -1.5y + z = 0
A = np.array([
[1, 1, 1], # 저축 + 투자 + 생활비 = 300
[-2, 1, 0], # 투자 = 저축 × 2
[0, -1.5, 1] # 생활비 = 투자 × 1.5
])
b = np.array([300, 0, 0])
solution = np.linalg.solve(A, b)
print("최적 배분:")
print(f" 저축: {solution[0]:.1f}만원")
print(f" 투자: {solution[1]:.1f}만원")
print(f" 생활비: {solution[2]:.1f}만원")
실행 결과:
최적 배분:
저축: 60.0만원
투자: 120.0만원
생활비: 120.0만원
예제 2: 레시피 변환
상황: 4인분 레시피를 7인분으로 변환하고 싶어요.
import numpy as np
# 원래 레시피 (4인분)
# 밀가루 2컵 + 계란 3개 + 우유 1컵 = 4인분
# 밀가루 4컵 + 계란 1개 + 우유 2컵 = 4인분
# 7인분 만들려면?
A = np.array([
[2, 3, 1],
[4, 1, 2]
])
b = np.array([7, 7]) # 7인분
# 이 경우는 방정식 수 < 미지수이므로
# 최소제곱법 사용
solution = np.linalg.lstsq(A, b, rcond=None)[0]
print("7인분 레시피:")
print(f" 밀가루: {solution[0]:.1f}컵")
print(f" 계란: {solution[1]:.1f}개")
print(f" 우유: {solution[2]:.1f}컵")
6. 이제 할 수 있어요!
이 글을 읽고 나면 이런 걸 할 수 있어요:
1. 빠른 문제 해결
- 손으로 5분 걸리던 계산을 빠르게 단축
- 계산 실수 걱정 없이 정확한 답
- 3개 이상 미지수도 쉽게 해결
2. 실무 활용
- 가격 역산, 재무 계획, 자원 배분
- 레시피 변환, 재료량 계산
- 복잡한 비즈니스 문제 해결
3. 데이터 분석 기초
- 선형 회귀 분석의 기초 원리 이해
- 머신러닝 알고리즘의 수학적 배경
- 최적화 문제 해결 능력
흔한 실수와 해결법
실수 1: 해가 없는 경우
# ❌ 해가 없는 방정식
# x + y = 10
# x + y = 20 (위 식과 모순!)
A = np.array([[1, 1], [1, 1]])
b = np.array([10, 20])
try:
solution = np.linalg.solve(A, b)
except np.linalg.LinAlgError:
print("해가 없거나 무수히 많습니다!")
실수 2: 행렬 크기 불일치
# ❌ 잘못된 예
A = np.array([[1, 2], [3, 4]]) # 2x2 행렬
b = np.array([5, 6, 7]) # 3개 원소 (오류!)
# ✅ 올바른 예
A = np.array([[1, 2], [3, 4]]) # 2x2 행렬
b = np.array([5, 6]) # 2개 원소 (정상!)
정리하며
선형 방정식은 중학교 때 배웠지만, Python을 알면 진짜 강력한 도구가 됩니다.
이 글에서 배운 것:
- 선형 방정식 기초
- 일상 속 문제를 방정식으로 표현하기
- 계수 행렬과 상수 벡터 이해
- numpy.linalg.solve() 활용
- 단 1줄로 연립방정식 해결
- 2x2부터 3x3 이상까지 확장
- 실무 활용
- 가계부, 레시피, 가격 계산 등
- 복잡한 문제도 간단하게 해결
다음 시리즈 예고:
다음 글에서는 정규표현식으로 데이터 추출하기를 배워요. 100페이지 문서에서 이메일 주소를 1초 만에 찾아내는 방법, 궁금하지 않으세요?
연습 과제:
- 자신만의 가계부 최적화 방정식 만들어보기
- 4x4 연립방정식 풀어보기
- 해가 없는 경우와 무수히 많은 경우 실험해보기
연립방정식, 이제 손으로 풀지 마세요. Python이 대신 해드립니다!
