Mathematica绘制动态椭圆摆线(一)

一、摆线

圆摆线,即圆在直线上滚动,圆上的点所经过的轨迹。如下图所示:
在这里插入图片描述
其动态形成过程已有很多人进行论述,可自行查找。上图给出的是其参数方程,并还可以根据参数方程绘制动态过程,以角度θ为变量,其半径设为1,转一圈正好2π。从中可以看出的是,圆的特别之处是,半径恒定,而且单位角度滚过的弧长一致,直线轴为圆的切线,切线的垂线过圆心。从而很容易计算出滚动θ角之后的弧长。
在这里插入图片描述
观察其参数方程可知,摆线轨迹都是从圆心坐标减下去相应的数值,表明先要得到圆心坐标,而作为圆的滚动,圆心坐标很简单。下面则是其一般表达形式,这样写则是为了下面介绍椭圆时更加方便。
在这里插入图片描述
其中L(θ)为圆滚动θ的弧长,R(θ)为滚动θ角的半径。

二、椭圆

椭圆有很多表现形式,如经典的曲线方程,另外还有参数方程,极坐标方程方程等。相较于圆,椭圆需要注意的点尤其多。先还是找到Mathematica中绘制椭圆的函数,其中Circle函数可以绘制给定圆心和长短轴半径,且长短轴垂直于坐标轴的椭圆。这就说明画出的椭圆不会倾斜,就是直的。要解决这个问题就要在添加一个旋转的函数,让椭圆绕圆心旋转一定的角度,就相当于把椭圆心移动一定的距离画个椭圆,再旋转一定的角度。即可满足达到滚动的要求。既然滚动时要确定圆心,先要确定其与坐标轴的交点,既是交点亦是切点,确定其与圆心的关系,再确定圆心与摆线点的关系。切点的横坐标坐标即是弧长L(θ),纵坐标为0。
在这里插入图片描述
第一个有意思的地方来了,从椭圆心转动的角度与其椭圆半径长之间的关系,如果按照椭圆的参数方程那就错了。参数方程角度与本身自然角度的变化不是一致的,从图中可以看出。我们要的是自然变化的角度,对应的弧长以及此时的椭圆半径。
在这里插入图片描述
在这里插入图片描述
选用下面的公式才是表达椭圆由其圆心自然对应其圆周上的弧长的公式。至于计算椭圆弧长有椭圆的曲线积分之类的函数,不过这里我刚开始想选用计算周长的函数,最后一看应该是计算这种线长的函数ArcLength,图方便采用这个函数计算椭圆弧长,相当于取一个椭圆,求出对应不同角度的弧长。

具体的通过交点求圆心,圆心求摆线点的公式我就不给出了,重点不在这里,画幅示意图就能明白了。第二个有意思的地方来了,椭圆滚动的角度是θ,那么椭圆转动的角度是不是θ来着,很可惜并不是,是切线角,这就要用求导得出切线的斜率,总之这里算的让人很难受。这些角度的变化计算是最烦人的,浪费了我好多草稿纸。另外切角也掺和进了圆心坐标。

三、椭圆摆线

按照以上的思路再通过一系列复杂的编程,最终结果如下:
在这里插入图片描述
本来一开始采用比较笨的方法,把其滚动分为四个区间,结果出来四五个分段函数,代码太乱了,看一遍脑袋都大了,后面从新再来一遍,果断把切角改成0-2π,然后里面的正弦余弦函数都是周期函数,就不用担心了。总体的思路应该是没有什么问题的,先求交点坐标,再联系出椭圆心的坐标,再得到摆线点坐标。不过最后出来的这幅动图唯一的疑问就是,刚开始滚动的那么一会儿和结束时候的那一会摆线不那么圆润,就像手机的倒角圆角拿起来心里总有点不舒服,但是又转化不成单独关于x,y的曲线方程。

上代码:

h[x_] := Piecewise[{{ArcTan[4 Tan[t]], x <= 0.5 Pi},
    {ArcTan[4 Tan[t]] + Pi, 0.5 Pi < x <= Pi},
    {ArcTan[4 Tan[t]] + Pi, Pi < x <= 1.5 Pi},
    {ArcTan[4 Tan[t]] + 2 Pi, 1.5 Pi < x <= 2 Pi}}];(*转动角度*)
a = Table[
  Show[{
    Plot[x^2, {x, 1, 3}, Axes -> True, AxesOrigin -> {0, 0}, 
     AspectRatio -> 1/2, PlotStyle -> {Thick, White}, 
     PlotRange -> {{-3, 12}, {-3, 5}}],
    ParametricPlot[{ArcLength[Circle[{0, 0}, {1, 2}, {0, t}]] + 
       Cos[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1] - 
       2*Cos[0.5 Pi - h[t]], 
      Sin[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1] - 
       2*Sin[0.5 Pi - h[t]]}, {t, 0.0001, t}, 
     PlotStyle -> {Thick, Blue}],
    Graphics[{Red, 
      Disk[{ArcLength[Circle[{0, 0}, {1, 2}, {0, t}]] + 
         Cos[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1],
        Sin[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1]}, 0.2]}],
    ParametricPlot[{ArcLength[Circle[{0, 0}, {1, 2}, {0, t}]] + 
       Cos[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1], 
      Sin[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1]}, {t, 0.0001, t}, 
     PlotStyle -> {Thick, Green}],
    Graphics[
     Rotate[{Red, Thick, 
       Circle[{ArcLength[Circle[{0, 0}, {1, 2}, {0, t}]] + 
          Cos[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1],
         Sin[0.5 Pi - h[t] + t]*2/Sqrt[3*Sin[t]^2 + 1]},
        {1, 2}
        ], AxesStyle -> {Thick, Black, Black}},
      -h[t]]
     ]
    }], {t, 0.001, 2 Pi, 0.04 Pi}]
Export["e:/Program Files/math files/椭圆滚动69.gif", a, 
  ImageResolution -> 100];
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页