本帖最后由 阿然 于 2014-4-26 10:55 编辑
学习lisp这么久以来,深感不是不能理解Lisp的各种函数使用方法,而是算法方面的知识缺失更加困扰我,痛定思痛,努力向各前辈学习各种算法,下面是刚学习的Gauss-legendre积分法,请各位指教,谢谢
- ;;;5阶Gauss-Legendre积分法
- ;;; a 下限
- ;;; b 上限
- ;;; eps 精度
- ;;; 其中函数fun为自定义被积函数计算式
- (defun gauss (a b eps / m i j s p ep h aa bb w x g tk c)
- (setq tk '(-0.9061798459 -0.5384693101 0.0 0.5384693101 0.9061798459)
- c '(0.2369268851 0.4786286705 0.5688888889 0.4786286705
- 0.2369268851)
- )
- (setq m 1
- h (- b a)
- s (abs (* 0.001 h))
- p 1.0e+35
- ep (+ eps 1.0)
- )
- (while (and (>= ep eps)
- (> (abs h) s)
- )
- (setq g 0.0
- i 1
- )
- (while (<= i m)
- (setq aa (+ a (* (- i 1) h))
- bb (+ a (* i h))
- w 0.0
- )
- (setq j 0)
- (repeat 5
- (setq x (/ (+ (* (- bb aa) (nth j tk)) bb aa) 2.0)
- w (+ w (* (fun x) (nth j c)))
- )
- (setq j (1+ j))
- )
- (setq g (+ g w)
- i (1+ i)
- )
- )
- (setq g (* g h 0.5)
- ep (/ (abs (- g p)) (+ 1.0 (abs g)))
- p g
- m (1+ m)
- h (/ (- b a) m)
- )
- )
- g
- )
- (defun fun (x)
- (setq y (+ (* x x) (sin x)))
- )
|