Python SciPy

비선형 방정식 찾기 (SciPy.optimize.root)

PyExplorer 2025. 3. 8. 09:33

비선형 방정식 찾기 (SciPy.optimize.root)

1. 개요

비선형 방정식은 선형 방정식과 달리 단순한 행렬 연산으로 해를 구할 수 없으며, 수치적 방법을 이용해야 합니다. Python의 SciPy 라이브러리는 scipy.optimize.root 함수를 제공하여 다양한 방법으로 비선형 방정식의 해를 찾을 수 있도록 지원합니다.

이 글에서는 scipy.optimize.root를 이용하여 비선형 방정식의 해를 찾는 방법을 설명하고, 다양한 알고리즘을 비교하면서 실제 예제를 통해 활용하는 방법을 살펴보겠습니다.


2. 비선형 방정식이란?

비선형 방정식은 미지수를 포함하는 방정식에서 미지수가 1차식이 아닌 경우를 의미합니다. 예를 들어 다음과 같은 방정식들이 비선형 방정식에 해당합니다.

  • $ f(x) = x^3 - 2x - 5 = 0 $
  • $ g(x, y) = \begin{cases} x^2 + y^2 - 4 = 0 \ x - y^2 + 1 = 0 \end{cases} $

이러한 방정식들은 닫힌 형태의 해를 구하기 어렵기 때문에, 수치적 접근 방식이 필요합니다.


3. scipy.optimize.root 개요

scipy.optimize.root 함수는 비선형 방정식의 해를 찾는 다양한 알고리즘을 제공합니다. 주요 특징은 다음과 같습니다.

  • 단일 변수 또는 다변수 방정식을 해결할 수 있음
  • 다양한 수치적 해법 (Newton, Broyden, Hybr 등) 제공
  • 초기값을 설정하여 반복적으로 해를 찾음

사용법은 다음과 같습니다.

from scipy.optimize import root

def func(x):
    return x**3 - 2*x - 5

sol = root(func, x0=2)  # 초기 추정값 x0=2
print(sol)

root 함수의 주요 매개변수는 다음과 같습니다.

  • fun: 비선형 방정식 함수
  • x0: 초기 추정값
  • method: 사용할 알고리즘 (기본값: ‘hybr’)

4. 단일 변수 방정식의 해 찾기

예제: $ f(x) = x^3 - 2x - 5 = 0 $의 해를 찾기

import numpy as np
from scipy.optimize import root

# 비선형 함수 정의
def f(x):
    return x**3 - 2*x - 5

# 초기 추정값 설정
x0 = 2

# 해 찾기
sol = root(f, x0)

# 결과 출력
print("해:", sol.x)
print("성공 여부:", sol.success)
print("설명:", sol.message)

주요 알고리즘 비교

root 함수는 여러 가지 알고리즘을 제공하며, 대표적인 방법은 다음과 같습니다.

방법 설명
hybr SciPy 기본 알고리즘, 다변수에도 적합
lm Levenberg-Marquardt 방식 (비선형 최소제곱)
broyden1 Broyden의 1차 근사 방법
broyden2 Broyden의 2차 근사 방법
anderson Anderson Mixing 방법
df-sane 대규모 문제 해결에 적합

알고리즘을 변경하여 결과를 비교할 수 있습니다.

sol_broyden = root(f, x0, method='broyden1')
print("Broyden1 방법 해:", sol_broyden.x)

5. 다변수 방정식의 해 찾기

예제: 연립 비선형 방정식 해결

다음과 같은 연립 방정식의 해를 찾아봅시다.

$$\begin{cases} x^2 + y^2 - 4 = 0 \ x - y^2 + 1 = 0 \end{cases}$$

import numpy as np
from scipy.optimize import root

def system(vars):
    x, y = vars
    eq1 = x**2 + y**2 - 4
    eq2 = x - y**2 + 1
    return [eq1, eq2]

# 초기 추정값 설정
x0 = [1, 1]

# 해 찾기
sol = root(system, x0, method='hybr')

# 결과 출력
print("해:", sol.x)

다양한 초기값 실험

비선형 방정식은 초기값에 따라 수렴 결과가 달라질 수 있습니다. 다른 초기값을 설정해 실험해 보세요.

x0_alt = [-1, -1]
sol_alt = root(system, x0_alt, method='hybr')
print("다른 초기값에서의 해:", sol_alt.x)

6. 활용 사례

(1) 공학 문제 해결

비선형 방정식은 전기회로, 기계 공학, 유체 역학 등 다양한 분야에서 활용됩니다.

(2) 경제 모델링

수요-공급 균형점, 경제 성장 모델 등의 문제에서 방정식의 해를 찾는 데 활용됩니다.

(3) 머신러닝 및 최적화

손실 함수의 최적화 문제에서 경사 하강법 이외의 대안으로 사용될 수 있습니다.


7. 결론

  • scipy.optimize.root를 활용하면 다양한 방법으로 비선형 방정식의 해를 찾을 수 있습니다.
  • 단일 변수 및 다변수 방정식 모두 해결 가능하며, 다양한 알고리즘을 지원합니다.
  • 초기 추정값이 결과에 영향을 미칠 수 있으므로 실험이 필요합니다.

이번 글에서는 root 함수를 이용하여 단일 변수 및 다변수 방정식을 해결하는 방법을 살펴보았습니다. 실제 프로젝트에서 활용할 수 있도록 다양한 문제를 실험해 보는 것이 좋겠습니다.