一个转子曲线面积问题及其反问题的解答

来源:互联网 发布:medusa 软件 编辑:程序博客网 时间:2024/05/02 05:06

曾经解答过这样一个问题,从该ID的最后一次登录时间、该ID显示的专业信息,误以为是新闻里某个想不开的同学,不安了一阵子。经确认是我多虑了,不过把问题答案还是写出来。

之后就收到一堆要求帮忙算东西、做作业的邮件或私信。——虽然碰到类似的情况虚惊了一场,不过有些原则还是坚持的。我觉得对某些问题收费是一个不错的选择。如果碰上这类问题,自己多方努力也还是做不出,求助无门,压力很大,郁闷得快要崩溃,那么,现在有一种转移或分散这种压力的途径:只需要付费,这个压力就能有人分担,而不再是不可调和的。我看到网络有类似的店,感觉不错。因为这对郁闷的同学来说提供了新的可能,让他们可以在 自己再努力一把"或者付费解决之间做一个选择,而不再是求助无门。

上个世纪80年代以后出生的高学历的年轻人,可能会因为课题有难度、毕业有压力而轻生,但是,为了几百几千块钱轻生的可能性应该会大大降低吧。——这是缓解矛盾的一种想来有效的方式。

虽然这类问题应该归咎于本科或研究生教育中基础知识准备的缺失,这是一个体制或系统的问题,短期内不太可能有一个和谐的答案。临时的市场化的方式,既创造了就业机会和GDP,也一定程度弥补了系统性的问题,值得鼓励。

工具:用Mathematica 解决。求解这类问题,Mathematica首屈一指。

首先是描述两条曲线的代码:

ClearAll["Global`*"];R = 4878/100;z1 = 6;r = R/z1;z2 = z1 - 1;e = 705/100;f = r/e;re = 126/10;θ = ArcTan[Sin[z1 τ]/(f + Cos[z1 τ])] - τ;φ = ArcSin[f Sin[θ + τ]] - θ;ψ = z1/(z1 - 1) φ;(* 两个参数方程 *)curve01 = {(R - r) Sin[τ] + e Sin[z2 τ] -  re Sin[θ], (R - r) Cos[τ] - e Cos[z2 τ] +  re Cos[θ]} // Simplify;(*定子*)ParametricPlot[curve01,{τ,0,2 π},Exclusions\[Rule]None,MaxRecursion\[Rule]15,PlotPoints->500,PlotStyle->Red](*转子*)curve02 = {curve01[[1]] Cos[φ - ψ] -  curve01[[2]] Sin[φ - ψ] - e Sin[ψ],    curve01[[1]] Sin[φ - ψ] +   curve01[[2]] Cos[φ - ψ] - e Cos[ψ]} //Simplify;base=ParametricPlot[curve02,{τ,0,2 π},Exclusions->None,MaxRecursion->15,PlotPoints->500,PlotStyle->Blue]; Show[base]

这里写图片描述

上面代码定义各个常数,以及两条曲线的参数方程。因为τ 并不是一个自然的参数,需要计算曲线封闭的情况下实际的周期是多少,算出来是τp=5π/3 。下面代码根据上述结果,显示根据对称性和Green定理需要求解的1/10图形的样子

CODE:

τp = (y - x) /.FindRoot[(curve02 /. τ -> x) == (curve02 /. τ -> y), {x, Pi/20}, {y, 2 Pi}];arc = Table[curve02, {τ, 0, τp/10, .00001}];Show[base,Graphics[{{Red,Line[{curve02 /. τ -> 0, {0, 0},curve02 /. τ -> τp/10}], Line@arc}}]]

这里写图片描述

然后用Green定理计算转子曲线的面积:
CODE:

τp = 5 Pi/3;5(NIntegrate[-First[curve02] D[Last@curve02, τ] +  Last[curve02] D[First@curve02, τ], {τ, 0, τp/10}, Method -> "LocalAdaptive", MaxRecursion -> 100]) // NumberForm[#, 15] &

数值积分的被积函数带有间断点的情况下,可能产生问题,标出间断点、或者采用LocalAdaptive方式、增加最大迭代次数,可以消除潜在问题或warning message。

结果是:

6557.97718280445

现在开始求已知面积是 6557.19 时的r , 需要先把面积表示成r的函数,其它参数都不变; 然后用牛顿法迭代:
CODE:

curveArea[r_]:=Module[{z1,z2,e,f,re,R,θ,φ,ψ,τ,curve01,curve02},z1=6;R=r z1;z2=z1-1;e=705/100;f=r/e;re=126/10;θ=ArcTan[Sin[z1 τ]/(f+Cos[z1 τ])]-τ;φ=ArcSin[f Sin[θ+τ]]-θ;ψ=z1/(z1-1) φ;curve01={(R-r) Sin[τ]+e Sin[z2 τ]-re Sin[θ],(R-r) Cos[τ]-e Cos[z2 τ]+re Cos[θ]};curve02={curve01[[1]] Cos[φ-ψ]-curve01[[2]] Sin[φ-ψ]-e Sin[ψ],curve01[[1]] Sin[φ-ψ]+curve01[[2]] Cos[φ-ψ]-e Cos[ψ]};(5 (NIntegrate[-First[curve02] D[Last@curve02,τ]+Last[curve02] D[First@curve02,τ],{τ,0,τp/20,τp/10},MaxRecursion->100,Method->"LocalAdaptive"]))]
FindRoot[curveArea[x] == 6557.19, {x, 7.5}, Evaluated -> False,Method -> {"Newton", "StepControl" -> "TrustRegion"}] // AbsoluteTiming

