- 注册时间
- 2015-10-15
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2214
- 在线时间
- 小时
|
发表于 2021-10-8 20:11:42
|
显示全部楼层
本帖最后由 TSC999 于 2021-10-8 20:18 编辑
楼主先生,您前几天在回复另一帖子中发布了如下程序,在学习该程序时,觉得最后显示的那个结论公式太复杂,它应该等于零才对。
我试着改了一下最后那条语句,计算表明两组线段长度之比确实等于零。我觉得我改写后的语句可能还不是最优的,有没有更好的写法?
- Clear["Global`*"]; (*creasson编写的有理参数构图程序*)
- points = {A -> 0, B -> 1, P -> (1 + I p)/(1 - I u),
- T -> (1 + I q)/(1 - I v)};(*设点*)
- vectors =
- Factor[{v1 -> Limit[D[P /. points, u]*u^2, u -> \[Infinity]],
- v2 -> Limit[D[T /. points, v]*v^2,
- v -> \[Infinity]]}];(*在A处的两条切线的切向量*)
- CDEQ = (Factor[ComplexExpand[Im[#]]] //
- Numerator) & /@ ({(T - A)/v1, (P - A)/v2} /. points /.
- vectors);(*求C,D*)
- CDsol = Solve[CDEQ == 0, {u, v}] // Flatten;
- points = Union[
- points, {C -> (T /. points /. CDsol),
- D -> (P /. points /. CDsol)}] // Factor;
- (*求E,F*)
- EFEQ = (Factor[ComplexExpand[Im[#]]] //
- Numerator) & /@ ({(P - B)/(C - B), (T - B)/(D - B)} /. points);
- EFsol = Solve[EFEQ == 0, {u, v}][[-1]];
- points = Union[
- points, {E -> (P /. points /. EFsol),
- F -> (T /. points /. EFsol)}] // Factor;
- (*求M,N*)
- points = Union[points, {O1 -> (1 + I p)/2, O2 -> (1 + I q)/2}] //
- Factor;
- points = Union[
- points, {M -> \[Lambda]*D + (1 - \[Lambda]) A,
- N -> \[Mu]*C + (1 - \[Mu]) A} /. points] // Factor;
- MNEQ = (Factor[ComplexExpand[Im[#]]] //
- Numerator) & /@ ({(M - O1)/(E - O1), (N - O2)/(F - O2)} /.
- points);
- MNsol = Solve[MNEQ == 0, {\[Lambda], \[Mu]}] // Flatten;
- points = Factor[points /. MNsol];(*求点Q*)
- points = Union[points, {Q -> \[Eta]}] // Factor;
- QEQ = (Factor[ComplexExpand[Im[#]]] //
- Numerator) & /@ ({(M - Q)/(N - Q)} /. points);
- Qsol = Solve[QEQ == 0, {\[Eta]}] // Factor // Flatten;
- points = Factor[points /. Qsol];
- squarelens =
- Factor[ComplexExpand[Abs[#]^2]] & /@ ({B - D, B - C, Q - M,
- Q - N} /. points);(*结论*)
- target = Factor[(squarelens[[1]]/squarelens[[2]]) - (squarelens[[3]]/
- squarelens[[4]])];
- Print["points = ", points];(*显示*)
- (*Print["target = ",target]; 原语句 *)
- Print["target = ",
- Simplify[target]];(*把上面的原语句加上Simplify,计算结果会简化一些,但还不是最简*)
- (*把上面的原语句改为下面几条语句,将给出目标式的最简结果*)
- k1 = ExpandDenominator@
- Together@ComplexExpand@Simplify[Abs[(B - D)/(B - C)] /. points];
- k2 = ExpandDenominator@
- Together@ComplexExpand@Simplify[Abs[(Q - M)/(Q - N)] /. points];
- DB/BC -> k1
- MQ/NQ -> k2
- If[k1 - k2 == 0, Print["由于 DB/BC-MQ/NQ = 0,所以 DB/BC = MQ/NQ"]]
复制代码
程序运行结果如下(用图片表示:)
|
|