一个博士朋友的儿子刚上初中不久,他就提出了下面的一个问题,我感觉很有深度,很难得,现在贴出来说说。
如下面图所示:已知线段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代码来验证求解。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
(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) ) |
有兴趣的不妨测试一下。