파이썬 점화식, sqrt(2) 의 연분수 표현 구하기
조회수 529회
동그라미 친 a0,a1,a2...,a50 까지 구하는 코드를 짜고 싶어요.
i=0
for i in range(51):
j=i+1
xj=1/(xi-ai)
aj=int(xi)
print (aj)
대충 이런식으로 하면 될 것 같았는데 어림도 없네요. 고수분들 좀 도와주세요.
1 답변
-
- sqrt(2) 의 float 근사값으로 구해보기.
>>> b = [ 2**.5 ] >>> a = [] >>> a [] >>> b [1.4142135623730951] >>> for n in range(51): aa = int(b[n]) a.append(aa) bb = 1/(b[n] - aa) b.append(bb) >>> a [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1809, 1, 2, 5, 2, 2, 1, 2, 1, 3, 3, 4, 1, 1, 3, 12, 2, 2, 10, 32]
질문에서의 베타n 을 b 라는 이름의 리스트에 담아서, b[0], b[1], b[2] 등등이 베타0, 베타1, 베타2 등이 되도록 하고, 마찬가지로 알파n 을 a 라는 이름의 리스트에 담아서, a[0], a[1], a[2] 등이 알파0, 알파1, 알파2 값을 나타내도록 합니다.
- 초기에는 b에 첫원소인 루트(2) 만 넣어놓고, b 는 빈 리스트로 만들어 놓습니다.
- for 루프 안에서 b[0] 에 대응되는 a[0] 를
int(b[0])
로 구해서 a 의 첫 원소로 넣어, a[0] 를 만듭니다. - a[0] 가 구해지면, b[1] 을 주어진
1/(b[0] - a[0])
식으로 구해서 b[1] 값을 구해서 b[1] 을 넣습니다. - n 값을 0, 1, 2 로 증가시키면서 계속 연산하여, a, b 리스트를 채웁니다.
이렇게 해서 구해지는 a 리스트의 값은 위의 결과와 같습니다.
하지만 이 결과는 우리가 잘 알고 있는 sqrt(2) 의 연분수 ([1:2,2,2,2...])와 다릅니다. 정확한 sqrt(2) 가 아닌 1.414... 인 근사값을 이용했기 때문에 뒤로 가서 2가 아닌 다른 값이 나옵니다.
주어진 수식에서 b0 != b1 이지만 b1 == b2 인 것을 볼 수 있습니다. b2에서 b3 를 구하는 식은 b1에서 b2 를 구하는 식과 동일하기 때문에, b1 == b2 == b3 == b4 == ... 인 사실을 알 수 있습니다. 그래서 sqrt(2) 의 연분수는 복잡한 수식없이 구할 수 있습니다.
꼭 수식과 연산을 통해 정확한 연분수의 값을 구하는 방법을 원한다면은... 좀 더 고민이 필요하겠네요.
댓글 입력