本帖最后由 cad890 于 2019-7-3 20:03 编辑
你这公式推论好像有错误,按理说F(t)应该不会小于0的,但是计算过程发现F(t)会存在小于0的情况;
如n=100时,xi≈cos(1/200 * pi)≈1,则B(t)≈a^2/b^2, F(t)≈b^2/c^2-1,如果b小于c,会计算出F(t)<0。由于存在F(t)开方,所以下方函数是无法计算下去的。请核实一下公式推论F(t)。
但如果a=b=c,hc=0时,可以计算。即半球面积
注:我中午列的公式是根据图片符号,区分大小写,lisp变量不区分大小写,所以你有很多变量重复了。
 - (defun c:tt()
- (setq a 2.0 b 3.0 c 4.0 hc 3.0);已知
- (setq hb (- c hc))
- (setq n 100)
- (setq i 1 h (/ hb c) s 0)
- (repeat n
- (setq wi (/ pi n)
- ai (* pi (/ (- (* 2.0 i) 1) (* 2.0 n)))
- xi (cos ai)
- ;;; B (…)
- ;;; F (…)
- )
- (setq Bt (- 1.0 (* (- 1.0 (/ (* a a) (* b b))) xi xi) ))
- (setq Ft (- (/ (* a a) (* c c) Bt) 1))
-
- (if (= Ft 0) (setq f (* 2 h (/ a c)))
- ;;;(为了避免程序又臭又长,可以增加中间计算)
- ;;;(setq f (1- (* (* (/ (* A A) (* C C))) (/ 1.0 B)) ))
- (progn
- (setq sqrtBt (sqrt Bt))
- (setq sqrtFh (sqrt (1+ (* Ft h h))))
- (setq hsqrtF (* h (sqrt Ft)))
- (setq sinh-1 (arcsinh hsqrtF))
- (setq f (* sqrtBt (+ sqrtFh (/ sinh-1 hsqrtF )))))
- );end_if
- (setq si (* b c h wi f))
- (setq s (+ s si))
- (setq i (1+ i))
- )
- s
- )
- (defun arcsinh(x);sinh-1
- (log (+ x (sqrt (1+ (* x x)))));ln(x + sqrt(x^2 + 1))
- )
|