信赖域的方法获取迭代步长看上去是最稳健的方法。为了使得自定义函数在迭代中正常使用,需要定义函数使用次序,Evaluated->False就是必要的,这是其它编程语言中使用习惯想象不到的。

我的电脑比较破,用的时间很久, 结果是:
用时间172.41342746027159秒,
对应的

r=8.1294128480878

这就解答了这个问题。

解答问题使用到了stackexchange.com. 收益匪浅。

这也是乐于解答有一定难度问题的原因。

解答问题主要是,解决有些有趣的有适当难度的问题的过程,可以自我提高和强化既有的知识,并获得帮助人的满足。

——但有些问题纯属家庭作业,难度太低,或者提问者只须做到自己分内工作量就能够自己解答的,这类问题就是自己内心比较抵触回答的。回答问题的定位,不应该是全盘代劳或作枪手"

还有一些的确专业性强,解决起来花费超出一般的忍耐限度的更多时间和精力才能解决的问题,老实说,如果不是有特别好的私人关系或雇佣关系,勉为其难出于善意都去做,也不现实。——类似现象在其它方面也能看到,比如,不少明星或富翁做慈善的时候,常常号召大家都来捐款而不是只倾尽自己所有。

在国外的类似于stackexchange.com,stackoverflow.com之类的论坛,如果直接伸手要代码或简单如同家庭作业的问题的答案,通常会遭到一大帮人的群起鄙视,问题也很快会被关掉,处于非active状态。——这是一种非常好的积极向上的风气。

但国内似乎还没有这样的学风。加上防火墙的作用,有时候访问国外的知识性很强的网站还经常不稳定。加上问题比较多的很多学子,本身英语的阅读和表达能力乃至自信心都有欠缺。——所有这些可能是很多学生更愿意在中文语言环境和中文的学风氛围之内寻求解决方案的围栏。

然而很难说下一个碰到的是不是类似极端的例子?——只能说,有条件的,请尽可能去国外的一些论坛上寻求帮助。得到及时而且漂亮答案的几率会大大增加。

提问技巧(来自StackExchange)

Welcome to Mathematics Stack Exchange 靠山屯!

问题的大体格式和内容

To improve the chances of your question getting an answer, make sure that it: 为增加您的问题得到解答的机会,请:

Uses MathJax formatting for math formulas 使用MathJax书写数学公式

Has an interesting, specific title that summarizes the question
标题能够清楚反映自己的问题、有吸引力

Describes what you know and what you don’t understand (don’t just copy a textbook problem!)
介绍自己对哪些已经明白了,哪些还不懂(而不是从书上贴一段问题或手机拍个照片)

问问题的其它技巧

Here are some additional tips:

Search, and research
使用搜索引擎,和对问题的反复搜索研究(研究就是反复搜素?)

Have you thoroughly searched for an answer before asking your question? Sharing your research helps everyone. Tell us what you found (on this site or elsewhere) and why it didn’t meet your needs. This demonstrates that you’ve taken the time to try to help yourself, it saves us from reiterating obvious answers, and above all, it helps you get a more specific and relevant answer!

Be on-topic不同论坛上聚集的回答问题的人专长不同,找适合自己问题的论坛(stackexchange.com有好多子论坛)

Our community is defined by a specific set of topics in the help center; please stick to those topics and avoid asking for opinions or open-ended discussion. If your question is about the site itself, ask on our meta-discussion site. If you’re looking for a different topic, it might be covered on another Stack Exchange site.

Be specific 把问题具体化,不要太笼统;不要把数值问题问成符号问题;避免模糊的表达;如果有难度,最好能提供跟问题相关的背景和细节

If you ask a vague question, you’ll get a vague answer. But if you give us details and context, we can provide a useful, relevant answer.

Make it relevant to others如果问题对他人也会有帮助和启发就更好了,这样更多人会感兴趣,回答的人也更起劲

We like to help as many people at a time as we can. Make it clear how your question is relevant to more people than just you, and more of us will be interested in your question and willing to look into it.

Keep an open mind不钻牛角尖、不认死理、对不或不明白满意的答案不草率下结论;不懂就追问

The answer to your question may not always be the one you wanted, but that doesn’t mean it is wrong. A conclusive answer isn’t always possible. When in doubt, ask people to cite their sources, or to explain how/where they learned something. Even if we don’t agree with you, or tell you exactly what you wanted to hear, remember: we’re just trying to help.

0 0