本帖最后由 vormittag 于 2011-11-15 10:37 编辑
在论坛上看到highflybird大师写过用 lisp 求积分的代码,主要使用了Romberg 积分、Simpson 积分、自适应积分和变步长积分
原贴地址如下:
[原创]用LISP求积分
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=82704&fromuid=398403
近日自己学习了一下 Chebyshev 积分和 Legendre-Gauss 积分,先写了一个 Chebyshev 积分法,代码如下:
感觉效率并不是很高,希望大师多加指点。
 - (defun f(x) (+ (* x x) (sin x)))
- (defun chebyshev (func a b eps / aa bb v m ep)
- (setq c '(-0.8324975 -0.3745414 0.0 0.3745414 0.8324975)
- m 1
- ep (1+ eps)
- p 1e35
- h (- b a)
- );setq
- (while (> ep eps)
- (setq g 0
- aa (- a h)
- );setq
- (repeat m
- (setq aa (+ aa h)
- bb (+ aa h)
- g (+ (apply '+ (mapcar '(lambda(x) (func (+ (* (- bb aa) 0.5 x) (* (+ bb aa) 0.5)))) c)) g)
- );setq
- );repeat
- (setq g (* g h 0.2)
- ep (/ (abs (- g p)) (1+ (abs g)))
- p g
- m (1+ m)
- h (/ (- b a) m)
- );setq
- )
- g
- )
|