본문 바로가기

Algorithm

이분법(Bisection Method)

이분법(Bisection Method)은 구간을 반씩 나누며 해를 찾아가는 방법입니다. 주어진 구간에서 함수의 값을 계산하여 구간을 절반으로 나누고, 함수값이 0에 가까운 지점을 찾는 방식으로 근을 찾아갑니다. 이 방법은 주로 연속 함수의 근을 구할 때 사용됩니다.

이분법을 이용한 함수 근 찾기

 

이분법을 사용할 때 중요한 점은 다음과 같습니다:

  1. 초기 구간을 설정해야 합니다. 이 구간에서 함수값이 부호가 달라야 합니다. (즉, 함수의 값이 한 구간에서 양수에서 음수로 변하거나 그 반대여야 합니다)
  2. 구간의 중간 값을 계산하여 해당 함수의 값을 구합니다.
  3. 함수값이 0에 가까워지면 그 값을 해로 사용하거나, 구간을 절반으로 나누어 반복합니다.
public class BisectionMethod {
    // 함수 f(x) = x^2 - 4 (근을 구하고자 하는 함수)
    public static double func(double x) {
        return x * x - 4;
    }

    // 이분법을 이용한 근 구하기
    public static double bisection(double a, double b, double tol) {
        // 구간 [a, b]에서 함수값의 부호가 달라야 한다.
        if (func(a) * func(b) >= 0) {
            System.out.println("구간 [a, b]에서 함수값의 부호가 달라야 합니다.");
            return Double.NaN;
        }

        double c = a;
        while ((b - a) / 2 > tol) {
            // 구간의 중간 값 계산
            c = (a + b) / 2;

            // 함수값 계산
            if (func(c) == 0.0) {
                break; // 정확히 0인 근을 찾으면 종료
            }

            // 함수값이 0에 가까워지면 종료
            if (func(c) * func(a) < 0) {
                b = c; // 근이 왼쪽 구간에 있을 때
            } else {
                a = c; // 근이 오른쪽 구간에 있을 때
            }
        }
        return c; // 근 반환
    }

    public static void main(String[] args) {
        double a = 0; // 구간 시작
        double b = 3; // 구간 끝
        double tolerance = 0.0001; // 허용 오차

        double root = bisection(a, b, tolerance);
        if (!Double.isNaN(root)) {
            System.out.println("구간 [" + a + ", " + b + "]에서 찾은 근은: " + root);
        }
    }
}

 

 

 


https://blog.naver.com/mykepzzang/220073289630?photoView=0