問題1.29

僕の解答

こんな感じかな?

(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))))


0.24998750000000042
0.249999875000001
0.25
0.25
gaucheでもchez schemeでも、0.25ぴったりに…なんでだろう?
Simpsonの公式を使ったほうが精度が高いってことで、よいのかな。