僕の解答
こんな感じかな?
(define (cube x) (* x x x)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (indegral f a b dx) (define (add-dx x) (+ x dx)) (* (sum f (+ a (/ dx 2)) add-dx b) dx)) (define (inc n) (+ n 1)) (define (indegral* f a b n) (define h (/ (- b a) n)) (define (y k) (f (+ a (* k h)))) (define (term x) (if (even? x) (* 2 (y x)) (* 4 (y x)))) (* (/ h 3.0) (sum term (y 0) inc n))) (let ((n (indegral cube 0 1 0.01)) (m (indegral cube 0 1 0.001))) (display n) (newline) (display m) (newline)) (let ((n (indegral* cube 0 1 100)) (m (indegral* cube 0 1 1000))) (display n) (newline) (display m) (newline))
0.24998750000000042
0.249999875000001
0.25333333333333335
0.25033333333333335
indegralのほうがより近いような気もする。
所感
あれ?なんか間違えてる…って、最後のy_kは×1か。
最後は偶数になるはずだから、y(n)をマイナスしてみる。
(define (indegral* f a b n) (define h (/ (- b a) n)) (define (y k) (f (+ a (* k h)))) (define (term x) (if (even? x) (* 2 (y x)) (* 4 (y x)))) (* (/ h 3.0) (- (sum term (y 0) inc n) (y n))))
gaucheでもchez schemeでも、0.25ぴったりに…なんでだろう?
0.24998750000000042
0.249999875000001
0.25
0.25
Simpsonの公式を使ったほうが精度が高いってことで、よいのかな。