http://wiki.geogebra.org/en/Envelope_Command 使用数值求解非线性方程根的方法来绘制包络线
下面是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),造成离散点连线“翘起”。 我用Mathematica画图的,FindRoot 数值求根的时候初始值 也是在a处取,效果都还不错,这点貌似把MATLAB的fsolve比过了。
(*数值求取包络线上的坐标点*)
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均匀取值画出来的,导致最终画出来的悬链线两端点宽度的变化不够均匀,这次就好了:
感觉代码可以再优化一下,既然前面进行了方程求根,后面绘图的时候可以不再重复求。
@kastin 后面的FindRoot 是两码事情,是保证悬链线曲线族的端点宽度的变化的均匀性,你可以直接将
{a,Quiet@Table==d,{a,d}],{d,0,2,.02}]}
替换成 {a,0,2,.02}.
===
对比一下这两幅图:
第一个是a均匀变化,第二个是d均匀变化(与 hujunhua 7#的几何画板画出来的直观感受很一致)。
页:
1
[2]