방정식의 해를 구할 때 보통은 손으로 직접 식을 변형하고 정리하여 해를 구하곤 한다.
예를 들어 다음과 같은 간단한 1차 함수의
1. 이 함수를
2.
3.
이와 같은 절차를 거쳐 해를 구할 수 있다.
참고로 여기서 2번은 양변에 어떤 실수를 더하거나 빼거나 곱하거나
등식은 여전히 성립한다는 정리를 이용한 것이다.
하지만 우리가 실생활에서 접하는 함수들은 위와 같이 같은 간단한 풀이법을 가지는 것만 존재하지는 않는다.
가령 함수
대수적으로
점점 더 실제 근에 가까운 근을 얻어내는 수치적인 방법은 존재한다.
이번 글에서는 수치적으로 해를 찾는 여러가지 방법 중 첫 번째로 Bisection method 를 소개할 것이다.
■ Bisection Method 개요
Bisection method는 연속함수에서 중간값 정리를 응용한 알고리즘이다.
어떤 연속 함수
만약 어떤 두 점
그러면
기본적인 것을 설명하기 위해 임의로 잡은
이제 구간을 반으로 나눠서 살펴보자.
두 구간
(
이는 가정이였던
이 과정을 원하는 정확도까지 근사될 때까지 반복하여 근의 근사치를 얻으면 된다.

정말 쉽게 요약하자면 다음과 같다.
1. 어떤 구간에 해가 하나 존재한다는 것이 확인 됨.
2. 그 구간을 반으로 나눠 왼쪽, 오른쪽 중 어디에 근이 존재하는지 살펴본다.
3. 근이 존재하는 쪽으로 시야를 좁혀서 2번으로 돌아가 반복한다.
Bisection method 알고리즘의 수도 코드(pseudo code)는 다음과 같다.
while (b-a) > tol do
m = a + (b-a)/2
if sign(f(a)) = sign(f(B))
a = m
else
b = m
end
end
참고로 pseudo code란 실제 프로그래밍 언어로 작성한 것은 아니지만
대충 사람이 읽기 편하면서도 간결하고 프로그래밍언어스럽게 적은 코드를 뜻한다.
위 코드에서 tol은 tolerence(참을 수 있는 정도)의 줄임말로, 원하는 정확도를 얘기한다.
예를들어 tol = 0.1 이라면, 해가 존재하는 구간이 0.1 보다 좁을 정도로 정확해질 때까지 반복하겠다는 뜻이다.
■ MATLAB 코드
함수 스크립트
function [answer] = bisection_method(func, a, b, tol)
% 원하는 정확도가 될 때까지 반복할 것임
while b-a > tol
% m으로 a와 b의 한가운데 값을 택함
m = a + (b-a)/2;
% f(a) 와 f(m) 의 부호가 같다면 f(a)f(m) 는 양수임
% 부호가 달라야 두 점 사이에 근이 존재함
if func(a) * func(m) > 0
a = m;
else
b = m;
end
end
% 충분히 좁혀진 범위 중 왼쪽 끝을 답으로 낼 것이다.
% 이 경우 오차는 최대 (b-a) 이다.
answer = a;
end
메인 스크립트
%% 초기 조건
% f가 x에 대한 함수이고 f = x^2 - 4sin(x) 라고 정의함
f = @(x) x.^2 - 4*sin(x);
% 원하는 정확도
tol = 0.0001;
% 시작할 구간
a = 1; b = 3;
answer = bisection_method(f, a, b, tol)
아래는 메인 스크립트의 실행 결과이다.

Wolfram Alpha로 계산한 실제 값은 약 1.93375 로 제대로 구해진 것을 확인할 수 있다.
참고로 tol 값을 더 작게 설정해도 matlab 실행창에서 보이는 값은 소수점으로 최대 4자리까지가 기본이라서
더 자세한 값으로 좁혀지는 것을 관찰할 수 없으므로 자세한 값이 나오는 것을 보려면 따로 설정해주어야 한다.
여담이지만 컴퓨터 관련 전공자라면 아마 눈치 챘겠지만,
Bisection method algorithm은 정렬된 정수에서 원하는 값을 찾는 이분탐색법의 실수에서의 확장 버전에 불과하다.
■ Bisection Method 의 수렴률(Convergence rate)
그러면
매 반복마다 관찰하는 구간이 반으로 줄어드므로
한편 수렴률은 어떤 수
양의 상수
따라서 수렴률은
참고로 수렴률이
아무튼 Bisection method 는 매 반복마다 오차 크기가 최대
'수학 > 수치해석' 카테고리의 다른 글
다항식 보간법 (Polynomial Interpolation) (0) | 2022.11.02 |
---|