- 积分
- 39142
- 明经币
- 个
- 注册时间
- 2010-7-10
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2019-7-8 23:06:12
|
显示全部楼层
本帖最后由 highflybird 于 2019-7-8 23:40 编辑
在此,我还是 贴出源代码,可以看出,高斯-切比雪夫法在求此类型积分上有很高的效率。
 - ;;;=============================================================
- ;;; 高斯-切比雪夫积分
- ;;; 此方法用于针对 sqrt(1-x^2)*f(x)型的积分有很高的效率。
- ;;; 输入: foo 函数名,arg 除自变量x外的参数列表, n迭代次数。
- ;;; 输出: 此类积分的数值.
- ;;; 说明: 此积分法效率较高,n取值一般10次左右就达到有效浮点精度.
- ;;; http://mathworld.wolfram.com/Chebyshev-GaussQuadrature.html
- ;;;=============================================================
- (defun Math:Gauss-Chebyshev (foo args n)
- (setq wi (/ pi n))
- (setq sx 0)
- (setq i 1)
- (repeat n
- (setq xi (cos (/ (* pi (- i 0.5)) n)))
- (setq fi (apply foo (cons xi args)))
- (setq sx (+ sx fi))
- (setq i (1+ i))
- )
- (* wi sx)
- )
- ;;;=============================================================
- ;;; 用高斯-切比雪夫积分法求椭球带面积
- ;;; 输入: a,b,c,椭球的x,y,z半轴长。h是其高(Z方向)与c的比值(-1<=h<=1)
- ;;; 输出: 所求椭球带的表面积.
- ;;;=============================================================
- (defun ELL:GetSurfaceArea3 (a b c h / func v)
- (defun Func (x a b c h / F G K R Y Z)
- (setq k (* a a))
- (setq g (- 1 (* (- 1 (/ k b b)) x x)))
- (setq f (1- (/ k c c g)))
- (setq y (1+ (* f h h)))
- (if (zerop f)
- (* (sqrt g) (1+ (sqrt y)))
- (if (< f 0)
- (setq z (* h (sqrt (- f)))
- r (* (sqrt g) (+ (sqrt y) (/ (asin z) z)))
- )
- (setq z (* h (sqrt f))
- r (* (sqrt g) (+ (sqrt y) (/ (asinh z) z)))
- )
- )
- )
- )
- (setq v (/ (+ a b c) 3.0)) ;设置与三个半轴长的平均值,防止误差增大
- (setq a (/ a v)) ;X 半轴长与平均值的比值
- (setq b (/ b v)) ;Y 半轴长与平均值的比值
- (setq c (/ c v)) ;Z 半轴长与平均值的比值
- (* b c h v v (Math:Gauss-Chebyshev 'func (list a b c h) 20)) ;在此例程中设置20可以满足精度
- )
|
|