;; exercises 1.46

(define (iterative-improve f enough? first-guess)
  (define (iter guess)
    (if (enough? guess)
        guess
        (iter (f guess))))
  (iter first-guess))

(define (sqrt-iter-imp x)
  (iterative-improve (lambda (guess) (average guess (/ x guess)))
                     (lambda (guess) (< (abs (- (square guess) x)) 0.001))
                     1.0))
(define (fixed-point-iter-imp f first-guess)
  (iterative-improve f
                     (lambda (guess) (< (abs (- guess (f guess))) 0.001))
                     first-guess))

이건 내꺼

;; ex 1.46 - iterative-improve
(define (iterative-improve good? improve)
  (lambda (guess)
    (define (iter v)
      (if (good? v)
          v
          (iter (improve v))))
    (iter guess)))

;; sqrt
(define (sqrt-ii x)
  (define (good? guess)
    (< (abs (- (square guess) x)) 0.001))
  (define (improve guess)
    (/ (+ guess (/ x guess)) 2))
  ((iterative-improve good? improve) 1.0))

(sqrt-ii 9)

;; fixed-point
(define (fixed-point-ii f g)
  (define (good? guess)
    (< (abs (- guess (f guess)) 0.00001)))
  ((iterative-improve good? f) g))

(fixed-point cos 1.0)
AND

HTML 편집 모드에서 아래와 같이 <pre class="brush:scheme"></pre> 사이에 Scheme 코드를 입력하면 예쁘게 출력된다.

입력

<pre class="brush:scheme">
;; ex 1.12 pascal's triangle
;; p(r, c) = p(r-1, c-1) + p(r-1, c)
;; p(r, 1) = 1, p(r, r) = 1
(define (pt r c)
  (cond ((or (= c 1) (= r c)) 1)
        ((or (< c 0) (< r 0) (> c r)) 0)
        (else (+ (pt (- r 1) (- c 1))
                 (pt (- r 1) c)))))
</pre>

출력

;; ex 1.12 pascal's triangle
;; p(r, c) = p(r-1, c-1) + p(r-1, c)
;; p(r, 1) = 1, p(r, r) = 1
(define (pt r c)
  (cond ((or (= c 1) (= r c)) 1)
        ((or (< c 0) (< r 0) (> c r)) 0)
        (else (+ (pt (- r 1) (- c 1))
                 (pt (- r 1) c)))))

* > 또는 < 를 제대로 rendering 못하는 버그 있음. 위 pascal's triangle 코드의 6번째 줄에서 < 가 <; 로 출력되고 있음.

AND

(define (inc x) (+ x 1))

(define (double f)
  (lambda (x) (f (f x))))

;; 맞바꿈 계산법으로 확인하기
(((double (double double)) inc) 5)

(((double (lambda (x) (double (double x)))) inc) 5)

(((lambda (y) ((lambda (x) (double (double x))) ((lambda (z) (double (double z))) y))) inc) 5)

(((lambda (x) (double (double x))) ((lambda (z) (double (double z))) inc)) 5)

(((lambda (x) (double (double x))) (double (double inc))) 5)

((double (double (double (double inc)))) 5)

((double (double (double (lambda (x) (inc (inc x)))))) 5)

((double (double (lambda (a)
                   ((lambda (x) (inc (inc x)))
                    ((lambda (x) (inc (inc x))) a))))) 5)

((double (lambda (b)
           ((lambda (a)
              ((lambda (x) (inc (inc x)))
               ((lambda (x) (inc (inc x))) a)))
            ((lambda (a)
               ((lambda (x) (inc (inc x)))
                ((lambda (x) (inc (inc x))) a))) b)))) 5)
