본문 바로가기

IT/Numerical analysis

Bisection Method C언어로 구현하기

/* 
written by kaspy (kaspyx@gmail.com)
*/ 

수치해석에서 나오는 해를 찾는 방법이다.

수학에서 이분법(二分法, Bisection method)은 근이 반드시 존재하는 폐구간을 이분한 후, 이 중 근이 존재하는 하위 폐구간을 선택하는 것을 반복하여서 근을 찾는 알고리즘이다. 간단하고 견고하나, 상대적으로 느린 방식이다.


참고 위키

http://ko.wikipedia.org/wiki/%EC%9D%B4%EB%B6%84%EB%B2%95_(%EC%88%98%ED%95%99)


f(x) = x^2 * sin(x) 로 주어졌을때


  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define PI  3.1415926535897931
  5.  
  6. #define thshold 2 * pow(10,-4)
  7.  
  8.  
  9. double sinfx(double x){
  10.  
  11.         return (x*- sin(x));
  12. }
  13.  
  14. void BisectionMethod(double xl,double xu){
  15.  
  16.         double x;
  17.         double xr;
  18.         double xr2;
  19.  
  20.         double e0=100.0;
  21.         int it =0;
  22.        
  23.         printf("it\t\txl\t\txu\t\txr\t\te0\n");
  24.         while(e0 > thshold ){
  25.  
  26.                 x = xl+(xu-xl)/2.0;
  27.                 xr = (xl+xu)/2;
  28.                
  29.                 if(sinfx(xl)*sinfx(x) <= 0)
  30.                
  31.                         xu = x;
  32.  
  33.                         else{
  34.                                 xl = x;
  35.                         }
  36.  
  37.                     printf("%d\t%lf\t%lf\t%lf\t%lf\n",it++,xl,xu,xr,e0);
  38.                         xr2 = (xl+xu)/2;
  39.                         e0 = fabs((xr-xr2)/xr) * 100;
  40.                         xr = xr2;
  41.         }
  42.  
  43.         printf("%lf\n",x);
  44. }
  45.  
  46. int main(void){
  47.  // programmed by kaspyx
  48.  BisectionMethod(0.5,1);
  49.  return 0;
  50. }