False Position Method 설명 (python 구현)
- 목차
반응형
2024.02.02 - [데이터 분석/최적화 알고리즘] - Secant Method 설명 (python 구현)
False Position Method (Regula Falsi)
방정식 $f(x) = 0$이 되게 하는 $x$를 찾는 알고리즘
수식
1. 구간 $[a, b]$를 잡는다.
- $f(a) \times f(b) < 0$. 즉, $f(a)$와 $f(b)$는 서로 다른 부호
2. 점 $(a, f(a))$와 점 $(b, f(b))$를 잇는 직선과 $x$축이 교차하는 점을 $c$로 한다.
- 만약 $f(a)$와 $f(c)$가 서로 다른 부호라면 $b=c$, 아니면 $a=c$
3. $|f(c)| < \text{tol}$이 될 때까지 반복, `tol`은 허용오차
장단점
- 미분이 필요없기 때문에 미분 불가능한 함수에도 적용할 수 있다.
- 일반적으로 Bisection보다 빠르다.
- Bisection처럼 첫 두 지점의 함수값의 부호가 달라야 한다.
구현 소스 코드
class falsi:
def __init__(self, a, b, func, tol=1e-6):
"""
a, b: 최초 설정 구간
f(a)*f(b) < 0, a < b
func: 해를 찾을 함수
"""
assert (func(a) * func(b) < 0) and (a < b)
self.a = a
self.b = b
self.func = func
self.tol = tol
def solve(self):
a_history = [self.a]
b_history = [self.b]
while True:
c = (self.a * self.func(self.b) - self.b * self.func(self.a) ) / (self.func(self.b) - self.func(self.a))
# 허용범위 이내일 때
if abs(self.func(c)) <= self.tol:
self.solution = c
self.history = [(a, b) for (a, b) in zip(a_history, b_history)]
return c
# f(a)와 f(c)가 서로 다른 부호인 경우
elif self.func(self.a) * self.func(c) < 0:
self.b = c
# f(a)와 f(c)가 서로 같은 부호인 경우
else:
self.a = c
a_history.append(self.a)
b_history.append(self.b)
예제
$f(x) = \sin ({ \cos ({ \rm{e}^x }) })$
RF = falsi(a=-1, b=1.5, func=f)
RF.solve() # 0.45158270246950966
f(RF.solution) # 4.4295596692314075e-09
$g(x) = \sinh (\cosh (x) - 2) - 1$
RF = bisection(a=0, b=2, func=g)
RF.solve() # 1.719843033910307
g(RF.solution) # -6.824534327654064e-07
전체 소스 코드 → github
728x90
반응형
'데이터 분석 > 최적화 알고리즘' 카테고리의 다른 글
Newton's Method (Quadratic interpolation with 2nd derivative) 설명 (python 구현) (0) | 2024.02.02 |
---|---|
Golden Section Search 설명 (python 구현) (0) | 2024.02.02 |
Secant Method 설명 (python 구현) (0) | 2024.02.02 |
Newton's Method 설명 (python 구현) (0) | 2024.02.02 |
Bisection Method 설명 (python 구현) (0) | 2024.02.02 |