((lambda (c)
   ((lambda (b)
      ((lambda (a)
         ((lambda (x) (inc (inc x)))
          ((lambda (x) (inc (inc x))) a)))
       ((lambda (a)
          ((lambda (x) (inc (inc x)))
           ((lambda (x) (inc (inc x))) a))) b)))
    ((lambda (b)
      ((lambda (a)
         ((lambda (x) (inc (inc x)))
          ((lambda (x) (inc (inc x))) a)))
       ((lambda (a)
          ((lambda (x) (inc (inc x)))
           ((lambda (x) (inc (inc x))) a))) b))) c))) 5)

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (b)
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a)))
     ((lambda (a)
        ((lambda (x) (inc (inc x)))
         ((lambda (x) (inc (inc x))) a))) b))) 5))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (a)
    ((lambda (x) (inc (inc x)))
     ((lambda (x) (inc (inc x))) a)))
  ((lambda (a)
     ((lambda (x) (inc (inc x)))
      ((lambda (x) (inc (inc x))) a))) 5)))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (a)
    ((lambda (x) (inc (inc x)))
     ((lambda (x) (inc (inc x))) a)))
  ((lambda (x) (inc (inc x)))
   ((lambda (x) (inc (inc x))) 5))))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (a)
    ((lambda (x) (inc (inc x)))
     ((lambda (x) (inc (inc x))) a)))
  ((lambda (x) (inc (inc x)))
   (inc (inc 5)))))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (a)
     ((lambda (x) (inc (inc x)))
      ((lambda (x) (inc (inc x))) a)))
   (inc (inc (inc (inc 5))))))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (x) (inc (inc x)))
      ((lambda (x) (inc (inc x))) (inc (inc (inc (inc 5)))))))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 ((lambda (x) (inc (inc x)))
      (inc (inc (inc (inc (inc (inc 5))))))))

((lambda (b)
   ((lambda (a)
      ((lambda (x) (inc (inc x)))
       ((lambda (x) (inc (inc x))) a)))
    ((lambda (a)
       ((lambda (x) (inc (inc x)))
        ((lambda (x) (inc (inc x))) a))) b)))
 (inc (inc (inc (inc (inc (inc (inc (inc 5)))))))))

((lambda (a)
   ((lambda (x) (inc (inc x)))
    ((lambda (x) (inc (inc x))) a)))
 ((lambda (a)
    ((lambda (x) (inc (inc x)))
     ((lambda (x) (inc (inc x))) a))) (inc (inc (inc (inc (inc (inc (inc (inc 5))))))))))

((lambda (a)
   ((lambda (x) (inc (inc x)))
    ((lambda (x) (inc (inc x))) a)))
 ((lambda (x) (inc (inc x)))
   ((lambda (x) (inc (inc x))) (inc (inc (inc (inc (inc (inc (inc (inc 5))))))))))) 

((lambda (a)
   ((lambda (x) (inc (inc x)))
    ((lambda (x) (inc (inc x))) a)))
 ((lambda (x) (inc (inc x)))
   (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc 5)))))))))))) 

((lambda (a)
   ((lambda (x) (inc (inc x)))
    ((lambda (x) (inc (inc x))) a)))
 (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc 5)))))))))))))

((lambda (x) (inc (inc x)))
 ((lambda (x) (inc (inc x))) (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc 5))))))))))))))

(inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc 5))))))))))))))))

결론: double에 double을 적용하면 제곱으로 늘어남. (((double (double (double double))) inc) 0) ;; => 256

AND

ex 1.42
(define (compose f g)
  (lambda (x) (f (g x))))

((compose square inc) 6) ;; => 49
ex 1.43
(define (repeated f i)
  (define (iter g n)
    (if (= n 1)
      g
      (iter (compose g f) (- n 1))))
  (iter f i))
((repeated inc 10) 0) ;; => 10
((repeated square 2) 5) ;; => (square (square 5)) => 625
ex 1.44
(define (smooth f)
  (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))

(define (smooth-n f n)
  ((repeated smooth n) f))
ex 1.45
(define (cube-root x)
  (fixed-point (average-damp (lambda (y) (/ x (square y)))) 1.0))
;; (cube-root 27)

(define (4th-root x)
  (fixed-point (average-damp (lambda (y) (/ x (* y y y)))) 1.0))
;; (4th-root 16) => infinite loop

;; y -> x/y^(n-1) 은 몇번 average-damp 해야 하는지 실험하기
(define (nth-root x n)
  (fixed-point ((repeated average-damp n) (lambda (y) (/ x (expt y (- n 1)))))
               1.0))

;; 실험 결과.. 패턴이 안보인다
;; n = 4 > 2
;; n = 5 > 2
;; n = 13 > 3
;; n = 22 > 2
AND

10일차 - 1.3.4

Announce/Chapter.1 2010. 12. 23. 19:07
(작성중)

