一个博士朋友的儿子刚上初中不久,他就提出了下面的一个问题,我感觉很有深度,很难得,现在贴出来说说。
如下面图所示:已知线段AB和一点P,n等分线段,得到n+1个点与P连线。
问:n趋于无穷大时,这些连线长的平均值趋向一个定数吗? 如果是,该怎样求?
粗看起来好像没什么难度,然而稍微计算一下,就发现不那么简单,博士拿出了Maple这个数学软件,用求极限法得到了一个并不简单的结果:
后来,我觉得这个极限可以化为积分,得到了相同的结果:
其中的字母含义如下:
这个结果显然不是初中的知识了。
这个小孩很有天赋,他还把这个问题做引申发散开来。
首先,他问这样的平均距离除了对直线有外,对圆也有么?
我开始用积分算了一下,得到一个巨复杂的结果:
后来稍微优化了一下,
但可以看出,这已经不是可以用初等函数来表达的了,已经用了椭圆积分来表达了。然后,他又继续问了一个问题,在一个三角形内,是否存在这样的一个点,使得点到这三条线段的上述平均值相等?
在我看来,一般情况下存在这个点,原因如下:
因为一点(x,y)到线段的平均值的积分解是一个与x,y有关的二元函数
因此 另 p1p2的 值 设为f1(x,y), p2p3的值设置为f2(x,y),p3p1的值设置为f3(x,y)
显然有 f1(x,y)=f2(x,y); f2(x,y)=f3(x,y)
这是一个二元方程组,应该有一个解,但 估计无法用公式求解,只能数值求解了。
下面贴出一些LISP代码来验证求解。
(defun ALG:AverageLength (p p1 p2 / A A1 A2 A3 A4 H HH L RT V) (setq L (distance p1 p2)) (setq v (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))) (setq h (abs (car v))) (setq a (- (caddr v))) (if (> L 0) (progn (setq a (/ a L)) (setq h (/ h L)) (setq hh (* h h)) (setq a1 (+ (* a a) hh)) (setq a2 (+ a1 a a 1)) (setq a3 (sqrt a1)) (setq a4 (sqrt a2)) (if (equal hh 0 1e-8) (setq rt (+ (* a (- a4 a3)) a4)) (setq rt (+ (* a (- a4 a3)) (* hh (- (log (+ a 1 a4)) (log (+ a a3)))) a4 ) ) ) (setq rt (* 0.5 rt L)) ) (distance p p1) ) ) ;(1/2)*a*sqrt(a^2+h^2)-(1/2)*h^2*ln(-a+sqrt(a^2+h^2))+(1/2)*b*sqrt(b^2+h^2)+(1/2)*h^2*ln(b+sqrt(b^2+h^2)) ;;;采用积分法 (defun ALG:AverageLength2 (p p1 p2 / A AH B BH H HH L V rt) (setq L (distance p1 p2)) (setq v (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))) (setq h (abs (car v))) (setq a (caddr v)) (setq b (- L a)) (if (equal L 0 1e-8) (distance p p1) (if (equal h 0 1e-8) (/ (+ (* a a) (* b b)) 2 L) (setq a (/ a L) b (/ b L) h (/ h L) hh (* h h) ah (sqrt (+ (* a a) hh)) bh (sqrt (+ (* b b) hh)) rt (* hh (log (/ (+ b bh) (- ah a)))) rt (* 0.5 L (+ RT (* a ah) (* b bh))) ) ) ) ) ;;;收敛很慢 (defun ALG:AverageLength1 (p p1 p2 / A AV D H HH I L N S UN V X) (setq L (distance p1 p2)) (setq v (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))) (setq h (abs (car v))) (setq a (- (caddr v))) (if (> L 0) (progn (setq n 1000) (setq i 0) (setq s 0) (setq hh (* h h)) (setq un (/ L n)) (repeat (1+ n) (setq x (+ a (* i un))) (setq d (sqrt (+ (* x x) hh))) (setq s (+ s d)) (setq i (1+ i)) ) (setq av (/ s (1+ n))) ) (distance p p1) ) ) (defun ALG:AverageLengthOfCircle (p c r / A D I L N U X Y) (setq p (mapcar '- p c)) (setq i 0) (setq l 0) (setq n 36000) (setq u (/ pi n)) (repeat n (setq a (/ i u)) (setq x (* r (cos a))) (setq y (* r (sin a))) (setq d (distance p (list x y))) (setq l (+ d l)) (setq i (1+ i)) ) (/ l n) ) (defun c:xx () (initget 9) (setq p (getpoint "\n直线外一点:")) ;;; (initget 9) ;;; (setq c (getpoint "\n圆心:")) ;;; (initget 15) ;;; (setq r (getdist C "\n半径:")) (setq c '(0 0)) (setq r 1) (setq z (ALG:AverageLengthOfCircle p c r)) (princ "\n所求的值为: ") (princ (rtos z 2 20)) (princ) ) (defun c:gg () (setq i 0) (setq p0 '(0 0)) (setq l 0) (setq x 0) (setq n 1000000) (setq u (/ 1.0 n)) (repeat n (setq y (cos x)) (setq d (distance p0 (list x y))) (setq l (+ l d)) (setq x (* i u)) (setq i (1+ i)) ) (setq v (/ l n)) (princ "\n所求的值为: ") (princ (rtos v 2 20)) (princ) ) (defun c:ccc() (initget 9) (setq p (getpoint "\n直线外一点:")) (setq p (trans p 1 0)) (initget 9) (setq p1 (getpoint "\n直线第一点:")) (setq p1 (trans p1 1 0)) (initget 9) (setq p2 (getpoint "\n直线第一点:")) (setq p2 (trans p2 1 0)) (setq x (ALG:AverageLength p p1 p2)) (princ (strcat "\n所求的平均值是:" (rtos x 2 20))) (setq x1 (ALG:AverageLength1 p p1 p2)) (princ (strcat "\n极限法所求的平均值是:" (rtos x1 2 20))) (setq x2 (ALG:AverageLength2 p p1 p2)) (princ (strcat "\n积分法所求的平均值是:" (rtos x2 2 20))) ;;; (UTI:BENCH 1000 ;;; (list ;;; (list 'ALG:AverageLength p p1 p2) ;;; (list 'ALG:AverageLength1 p p1 p2) ;;; ) ;;; ) (princ) )
有兴趣的不妨测试一下。