小问题,大思考
highflybird
- 登录 发表评论
一个博士朋友的儿子刚上初中不久,他就提出了下面的一个问题,我感觉很有深度,很难得,现在贴出来说说。
如下面图所示:已知线段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)
)
有兴趣的不妨测试一下。