HOWTO · Python
Python에서 Fsolve 사용
이 문서는 Python에서 fsolve를 사용하는 방법을 보여줍니다.
이 페이지의 내용
scipy.optimize.fsolve는 비선형 함수의 값이 0이 되도록 하는 값을 수치적으로 찾습니다. 이 가이드에서는 SciPy 설치, 스칼라 방정식이나 연립방정식 풀기, 초기 추정값 선택, 해법의 결과 확인 방법을 살펴봅니다.
fsolve가 푸는 문제
fsolve는 SciPy의 scipy.optimize 모듈에 있는 함수입니다. 국소 수치 방법을 적용해 func(x) = 0의 근을 찾으며, x에는 미지수가 하나 이상 들어갈 수 있습니다. 연립방정식의 경우 func는 미지수마다 잔차 하나를 반환하고, 근에서는 모든 잔차가 0에 가까워집니다.
수치 해법은 근이 존재하거나 유일하다는 사실, 또는 근이 하나뿐이라는 사실을 증명하지 않습니다. 주어진 시작값에서 탐색하며, 시작값에 따라 서로 다른 근으로 수렴할 수 있습니다. 반환된 값을 사용하려면 해법의 수렴 정보와 문제의 잔차를 모두 확인해야 합니다.
SciPy 설치 및 fsolve 가져오기
스크립트를 실행할 Python 환경에 python -m pip install scipy 명령으로 SciPy를 설치합니다. 스크립트에서는 from scipy.optimize import fsolve로 함수를 가져옵니다. 해당 환경에 SciPy가 이미 설치되어 있다면 다시 설치할 필요가 없습니다.
스칼라 비선형 방정식 풀기
미지수가 하나라면 입력 배열을 받아 잔차를 반환하는 함수를 정의합니다. 이 예제에서는 양의 근에 가까운 값에서 시작해 x² - 2 = 0을 풉니다.
다음 예제를 실행합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from scipy.optimize import fsolve
def residual(x):
return x[0] ** 2 - 2
root, info, ier, message = fsolve(residual, [1.0], full_output=True)
print("root:", root[0])
print("residual:", residual(root))
print("converged:", ier == 1)
root: 1.4142135623730947
residual: -8.881784197001252e-16
converged: True
fsolve는 x를 배열로 전달하므로 함수는 단일 원소인 x[0]을 읽습니다. 반환되는 root도 배열 형태입니다. full_output=True를 지정하면 호출 결과로 해, 정보 딕셔너리, 정수 상태 코드, 메시지가 반환됩니다. 상태 값 1은 해법이 수렴했다고 보고함을 나타냅니다. 그래도 애플리케이션에 필요한 정확도를 충족하는지 잔차를 확인하세요.
비선형 연립방정식 풀기
연립방정식에서는 미지수 벡터와 길이가 같은 잔차 시퀀스를 반환해야 합니다. 이 예제는 두 방정식과 두 미지수, 즉 x² + y² - 5 = 0과 x - y - 1 = 0을 사용합니다. 초기 벡터는 해 (2, 1)에 가깝습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from scipy.optimize import fsolve
def equations(values):
x, y = values
return [x**2 + y**2 - 5, x - y - 1]
initial_guess = [1.8, 0.8]
solution, info, ier, message = fsolve(
equations, initial_guess, full_output=True
)
print("solution:", solution)
print("residuals:", equations(solution))
print("converged:", ier == 1)
solution: [2. 1.]
residuals: [np.float64(-2.3092638912203256e-14), np.float64(0.0)]
converged: True
initial_guess의 두 원소는 각각 x와 y에 대응하며, 함수는 방정식과 같은 순서로 잔차 두 개를 반환합니다. 잔차 개수와 미지수 개수를 일치시키세요. 근이 여러 개인 연립방정식에서는 초기 벡터가 국소 반복 과정에서 어떤 근에 가까워질지에 영향을 줄 수 있습니다.
초기 추정값을 선택하고 결과 확인하기
가능하면 x0를 그럴듯한 근에 가까운 값으로 선택하세요. 해법은 이 시작점에서 국소적으로 탐색하므로, 너무 멀리 있거나 스케일이 적절하지 않은 추정값은 실패하거나 다른 근으로 수렴하거나 애플리케이션에 유용하지 않은 점에 도달하게 할 수 있습니다. 가능한 근이 여러 개라면 모델에 근거한 시작값을 몇 가지 시도하고 반환된 해를 비교하세요.
진단 정보가 필요하면 full_output=True를 지정하고 ier와 mesg(예제에서는 message라는 이름)를 확인하세요. 상태 코드 1은 해법의 종료 기준에 따라 수렴했음을 보고하지만, 모델이 올바르다거나 잔차가 용도에 맞을 만큼 작다는 뜻은 아닙니다. func(solution)을 직접 계산하고 문제의 단위와 스케일에 적합한 허용 오차를 기준으로 각 잔차를 살펴보세요. 결과가 적절하지 않다면 반환된 숫자를 근의 증거로 간주하지 말고 초기 추정값, 스케일링, 모델 또는 해법 선택을 다시 검토하세요.
fsolve의 주요 매개변수와 한계
호출 형식은 fsolve(func, x0, args=(), fprime=None, full_output=False, col_deriv=False, xtol=1.49012e-8, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)입니다. SciPy의 공식 fsolve 참조 문서에서 전체 시그니처와 반환값을 확인할 수 있습니다.
func는 잔차를 0에 가깝게 만드는 함수입니다. 현재 추정값과args에 담긴 추가 값을 받습니다.x0는 초기 추정값입니다. 미지수가 하나라면 스칼라와 유사한 값을, 연립방정식이라면 벡터를 사용할 수 있습니다. 예제에서는 함수가 일관된 방식으로 입력을 처리하도록 배열을 사용합니다.args는 추정값 다음에func로 전달할 추가 인수를 담은 튜플입니다.fprime에는 도함수의 야코비 행렬을 지정할 수 있습니다. 기본적으로 행은 잔차 함수에, 열은 변수에 대응합니다.full_output을 지정하면 해와 함께 진단 정보, 상태 코드, 메시지를 요청합니다.col_deriv는 지정한 야코비 행렬이 열 방향으로 도함수를 계산하는지 나타냅니다. 이 설정은 전치 연산을 피할 수 있으며fprime를 제공할 때 의미가 있습니다.xtol는 연속 반복값 사이의 상대 오차 허용치를 설정합니다. 이 종료 기준을 충족해도 잔차가 작다고 보장되지는 않습니다.maxfev는 함수 평가 횟수를 제한합니다. 값을 0으로 두면 변수 개수에 따라 정해지는 SciPy 기본 한도를 사용합니다.band는 SciPy가 도함수를 추정하고fprime를 지정하지 않았을 때, 대역형 야코비 행렬의 하단 및 상단 대역폭을 나타냅니다.epsfcn은fprime를 지정하지 않은 경우 도함수 추정에 사용하는 유한 차분 단계 크기에 관한 정보를 제공합니다.factor는 초기 단계의 한도를 설정하며 허용 범위는 0.1부터 100까지입니다.diag에는 변숫값의 크기 차이가 큰 경우 유용한 양의 스케일 인수를 지정할 수 있습니다.
fsolve는 국소 근 찾기 함수이며 해가 있다고 일반적으로 보장하지 않습니다. 수치적 동작은 함수, 시작 추정값, 스케일링, 종료 설정에 따라 달라집니다.