False Position Method (가위치법 )는 비선형 방정식의 근을 구하는 수치해석 기법 중 하나로, 두 점 사이의 선형 보간(linear interpolation)을 사용하여 근을 점점 좁혀가는 방식입니다. **이분법(bisection method)**과 유사하지만, 중간점을 f(x)의 선형 보간으로 계산한다는 차이가 있습니다.
def false_position(f, a, b, tol=1e-6, max_iter=100):
if f(a) * f(b) >= 0:
raise ValueError("f(a)와 f(b)는 서로 다른 부호여야 합니다.")
for i in range(max_iter):
# 근을 보간하여 계산
c = (a * f(b) - b * f(a)) / (f(b) - f(a))
fc = f(c)
print(f"Iteration {i+1}: c = {c}, f(c) = {fc}")
if abs(fc) < tol:
print("허용 오차 기준에 도달")
return c
# 구간 업데이트
if f(a) * fc < 0:
b = c
else:
a = c
print("최대 반복 횟수 도달")
return c
import math
# 예: f(x) = x^3 - x - 2 의 근 찾기
def f(x):
return x**3 - x - 2
root = false_position(f, 1, 2)
print("근:", root)
장점 | 단점 |
---|---|
이분법보다 빠르게 수렴 가능 | 수렴 속도가 느릴 수 있음 (한쪽 끝이 고정되면 개선 안 됨) |
수렴 보장 (f(a)*f(b)<0 일 때) | 극단적인 기울기에서는 매우 느릴 수 있음 |
다양한 함수에 대해 False Position Method를 적용해볼 수 있는 예제를 아래에 정리함. 각 함수는 실근을 가지도록 설정했고, False Position Method가 잘 작동하도록 적절한 구간도 함께 제공.
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.cos(x) - x # 함수 정의
def false_position(f, a, b, tol=1e-6, max_iter=100):
if f(a) * f(b) >= 0:
raise ValueError("f(a)와 f(b)는 서로 다른 부호여야 합니다.")
for i in range(max_iter):
c = (a * f(b) - b * f(a)) / (f(b) - f(a))
fc = f(c)
print(f"Iteration {i+1}: c = {c:.6f}, f(c) = {fc:.6f}")
if abs(fc) < tol:
print("허용 오차 도달!")
return c
if f(a) * fc < 0:
b = c
else:
a = c
return c
root = false_position(f, 0, 1)
print("근:", root)