小问题,大思考

一个博士朋友的儿子刚上初中不久,他就提出了下面的一个问题,我感觉很有深度,很难得,现在贴出来说说。

如下面图所示:已知线段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)
)

有兴趣的不妨测试一下。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注