Learning/SICP/exercise_1_29.janet
2025-05-29 22:00:25 +02:00

45 lines
1000 B
Plaintext

(defn cube [n]
(+ (* 5 n n n) (math/sin (* 2.5 n))))
(defn sum [term next a b]
(if (> a b)
0
(+ (term a)
(sum term next (next a) b))))
(defn integral-old [f a b dx]
(defn add-dx [x]
(+ x dx))
(* (sum f add-dx (+ a (/ dx 2.0)) b) dx))
(defn integral [f a b n]
(def h (/ (- b a) n))
(defn incre [n]
(+ n 1))
(defn apply [k]
(def multiplier
(cond
(or (= k 0) (= k n)) 1
(= (mod k 2) 0) 2
4))
(* multiplier (f (+ a (* k h)))))
(* (/ h 3) (sum apply incre 0 n)))
(defn integral-improved [f a b n]
(def h (/ (- b a) n))
(defn incre [k]
(+ k 2))
(defn apply [k]
(f (+ a (* k h))))
(* (/ h 3)
(+
(f a)
(* 4 (sum apply incre 1 (- n 1)))
(* 2 (sum apply incre 2 (- n 1)))
(f b))))
(printf "%.23f" (integral-improved cube 0 1 10))
(printf "%.23f" (integral-improved cube 0 1 100))
(printf "%.23f" (integral-improved cube 0 1 1000))
(printf "%.23f" (integral-improved cube 0 1 10000))