추측값을 되풀이해 다듬으면 근삿값이 된다.
제곱근 프로세스는 추측값과 목표를 추측값으로 나눈 몫의 평균을 되풀이해 구한 값의 제곱을 목표에 가까이 가져갑니다.
생각해 볼 질문
한 번의 개선 규칙이 어떻게 점점 더 정확한 수치 프로세스를 만들까요?
- 추측값을 반복 한 단계의 완전한 상태로 읽기
- 뉴턴 방식으로 제곱근 추측값 개선하기
- 근삿값과 그 값을 제곱한 결과 비교하기
- 고정된 한 번의 관찰과 수렴 주장 구분하기
guess가 너무 크면 x를 guess로 나눈 값은 너무 작고 반대도 마찬가지입니다. 두 값의 평균은 그 사이에 놓인 다음 추측값이 됩니다. 프로세스는 새 추측값 하나만 다음 호출로 가져갑니다.
이 프로그램들은 숨은 오차 한도 대신 개선 횟수를 고정합니다. 1.0에서 여섯 번 개선하면 √2에 대한 결정적인 관찰을 얻으며 명시적인 이력에서는 추측값 사이의 차이가 빠르게 줄어드는 모습을 볼 수 있습니다.
(begin
(define (average left right) (/ (+ left right) 2.0))
(define (improve guess x) (average guess (/ x guess)))
(define (refine guess x remaining)
(if (= remaining 0)
guess
(refine (improve guess x) x (- remaining 1))))
(let ((estimate (refine 1.0 2.0 6)))
(list estimate (* estimate estimate))))리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 331 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
보이는 실행 흐름0 / 0 개의 실행 이벤트
첫 프로그램은 (1.414213562373095 1.9999999999999996)를 반환합니다. 두 번째 프로그램은 1.0부터 1.4142135623746899까지 추측값 다섯 개를 기록합니다.
각 refine 호출을 따라가며 몫과 평균과 남은 횟수가 바뀌는 곳을 찾으세요. 고정된 횟수는 이번 실행만 설명하며 모든 시작값이나 목표에서의 수렴을 주장하지 않고 리스펙스 바우치나 권한을 만들지 않습니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
목표를 9.0으로 바꾸고 1.0에서 여섯 번 개선하세요. 실행하기 전에 근삿값과 그 제곱을 예상해 보세요.
힌트 하나 보기
guess와 x를 guess로 나눈 값의 평균을 그대로 사용하세요. 목표만 바뀝니다.