|

楼主 |
发表于 2023-7-5 09:33
|
显示全部楼层
本帖最后由 天山草 于 2023-7-5 10:38 编辑
下面的程序思路是 denglongshan 提供的。其核心技术是利用了一个相交的两圆的连心线与公共弦的交点的计算公式,此公式也是denglongshan 推导出来的。当两圆并不相交时,利用这个公式算出的交点即是两圆连心线与两圆根轴的交点。当两圆相切时,此点就是切点。根据这一原理,可写出一个非常精练的证明程序如下。
程序代码:
- Clear["Global`*"](*令外接圆为单位圆,圆心在原点*)
- \!\(\*OverscriptBox[\(o\), \(_\)]\) = o = 0; \!\(\*OverscriptBox[\(a\), \(_\)]\) = 1/a;
- \!\(\*OverscriptBox[\(b\), \(_\)]\) = 1/b; \!\(\*OverscriptBox[\(c\), \(_\)]\) = 1/c; h = a + b + c;
- \!\(\*OverscriptBox[\(h\), \(_\)]\) = \!\(\*OverscriptBox[\(a\), \(_\)]\) + \!\(\*OverscriptBox[\(b\), \(_\)]\) + \!\(\*OverscriptBox[\(c\), \(_\)]\);(*外接圆圆心在原点*)
- d = (a + h)/2; \!\(\*OverscriptBox[\(d\), \(_\)]\) = (\!\(\*OverscriptBox[\(a\), \(_\)]\) + \!\(\*OverscriptBox[\(h\), \(_\)]\))/2;
- XiangjiaoxuanLianxin[o1_, a_, o2_, b_] := 1/(2 (\!\(\*OverscriptBox[\(o2\), \(_\)]\) - \!\(\*OverscriptBox[\(o1\), \(_\)]\))) (a \!\(\*OverscriptBox[\(a\), \(_\)]\) - b \!\(\*OverscriptBox[\(b\), \(_\)]\) + \!\(\*OverscriptBox[\(b\), \(_\)]\) o2 + b \!\(\*OverscriptBox[\(o2\), \(_\)]\) - \!\(\*OverscriptBox[\(a\), \(_\)]\) o1 - a \!\(\*OverscriptBox[\(o1\), \(_\)]\) + \!\(\*OverscriptBox[\(o2\), \(_\)]\) o1 - o2 \!\(\*OverscriptBox[\(o1\), \(_\)]\));
- (*圆(O1,A)与圆(O2,B)连心线与公共弦的交点*)
- \!\(\*OverscriptBox[\(XiangjiaoxuanLianxin\), \(_\)]\)[o1_, a_, o2_, b_] := (a \!\(\*OverscriptBox[\(a\), \(_\)]\) - b \!\(\*OverscriptBox[\(b\), \(_\)]\) + \!\(\*OverscriptBox[\(b\), \(_\)]\) o2 + b \!\(\*OverscriptBox[\(o2\), \(_\)]\) - \!\(\*OverscriptBox[\(a\), \(_\)]\) o1 - a \!\(\*OverscriptBox[\(o1\), \(_\)]\) + o2 \!\(\*OverscriptBox[\(o1\), \(_\)]\) - \!\(\*OverscriptBox[\(o2\), \(_\)]\) o1)/(2 (o2 - o1));
- WX[a_, b_, c_] := (a \!\(\*OverscriptBox[\(a\), \(_\)]\) (b - c) + b \!\(\*OverscriptBox[\(b\), \(_\)]\) (c - a) + c \!\(\*OverscriptBox[\(c\), \(_\)]\) (a - b) )/( \!\(\*OverscriptBox[\(a\), \(_\)]\) (b - c) + \!\(\*OverscriptBox[\(b\), \(_\)]\) (c - a) + \!\(\*OverscriptBox[\(c\), \(_\)]\) (a - b));
- \!\(\*OverscriptBox[\(WX\), \(_\)]\)[a_, b_, c_] := -((a \!\(\*OverscriptBox[\(a\), \(_\)]\) (\!\(\*OverscriptBox[\(b\), \(_\)]\) - \!\(\*OverscriptBox[\(c\), \(_\)]\)) + b \!\(\*OverscriptBox[\(b\), \(_\)]\) (\!\(\*OverscriptBox[\(c\), \(_\)]\) - \!\(\*OverscriptBox[\(a\), \(_\)]\)) + c \!\(\*OverscriptBox[\(c\), \(_\)]\) (\!\(\*OverscriptBox[\(a\), \(_\)]\) - \!\(\*OverscriptBox[\(b\), \(_\)]\)) )/( \!\(\*OverscriptBox[\(a\), \(_\)]\) (b - c) + \!\(\*OverscriptBox[\(b\), \(_\)]\) (c - a) + \!\(\*OverscriptBox[\(c\), \(_\)]\) (a - b)));
- e = WX[d, o, h]; \!\(\*OverscriptBox[\(e\), \(_\)]\) = \!\(\*OverscriptBox[\(WX\), \(_\)]\)[d, o, h];
- \!\(\*OverscriptBox[\(ee\), \(_\)]\) = \!\(\*OverscriptBox[\(e\), \(_\)]\);(*转存一下,为后面回代从 Overscript[e, _] \
- 中消掉 a 做准备 *)
- k[a_, b_] := (a - b)/(\!\(\*OverscriptBox[\(a\), \(_\)]\) - \!\(\*OverscriptBox[\(b\), \(_\)]\)); (*复斜率定义*)
- Simplify@Solve[{k[a, b] == k[a, e]}, {a}];(*若E点在AB上,求A点坐标与B、C坐标的关系*)
- a = -((c (2 b + c))/(b + 2 c));(*另一个解是 a=0,舍去*) \!\(\*OverscriptBox[\(a\), \(_\)]\) = 1/a; Print["a = ", a];
- e = Simplify[e]; \!\(\*OverscriptBox[\(e\), \(_\)]\) = Simplify[\!\(\*OverscriptBox[\(ee\), \(_\)]\)];(*回代到E的坐标,下面证明此时E点在圆O上。*)
- Print["e = ", e];
- Print["测试圆E 的直径是否等于 1: ", Simplify[(o - e) (\!\(\*OverscriptBox[\(o\), \(_\)]\) - \!\(\*OverscriptBox[\(e\), \(_\)]\)) == 1/4]];
- Print["因为圆E 的直径等于 1 且O 点在圆E 上,所以两圆相切。"];
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|