logo

바이섹션 메소드 📂수치해석

바이섹션 메소드

메소드 1

연속함수 $f$ 가 폐구간 $[a,b]$ 에서 $f(a) f(b) < 0$ 이라고 하자. 허용오차는 $\varepsilon$ 이다. $f(c) = 0$ 를 만족하는 $c \in [a,b]$ 는 다음과 같이 구할 수 있다.


Step 1.

$$c:= {{a+b} \over {2}}$$


Step 2.

$b-c \le \varepsilon$ 이면 $c$ 를 반환한다.


Step 3.

$f(b) f(c) < 0$ 이면 $a:=c$, 아니면 $b:=c$ 이라 둔다. 그 후 Step 1. 으로 돌아간다.

설명

20180831\_133259.png

중간값 정리의 대표적인 응용으로써, 해가 존재하는 구간을 계속 절반으로 줄여가며 방정식 $f(x) = 0$ 의 근사해를 찾는 방법이다. 당장 해를 구해야하는 방정식이 있는데 아무런 라이브러리도 없다면 즉석에서 짜서 쓸 수도 있을 정도로 간단하다.

주어진 조건이 사실상 폐구간에서 정의된 연속함수라는 것밖에 없다는 점과 사용자가 지정하는 범위 안에서 해를 찾는다는 점이 매력적이지만 수렴차수가 리니어하다는 단점이 있다. 이 때문에 보통 간단한 방정식은 뉴턴-랩슨 메소드를 써서 풀게 된다.

구현

20180831\_143733.png

아래는 R로 작성된 예제 코드다.

IVT<-function(f,a,b) {f(a)*f(b)<0}
 
Bisect<-function(f,a,b,tol=10^(-8))
{
  if(!IVT(f,a,b)) {stop("Wrong Interval")}
  
  c<-b
  if (a>b) {b<-a; a<-c}
  
  c=(a+b)/2
  if(abs(f(c))<tol) {return(c)}
  
  while(1)
  {
    c=(a+b)/2 #Step 1.
    if(abs(b-c)<tol) {break} #Step 2.
    if(IVT(f,c,b)) {a=c} else {b=c} #Step 3.
  }
  
  return(c)
}
 
f<-function(x) {x^3 + 8}
Bisect(f,-7,7)
 
g<-function(x) {x^6 - x - 1}
Bisect(g,0,3)
 
h<-function(x) {exp(x)-1 }
Bisect(h,-pi,pi)
Bisect(h,-2,-1)

  1. Atkinson. (1989). An Introduction to Numerical Analysis(2nd Edition): p56~57. ↩︎