Exercise 1.36

文責:@naoiwata

解答

\(x \mapsto \frac{log 1000}{log x}\) の不動点を探索する.

予測値を印字するよう書き換える

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

実行結果

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

(define (close-enough? x y)
  (< (abs (- x y)) 0.001))

(define tolerance 0.00001)

(define (average a b)
  (/ (+ a b) 2))

;; 平均緩和法を未使用
(fixed-point
  (lambda (x) (/ (log 1000) (log x)))
  1.5)
;; 1.5
;; 17.036620761802716
;; 2.436284152826871
;; 7.7573914048784065
;; 3.3718636013068974
;; 5.683217478018266
;; 3.97564638093712
;; 5.004940305230897
;; 4.2893976408423535
;; 4.743860707684508
;; 4.437003894526853
;; 4.6361416205906485
;; 4.503444951269147
;; 4.590350549476868
;; 4.532777517802648
;; 4.570631779772813
;; 4.545618222336422
;; 4.562092653795064
;; 4.551218723744055
;; 4.558385805707352
;; 4.553657479516671
;; 4.55677495241968
;; 4.554718702465183
;; 4.556074615314888
;; 4.555180352768613
;; 4.555770074687025
;; 4.555381152108018
;; 4.555637634081652
;; 4.555468486740348
;; 4.555580035270157
;; 4.555506470667713
;; 4.555554984963888
;; 4.5555229906097905
;; 4.555544090254035
;; 4.555530175417048
;; 4.555539351985717

;; 平均緩和法を使用
(fixed-point
  (lambda (x) (average x (/ (log 1000) (log x))))
  1.5)
;; 1.5
;; 9.268310380901358
;; 6.185343522487719
;; 4.988133688461795
;; 4.643254620420954
;; 4.571101497091747
;; 4.5582061760763715
;; 4.555990975858476
;; 4.555613236666653
;; 4.555548906156018
;; 4.555537952796512
;; 4.555536087870658

平均緩和法を使うことでステップ数を 35 回から 11 回に減らすことが出来た.

念のため確認

;; 平均緩和法を未使用
(/ (log 1000)
   (log
     (fixed-point
       (lambda (x) (/ (log 1000) (log x)))
       1.5)))
;; => 4.555533300207017

;; 平均緩和法を未使用
(/ (log 1000)
   (log
     (fixed-point
       (lambda (x) (average x (/ (log 1000) (log x))))
       1.5)))
;; => 4.555533300207017

Table Of Contents

Previous topic

Exercise 1.35

Next topic

Exercise 1.37