본문 바로가기
수업/수치계산

[수치계산] 오차&비선형 방정식의 해 - 이분법

by graygreat 2017. 6. 9.
728x90
반응형


이분법 (bisection method)


● 중간값 정리


- 함수 f(x)가 구간 (x1, x2)에서 연속이고, f(x1)과 f(x2)의 부호가 서로 반대이면 x1, x2사이에 적어도 한 개의 근이 존재함


● 이진탐색 (binary search)와 유사


● 계산 방법


1. x3 = (x1 + x2) / 2

2. if f(x1) * f(x3) < 0,, x2 = x3

3. else x1 = x3

4. 1번 반복





Tip. Used APIs

- double exp(double x) : e


- double fabs(double x) : 절대값


#include <stdio.h>
#include <math.h>

#define THRESHOLD 0.00001

double f(double x) {
    double ret = 0;
    ret = x - exp(-x);
    return ret;
}

int main() {
    double x1 = 0;
    double x2 = 1;
    double x3 = 0;
    int i = 1;

    printf("i \t x1 \t\t x2 \t\t x3 \t\t f(x3) \n");
    while (1) {
        x3 = (x1 + x2) / 2;
        printf("%d \t %f \t\t %f \t\t %f \t\t %f \n", i, x1, x2, x3, f(x3));

        if (fabs(f(x3)) < 0.000001) break;

        if (f(x1) * f(x3) < 0)
            x2 = x3;
        else
            x1 = x3;
        i++;
    }

    return 0;
}


결과



반응형

댓글