본문 바로가기

(비정기) Mr.K's Post/Weekly paper

R.A.M. #1. 무리수 √2의 값을 구해보자! : Stage 1

부제 : 미정

Location of Roots Theorem

Let I = [a, b] and let f : I → R be continuous on I. If f(a) < 0 < f(b), or if f(a) > 0 > f(b), then there exists a number c ∈ (a, b) such that f(c) = 0.
(위 내용은 INTRODUCTION TO REAL ANALYSIS 3/e에서 일부 발췌했음을 알려드립니다)


안녕하십니까 Mr. K입니다

지난 주까지 무사히(?) '재귀 vs. 반복'의 포스팅을 끝내고 새로운 주제를 가지고 돌아왔습니다

포스팅 계획서에 언급해두었던 '무한의 범주에 있는 것을 유한하게 구현'하는 것을 하려고 합니다

그 첫 대상은 '무리수'가 되겠습니다

무리수라는 놈이 가진 특성이..
'정수부.소수부'의 형태로 표현할 때 소수부의 길이가 끝나지 않는다는 것이 있죠 (ex. π(pi) = 3.1415926…)

이것을 유한하게 구현해본다는 것은 그 근사값을 구해보겠다는 말과 같습니다

앞으로 얼마나 더 많은 주제를 다룰 수 있을지는 모르겠으나,
이 RAM계열의 포스트는 같은 목표를 가지고 쓰여집니다

이런 무한의 범주에 있는 것들을 얻기 위해 수학 라이브러리 함수로 계산했을 때의 결과에 근접한 값을 얻어내는 것



잡설은 그만하고, 이제 처음 써놓은 정리(이하 LRT라 하겠습니다)를 보도록 하죠

어떤 함수 f가 구간 [a, b] 위에서 연속이고 f(a) < 0 < f(b) 또는 f(a) > 0 > f(b)를 만족하면 f(c) = 0인 어떤 수 c가 구간 (a, b)안에 존재한다

즉, 간단히 말하면
구간 위에서 연속인 함수에 대해 양 끝 함수값의 부호가 반대라면, 구간 어딘가에 함수값이 0이 되는 점이 최소 하나는 있다는겁니다

그림으로 보시죠


사용자 삽입 이미지


이것을 보시면
함수 f는 구간 [0, 2]에서 연속이고, f(0) < 0 < f(2)를 만족하므로 f(c) = 0인 c가 구간 (0, 2) 안에 존재합니다

딱히 부정하려해도 x가 0.75 근처에 있을 때 y가 0 근처에 있다는게 눈에 보이실겁니다

그런데 눈으로 봤을 때,
x가 0.75 근처에 있다는건 알겠는데 정확한 값이 뭔지는 모르겠다는게 문제인겁니다

여기서 쓸 수 있는 방법이 바로 Bisection Method인데, 오늘 포스트의 가장 중요한 물건이라 할 수 있겠습니다

그것이 무엇인고 하니,

LRT를 만족하는 구간에 대해 계속해서 LRT를 만족하도록 구간을 반으로 줄여나가는 method입니다

위 그림에 대해 적용해보면

[0, 2]에서 LRT를 만족하고 있습니다

⇒ f(1)이 양수이므로 f(0)과 묶어서 보면 LRT를 만족합니다

⇒ 구간을 [0, 1]로 줄입니다, 여전히 LRT를 만족하고 있습니다

⇒ f(0.5)가 음수이므로 f(1)과 묶어서 보면 LRT를 만족합니다

⇒ 구간을 [0.5, 1]로 줄입니다, 여전히 LRT를 만족하고 있습니다

⇒ …

이 과정을 반복하면 우리는 정리에 언급되어있는 c를 반드시 찾을 수 있습니다



무리수 √2를 구하는 데 이게 왜 필요한가 싶을만큼 상관없어보이는 내용을 얘기했습니다만,

√2를 구하는 방법은 다음과 같습니다

1: x = √2 라 놓는다

2: 양변을 제곱하면 x² = 2를 얻는다

3: 우변을 이항하면 x² - 2 = 0을 얻는다

4: 함수 f를 f(x) = x² - 2로 잡고 f(c) = 0이 되는 c를 찾는다

감이 오십니까?

저렇게 만든 함수 f에 대해 적당한 구간을 잡고 Bisection Method를 써주기만 하면 우리는 원하는 √2의 근사값을 얻을 수 있습니다

아래의 그림을 참고하세요 (점점 줄어드는 구간을 보실 수 있습니다)


사용자 삽입 이미지


코드로 구현한 것은 다음과 같습니다



이 코드의 경우 임의의 실수에 대해 제곱근을 구할 수 있도록 해놓았습니다
그냥 2를 입력하면 √2의 근사값이 나오겠죠

함수들에 대해 설명을 하면
f는 위에서 언급한 함수 f와 같다고 보시면 되고,
absolute는 절대값을 구하는 함수,
sign은 input의 부호에 따라 다른 값을 리턴하는 함수이고,
마지막의 squareRoot는 제곱근을 구하는 함수입니다

전역변수 둘 중 하나인 realNumber는 제곱근을 구하고 싶은 수를 저장하기 위해 만든 것이고
나머지 하나인 tolerance는 '허용오차'를 나타냅니다

Bisection Method를 사용하면 '이론적으로'는 c값에 다가가지만
이 '다가간다'라는 말의 의미가 모호하기 때문에
실제 적용시에는 허용오차를 두어서 '그 허용오차보다도 오차가 작아지게 되면' 두 값이 같다고 보는겁니다

squareRoot함수의 body부분에 대한 설명은 패스하겠습니다


사용자 삽입 이미지


오늘의 포스트는 이것으로 마칩니다

다음번에는
다른 방법으로 √2를 구하는 방법을 가지고 돌아오겠습니다 (__)

(포스팅 소요시간 : 약 85분)