問題1.29 – SICP(計算機プログラムの構造と解釈)その12
2008年11月18日
問題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>
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542