wayne 发表于 2014-6-5 21:10:11

根据 7#的归一化方程,我们可以得出 x和y分别关于参数的方程。 但这两个分别的参数方程都无法显式化,悲剧。

wayne 发表于 2014-6-5 21:16:35

geogebra 是可以画出包络线的。但我目前还不会画悬链线,需要折腾一会
http://wiki.geogebra.org/en/Envelope_Command

kastin 发表于 2014-6-7 15:33:10

使用数值求解非线性方程根的方法来绘制包络线
下面是Matlab代码f=@(a,L)@(x)(a^3+L*x*sqrt(a^2+L^2)).*cosh(x/a)-x*(a^2+L^2).*sinh(x/a)-a^3;
xt=@(a)fsolve(f(a,1),a,optimset('Display','off'));% 数值求根
yt=@(a,x)sqrt(a.^2+1^2).*cosh(x./a)-sinh(x./a)-sqrt(a.^2+1);
a=0.01:0.01:10;% a的取值范围为0.01到10,L取作1进行归一化
x=arrayfun(xt,a);
y=yt(a,x);
plot(x,y)
下面是结果图


注意,上图中左下角有一部分翘起了,这部分应该是沿着曲线下降到y=-1的,之所以看上去翘起来了,是因为a=0.01和a=0.02时候,非线性方程变得奇异,使得求出来的x与a一样大(其实这时候x应该很接近0,且要小于a),所以y值反而升高(正确的情形应该是接近-1),造成离散点连线“翘起”。

wayne 发表于 2014-6-7 18:24:16

我用Mathematica画图的,FindRoot 数值求根的时候初始值 也是在a处取,效果都还不错,这点貌似把MATLAB的fsolve比过了。



wayne 发表于 2014-6-7 18:41:28

(*数值求取包络线上的坐标点*)
L=1;
data=Quiet@Table[{a,t=x/.FindRoot[-a^3+(a^3+L Sqrt x) Cosh-(a^2+L^2) x Sinh==0,{x,a}],- Sqrt+ Sqrt Cosh-L Sinh},{a,0,5,0.01}];
(*将数值解和悬链线曲线族画在一个坐标上*)
Quiet@Show[{ListPlot[],AxesOrigin->{0,0},PlotRange->{{0,2},{-1.05,0}},PlotStyle->Directive]],Table+ Sqrt Cosh-L Sinh,{x,0,2}],{a,Quiet@Table==d,{a,d}],{d,0,2,.02}]}]}]

楼上的图每一个悬链线我是按照a均匀取值画出来的,导致最终画出来的悬链线两端点宽度的变化不够均匀,这次就好了:

wayne 发表于 2014-6-7 21:37:54

感觉代码可以再优化一下,既然前面进行了方程求根,后面绘图的时候可以不再重复求。
@kastin 后面的FindRoot 是两码事情,是保证悬链线曲线族的端点宽度的变化的均匀性,你可以直接将
{a,Quiet@Table==d,{a,d}],{d,0,2,.02}]}
替换成 {a,0,2,.02}.

===
对比一下这两幅图:
第一个是a均匀变化,第二个是d均匀变化(与 hujunhua 7#的几何画板画出来的直观感受很一致)。
页: 1 [2]
查看完整版本: 定长悬链线的包络线