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

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 三个趣的圆相关的数理性质可视化相关的知识,希望对你有一定的参考价值。

椭圆的准圆

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

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

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 \\beginaligned &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 \\endaligned b2x2+a2(k2(xm)2+2nk(xm)+n2)x2b2=0(a2k2+b2)x2+2ka2(nmk)x+a2(kmn)2a2b2=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 (m2a2)k22mnk+n2b2,这是一个关于 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=\\fracn^2-b^2m^2-a^2 k1k2=m2a2n2b2
由于两切线垂直,因此 k 1 k 2 = − 1 k_1k_2=-1 k1k2=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 \\sqrta^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 \\fracr2 2r的小圆在半径为 r r r大圆内滚动,小圆上的点轨迹为直线。

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

x

以上是关于MATLAB | 三个趣的圆相关的数理性质可视化的主要内容,如果未能解决你的问题,请参考以下文章

概率论与数理统计猴博士 笔记 p41-44 统计量相关小题三大分布的判定性质总体服从正态分布的统计量小题

概率论与数理统计 Chapter3. 随机变量的数字特征

概率论与数理统计小结3 - 一维离散型随机变量及其Python实现

基于MATLAB均值漂移图像分割技术

怎么在MATLAB里面用矩阵画一个圆线?不是实心的圆,是圆线~~求助~~

MATLAB求解浸润角