다음은 내 코드 SICP exercise 1.29입니다. 이 운동은 심슨의 규칙을 고차 절차 인 sum
을 사용하여 구현하도록 요청합니다. 원래 integral
절차보다 정확하게 인 것으로되어 있습니다.심슨 규칙의 구현 (SICP 연습 1.29)
(define (simpson-integral f a b n)
(define h (/ (- b a) n))
(define (next x) (+ x (* 2 h)))
(* (/ h 3) (+ (f a)
(* 4 (sum f (+ a h) next (- b h)))
(* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))
(f b))))
내 코드의 일부 설명 :
h/3 * (y_{0} + 4*y_{1} + 2*y_{2} + 4*y_{3} + 2*y_{4} + ... + 2*y_{n-2} + 4*y_{n-1} + y_{n})
이
h/3 * (y_{0}
+ 4 * (y_{1} + y_{3} + ... + y_{n-1})
+ 2 * (y_{2} + y_{4} + ... + y_{n-2})
+ y_{n})
을 동등하게 난 그냥에 sum
를 사용하는 것이 내 코드의 경우하지 왜 그러나 모르겠어요 y_{1} + y_{3} + ... + y_{n-1}
및 y_{2} + y_{4} + ... + y_{n-2}
을 계산하십시오. 여기
전체 코드 :
#lang racket
(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 (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2.0)) add-dx b)
dx))
(define (simpson-integral f a b n)
(define h (/ (- b a) n))
(define (next x) (+ x (* 2 h)))
(* (/ h 3) (+ (f a)
(* 4 (sum f (+ a h) next (- b h)))
(* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))
(f b))))
일부 테스트 (정확한 값은 0.25이어야한다) :이 계약 조건을 구성하는 방법의 문제, 당신이하고있는 방법은있다
> (integral cube 0 1 0.01)
0.24998750000000042
> (integral cube 0 1 0.001)
0.249999875000001
> (simpson-integral cube 0 1.0 100)
0.23078806666666699
> (simpson-integral cube 0 1.0 1000)
0.24800798800666748
> (simpson-integral cube 0 1.0 10000)
0.2499999999999509
Óscar. 하지만 내가 틀린 곳을 말해 줄 수 있니? 나는 나 자신을 이해할 수 없었다. 그리고'(simpson-integral cube 0 1.0 10000)'의 테스트 케이스를 추가하여 코드가 0.25로 수렴하는 것처럼 보입니다. 원래 것만 큼 빨리. –
@Chenggang 당신은 두 가지 계열 ('sum'이 두 번 호출 됨)을 생성하고 있는데, 옳은 것은 4,2 개의 요소가 번갈아 가며 하나의 계열을 가질 때입니다. –
Chenggang이 방금 용어의 순서를 변경하고 있습니다. – soegaard