(defn trapezium-rule [f a b]
(* 1/2 (- b a) (+ (f a) (f b))))
(defn simpson-rule [f a b]
(let [midpoint (+ a (/ (- b a) 2))]
(* 1/6 (- b a) (+ (f a) (* 4 (f midpoint)) (f b)))))
(defn simpson38-rule [f a b]
(let [midpoint1 (/ (+ a a b) 3)
midpoint2 (/ (+ a b b) 3)]
(* 1/8 (- b a) (+ (f a) (* 3 (f midpoint1)) (* 3 (f midpoint2)) (f b)))))
(defn booles-rule [f a b]
(let [midpoint1 (/ (+ a a a b) 4)
midpoint2 (/ (+ a a b b) 4)
midpoint3 (/ (+ a b b b) 4)]
(* 1/90 (- b a) (+ (* 7 (f a)) (* 32 (f midpoint1)) (* 12 (f midpoint2)) (* 32 (f midpoint3)) (* 7 (f b))))))
(defn iterated-rule [rule f a b N]
(if (= N 0)
(rule f a b)
(let [midpoint (+ a (/ (- b a) 2))]
(+ (iterated-rule rule f a midpoint (dec N))
(iterated-rule rule f midpoint b (dec N))))))
(defn square [x] (* x x))
(defn sine [x] (Math/sin x))
(defn step [x] (if (< x 1/2) 0.0 1.0))
(defn inverse [x] (/ x))
(defn adaptive-rule-recurse [rule f a b desired-error]
(let [guess (rule f a b)
midpoint (/ (+ a b) 2)
better-guess (+ (rule f a midpoint) (rule f midpoint b))
error-estimate (- guess better-guess)
abs-error-estimate (if (> error-estimate 0) error-estimate (- error-estimate))]
(if (< abs-error-estimate desired-error) better-guess
(let [half-desired-error (/ desired-error 2)]
(+ (adaptive-rule-recurse rule f a midpoint half-desired-error)
(adaptive-rule-recurse rule f midpoint b half-desired-error))))))
(adaptive-rule-recurse trapezium-rule square 0. 2 0.1) (adaptive-rule-recurse trapezium-rule square 0. 2 0.01) (adaptive-rule-recurse trapezium-rule square 0. 2 0.001)
(adaptive-rule-recurse trapezium-rule step 0.0001 1 0.1) (adaptive-rule-recurse trapezium-rule step 0.0001 1 0.01) (adaptive-rule-recurse trapezium-rule step 0.0001 1 0.001) (adaptive-rule-recurse trapezium-rule step 0.0001 1 0.0001)
(adaptive-rule-recurse trapezium-rule inverse 0.0001 1 0.1) (adaptive-rule-recurse trapezium-rule inverse 0.0001 1 0.01) (adaptive-rule-recurse trapezium-rule inverse 0.0001 1 0.001) (adaptive-rule-recurse trapezium-rule inverse 0.0001 1 0.0001)
(adaptive-rule-recurse booles-rule inverse 0.0001 1 0.1) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.01) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.0001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.00001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.0000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.00000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.000000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.0000000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.00000000001) (adaptive-rule-recurse booles-rule inverse 0.0001 1 0.000000000001)
(adaptive-rule-recurse booles-rule inverse 0.0001 1 0.0000000000001)
(defn integrate [f a b]
(adaptive-rule-recurse booles-rule f a b 0.00000001))
(- (Math/log 1000000) (Math/log 1))
(time
(integrate (fn[x] (/ 1.0 x)) 1 1000000))
(- (Math/log 100000000) (Math/log 1)) (time
(integrate (fn[x] (/ 1.0 x)) 1 100000000))
No comments:
Post a Comment