您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MATLAB | 三个趣的圆相关的数理性质可视化

slandarer 发布时间:2022-06-24 20:15:47 ,浏览量:0

椭圆的准圆

在这里插入图片描述

命题1: 椭圆外一点向椭圆做两条切线,若两切线垂直,则点的轨迹为圆形。

简单说明下为啥: 对于椭圆 x 2 a 2 + y 2 b 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2}=1 a2x2​+b2y2​=1,假设其过 ( m , n ) (m,n) (m,n)点的切线方程为 y − n = k ( x − m ) y-n=k(x-m) y−n=k(x−m),带入得椭圆方程得:

b 2 x 2 + a 2 ( k 2 ( x − m ) 2 + 2 n k ( x − m ) + n 2 ) − x 2 b 2 = 0 ( a 2 k 2 + b 2 ) x 2 + 2 k a 2 ( n − m k ) x + a 2 ( k m − n ) 2 − a 2 b 2 = 0 \begin{aligned} &b^2x^2+a^2(k^2(x-m)^2+2nk(x-m)+n^2)-x^2b^2=0\\ &(a^2k^2+b^2)x^2+2ka^2(n-mk)x+a^2(km-n)^2-a^2b^2=0 \end{aligned} ​b2x2+a2(k2(x−m)2+2nk(x−m)+n2)−x2b2=0(a2k2+b2)x2+2ka2(n−mk)x+a2(km−n)2−a2b2=0​

由于求的是切线因而 Δ = 0 \Delta=0 Δ=0,即 ( m 2 − a 2 ) k 2 − 2 m n k + n 2 − b 2 (m^2-a^2)k^2-2mnk+n^2-b^2 (m2−a2)k2−2mnk+n2−b2,这是一个关于 k k k的约束条件,由伟达定理得到两条切线的斜率 k 1 , k 2 k_1,k_2 k1​,k2​满足条件: k 1 k 2 = n 2 − b 2 m 2 − a 2 k_1k_2=\frac{n^2-b^2}{m^2-a^2} k1​k2​=m2−a2n2−b2​ 由于两切线垂直,因此 k 1 k 2 = − 1 k_1k_2=-1 k1​k2​=−1,因而有: m 2 + n 2 = a 2 + b 2 m^2+n^2=a^2+b^2 m2+n2=a2+b2 是一个半径为 a 2 + b 2 \sqrt{a^2+b^2} a2+b2 ​的圆。

可视化效果: 在这里插入图片描述

MATLAB代码:

function directorC
% @author : slandarer
% 公众号  : slandarer随笔
% 知乎    : hikari
a=3;b=2;syms k
% axes基础属性设置
ax=gca;
hold on;grid on
ax.XLim=[-6,6];
ax.YLim=[-4,4];
ax.DataAspectRatio=[1,1,1];
ax.XAxisLocation='origin';
ax.YAxisLocation='origin';
ax.LineWidth=1.5;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.GridLineStyle='-.';
ax.GridAlpha=.09;
% 绘制圆和椭圆
t=linspace(0,2*pi,200);
plot(a.*cos(t),b.*sin(t),'LineWidth',2.5,'Color',[0,118,168]./255)
plot(sqrt(a^2+b^2).*cos(t),sqrt(a^2+b^2).*sin(t),'LineWidth',2.5,'Color',[169,64,71]./255)
% 绘制切线和交点
thetaList=linspace(0,2*pi,200);
kline1=plot(0,0,'-.','LineWidth',1.5,'Color',[1,1,1].*.5);
kline2=plot(0,0,'-.','LineWidth',1.5,'Color',[1,1,1].*.5);
kpnt=scatter(a,0,'filled','CData',[1,1,1].*.3);
X=-6:.1:6;
% 循环绘图
for i=1:length(thetaList)
    theta=thetaList(i);
    m=sqrt(a^2+b^2).*cos(theta);
    n=sqrt(a^2+b^2).*sin(theta);
    kk=double(solve((m^2-a^2)*k^2-2*m*n*k+n^2-b^2==0)); 
    Y1=kk(1).*(X-m)+n;Y2=kk(2).*(X-m)+n;
    kline1.XData=X;kline1.YData=Y1;
    kline2.XData=X;kline2.YData=Y2;
    kpnt.XData=m;
    kpnt.YData=n;
    drawnow;
    pause(.01)
end
end
旋转的错觉

命题2: 假设有半径为 r 2 \frac{r}{2} 2r​的小圆在半径为 r r r大圆内滚动,小圆上的点轨迹为直线。

证明很简单,假设此时小圆上有一点与大圆接触,且此时小圆圆心与原点的连线与x轴正方向的夹角为 θ 0 \theta_0 θ0​,现假设小圆滚动导致小圆圆心夹角变化 θ \theta θ,由于小圆半径为大圆的一半,因而当滚过相同路程时,小圆上的点的夹角反方向变化 2 θ 2\theta 2θ因而可以求出该小圆上点位置变化参数方程:

{ x = r 2 c o s ( θ 0 + θ ) + r 2 c o s ( θ 0 + θ − 2 θ ) y = r 2 s i n ( θ 0 + θ ) + r 2 s i n ( θ 0 + θ − 2 θ ) ⇒ { x = ( r 2 c o s ( θ ) ) c o s ( θ 0 ) y = ( r 2 c o s ( θ ) ) s i n ( θ 0 ) \begin{aligned} &\left\{\begin{matrix} x=\frac{r}{2}cos(\theta_0+\theta)+\frac{r}{2}cos(\theta_0+\theta-2\theta)\\ y=\frac{r}{2}sin(\theta_0+\theta)+\frac{r}{2}sin(\theta_0+\theta-2\theta)\\ \end{matrix}\right. \\ \Rightarrow &\left\{\begin{matrix} x=(\frac{r}{2}cos(\theta))cos(\theta_0)\\ y=(\frac{r}{2}cos(\theta))sin(\theta_0) \end{matrix}\right. \end{aligned} ⇒​{x=2r​cos(θ0​+θ)+2r​cos(θ0​+θ−2θ)y=2r​sin(θ0​+θ)+2r​sin(θ0​+θ−2θ)​{x=(2r​cos(θ))cos(θ0​)y=(2r​cos(θ))sin(θ0​)​​

这不就是一个过原点,角度为 θ 0 \theta_0 θ0​的直线嘛,证明完毕,小圆上所有点都走直线,为了可视化看起来好看,这里画几个等分的点搞一些可视化:

可视化效果: 在这里插入图片描述 在这里插入图片描述

MATLAB代码:

function PointOnLineInCircle(N)
% @author : slandarer
% 公众号  : slandarer随笔
% 知乎    : hikari
if nargin            
关注
打赏
1664692598
查看更多评论
0.0417s