AND

웹서비스 중에서 계산식을 잘 풀어주는 곳이 있더군요.




이렇게 수학식 표현을 이미지로 내어주고,



x에 관한 식을 입력하면 고정점으로 찾아줍니다!!


결과는 이렇게 나왔습니다. (바로바로 황금비!! )
AND

1.35
(define golden-ratio 
    (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0))

golden-ratio
;; 1.6180327868852458
;; 1.36

(define tolerance 0.00001)
 
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)    
    (let ((next (f guess)))
      (display guess)
      (newline)
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

(fixed-point (lambda (x) (/ (log 1000) (log x))) 4)
;; 4
;; 4.9828921423310435
;; 4.301189432497896
;; 4.734933901055578
;; 4.442378437719527
;; 4.632377941509957
;; 4.505830646780214
;; 4.588735606875765
;; 4.533824356566502
;; 4.569933524181419
;; 4.546075272637248
;; 4.561789745175653
;; 4.551417836654131
;; 4.558254212070262
;; 4.553744140202578
;; 4.556717747893265
;; 4.554756404545319
;; 4.5560497413912975
;; 4.5551967522618035
;; 4.555759257615811
;; 4.555388284933278
;; 4.555632929754932
;; 4.555471588998784
;; 4.555577989320218
;; 4.555507819903776
;; 4.555554095154945
;; 4.555523577416557
;; 4.555543703263474
;; 4.555530430629037
;; 4.555539183677709

(fixed-point (lambda (x) (average x (/ (log 1000) (log x)))) 4)
;; 4
;; 4.491446071165521
;; 4.5449746509755515
;; 4.553746974742814
;; 4.555231425802502
;; 4.555483906560562
;; 4.5555268862194875
;; 4.5555342036887705
;; 1.37
AND

참고자료

Reference 2010. 12. 20. 22:34

References

Scheme 구현체

기타

AND

함수 F가 있을때 F(x) = x가 되는 x를 고정점이라 한다. 아래 그림은 3개의 고정점이 존재한다.

고정점 그래프

함수 F에 대해 임의의 x에서 시작하여 식으로 반복될때 x가 고정점으로 수렴하면 이 고정점을 attractive fixed point라고 한다. attractive fixed point가 아니면 초기값을 잘 설정해야 한다.

함수 F(x)의 근을 찾는 문제는 F(x)=0 을 x=g(x) 식으로 변경할 후 g(x)의 고정점을 찾는 문제로 바꿀 수 있다. 고정점을 찾는 방법은 초기값 x0가 주어지면 x1=g(x0), x2=g(x1), x3=g(x2),... 로 반복해서 계산되고, 계산 중 xn과 x(n-1)의 차이가 tolerance 이하가 될 때까지 반복하면 된다.

어떤 문제를 고정점을 찾는 문제로 바꾼다는 것은 mathematical analysis의 문제를 numerical analysis의 문제로 바꾼다는 것을 뜻하며, 이는 결국 알고리즘을 통한 근사치를 계산하는 문제로 바꾸는 것을 의미하게 된다. 쉽게 얘기해서 컴퓨터 프로그래밍으로 풀 수 있는 문제가 된다는 뜻이다. 이와 유사한 개념이 Taylor series로 이는 f(x)를 멱급수(power series)로 표현하여 근사치를 계산하는 방법이다.

어떤 수 a에 대한 square-root을 값을 찾는 문제를 보면, x=sqrt(a) 이면 이는 x^2=a 와 동일하고 이는 x=a/x 가 되므로 a/x의 고정점을 찾는 문제로 풀 수 있다. a의 값에 따라 써 보면, a=2 이면 sqrt(2)을 푸는 문제로 이는 y=2/x의 고정점이 되고 , a=3 이면 y=3/x의 고정점을 찾는 문제가 된다.

AND

9,10.11일차

Announce/Chapter.1 2010. 12. 16. 20:28
예정 범위 : 1.3.3 ~ 1.3.4

12월 21일 (화)
- 리뷰 : 이준
- 발표 : 정다정(p88 ~ )

12월 23일 (목)
- 리뷰 : 정승희
- 발표 : 전현철

12월 28일 (화)
- 리뷰 : 정다정
- 특강 : 정다정
AND