数学研发论坛

 找回密码
 欢迎注册
12
返回列表 发新帖
楼主: 葡萄糖

[欣赏] 定长悬链线的包络线

[复制链接]
发表于 2014-6-5 21:10:11 | 显示全部楼层
根据 7#的归一化方程,我们可以得出 x和y分别关于参数的方程。 但这两个分别的参数方程都无法显式化,悲剧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-5 21:16:35 | 显示全部楼层
geogebra 是可以画出包络线的。但我目前还不会画悬链线,需要折腾一会
http://wiki.geogebra.org/en/Envelope_Command

点评

知道怎么画悬链线了,敲命令即可:y=(cosh(x*sinh(t)-t)-cosh(t))/sinh(t) , 但接下来envelope这个命令貌似不会用了唉  发表于 2014-6-5 21:50
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-7 15:33:10 | 显示全部楼层
使用数值求解非线性方程根的方法来绘制包络线
下面是Matlab代码
  1. 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;
  2. xt=@(a)fsolve(f(a,1),a,optimset('Display','off'));  % 数值求根
  3. yt=@(a,x)sqrt(a.^2+1^2).*cosh(x./a)-sinh(x./a)-sqrt(a.^2+1);
  4. a=0.01:0.01:10;  % a的取值范围为0.01到10,L取作1进行归一化
  5. x=arrayfun(xt,a);
  6. y=yt(a,x);
  7. plot(x,y)
复制代码

下面是结果图

包络线

包络线


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

点评

我设置的就是a的值作为初值,比如a很接近0的时候,x应该也很接近0。我也尝试过其他的初值,比如0,结果解出来的x是负的,但是精度很高。  发表于 2014-6-7 18:29
会不会是 fsolve的初始值没设置好  发表于 2014-6-7 17:18
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-7 18:24:16 | 显示全部楼层
我用Mathematica画图的,FindRoot 数值求根的时候初始值 也是在a处取,效果都还不错,这点貌似把MATLAB的fsolve比过了。

123.png

点评

定义嵌套的求根函数? 额。。。  发表于 2014-6-7 18:45
把代码贴上来让我学习下哈  发表于 2014-6-7 18:32
本来我也想用Mathematica画的,奈何不太会定义嵌套的求根函数  发表于 2014-6-7 18:32
因为matlab对于奇异值的处理是数值的,比如x=0,sin(x)/x在matlab中的结果是NaN而不是1  发表于 2014-6-7 18:31
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-7 18:41:28 | 显示全部楼层
  1. (*数值求取包络线上的坐标点*)
  2. L=1;
  3. data=Quiet@Table[{a,t=x/.FindRoot[-a^3+(a^3+L Sqrt[a^2+L^2] x) Cosh[x/a]-(a^2+L^2) x Sinh[x/a]==0,{x,a}],- Sqrt[a^2+L^2]+ Sqrt[a^2+L^2] Cosh[t/a]-L Sinh[t/a]},{a,0,5,0.01}];
  4. (*将数值解和悬链线曲线族画在一个坐标上*)
  5. Quiet@Show[{ListPlot[Rest[data][[All,2;;3]],AxesOrigin->{0,0},PlotRange->{{0,2},{-1.05,0}},PlotStyle->Directive[Red,PointSize[0.02]]],Table[Plot[- Sqrt[a^2+L^2]+ Sqrt[a^2+L^2] Cosh[x/a]-L Sinh[x/a],{x,0,2}],{a,Quiet@Table[a/.FindRoot[a ArcSinh[L/a]==d,{a,d}],{d,0,2,.02}]}]}]
复制代码


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

点评

感觉代码可以再优化一下,既然前面进行了方程求根,后面绘图的时候可以不再重复求。  发表于 2014-6-7 20:33

评分

参与人数 1威望 +2 金币 +2 贡献 +2 鲜花 +2 收起 理由
kastin + 2 + 2 + 2 + 2 漂亮

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-7 21:37:54 | 显示全部楼层
感觉代码可以再优化一下,既然前面进行了方程求根,后面绘图的时候可以不再重复求。  

@kastin 后面的FindRoot 是两码事情,是保证悬链线曲线族的端点宽度的变化的均匀性,你可以直接将
{a,Quiet@Table[a/.FindRoot[a ArcSinh[L/a]==d,{a,d}],{d,0,2,.02}]}
替换成 {a,0,2,.02}.

===
对比一下这两幅图:
第一个是a均匀变化,第二个是d均匀变化(与 hujunhua 7#的几何画板画出来的直观感受很一致)。
asd.png

点评

明白了~  发表于 2014-6-7 22:03
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2021-9-27 12:04 , Processed in 0.066173 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表