問題1.29 – SICP(計算機プログラムの構造と解釈)その12

問題1.27

パス

問題1.28

パス

問題1.29

うーん、Simpsonの公式を使った方が精度が落ちているような気がする…

(define (cube x) (* x x x))

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

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

(define (integral f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

(integral cube 0 1 0.01)
(integral cube 0 1 0.001)

(define (integral-with-simpson f a b n)
  (define h
    (/ (- b a) n))
  (define (y k)
    (f (+ a (* k h))))
  (define (term i)
    (if (even? i)
        (* 2 (y i))
        (* 4 (y i))))
  (* (/ h 3.0)
     (+ (y 0)
        (sum term a inc n)
        (y n))))

(integral-with-simpson cube 0 1 100)
(integral-with-simpson cube 0 1 1000)

gosh> cube
gosh> inc
gosh> sum
gosh> integral
gosh> 0.24998750000000042
gosh> 0.249999875000001
gosh> integral-with-simpson
gosh> 0.2566666666666667
gosh> 0.25066666666666665
gosh> 

追記:問題1.29の訂正

問題1.29でSimpsonの公式を使った方が精度が落ちていたが、余分な計算をしていたことが判明したので修正をする。
強調部分の最初と最後の範囲指定部分で余分な計算が含まれていた。

(define (integral-with-simpson2 f a b n)
  (define h (/ (- b a) n))
  (define (y k) (f (+ a (* k h))))
  (define (next i) (+ i 1))
  (define (term i)
    (* (if (even? i) 2 4)
       (y i)))
  (* (/ h 3.0)
     (+ (y 0)
        (y n)
        (sum term
             1
             next
             (- n 1)))))

(integral-with-simpson2 cube 0 1 100)
(integral-with-simpson2 cube 0 1 1000)

gosh> integral-with-simpson2
gosh> 0.25
gosh> 0.25
gosh> 
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»