MATLAB中绘制椭圆

来源:互联网 发布:网络项目投标书 编辑:程序博客网 时间:2024/05/22 06:54

主要参考http://www.ilovematlab.cn/thread-68728-1-1.html

添加一部分自己的体会

一、根据椭圆方程:ax*x+bx*y+c*y*y+d*x+e*y = f画椭圆

【例1】已知椭圆方程:x*x + 2*x*y + 3*y*y + 4*x + 5*y = 6

第一种方法:调用MATLAB自带的ezplot函数画椭圆

 
>> ezplot('x^2+2*x*y+3*y^2+4*x+5*y = 6')
>> axis([-6 3 -3 3]);


第二种方法:调用自编的ellipsefig1函数画椭圆。ellipsefig1函数的代码如下:

 
function  h = ellipsefig1(a,b,c,d,e,f)
% 画一般椭圆:ax*x+bx*y+c*y*y+d*x+e*y = f
delta = b^2-4*a*c;
if delta >= 0
    warning('这不是一个椭圆')
    return;
end
x0 = (b*e-2*c*d)/delta;
y0 = (b*d-2*a*e)/delta;
r = a*x0^2 + b*x0*y0 +c*y0^2 + f;
if r <= 0
    warning('这不是一个椭圆')
    return;
end


aa = sqrt(r/a); 
bb = sqrt(-4*a*r/delta);
t = linspace(0, 2*pi, 60);
xy = [1 -b/(2*a);0 1]*[aa*cos(t);bb*sin(t)];
h = plot(xy(1,:)-x0,xy(2,:)-y0, 'k', 'linewidth', 2);

ellipsefig1函数的原理是通过配方将一般椭圆方程化为标准椭圆方程,作出标准椭圆曲线,然后通过坐标旋转和缩放得到所要的椭圆曲线图像。

第三种方法:调用自编的ellipsefig2函数画椭圆。ellipsefig2函数的代码如下:

 
function  h = ellipsefig2(a,b,c,d,e,f)
% 画一般椭圆:ax*x+bx*y+c*y*y+d*x+e*y = f
P = [a b/2;b/2 c];
delta = b^2-4*a*c;
if delta >= 0
    warning('这不是一个椭圆')
    return;
end
x0 = (b*e-2*c*d)/delta;
y0 = (b*d-2*a*e)/delta;
r = a*x0^2 + b*x0*y0 +c*y0^2 + f;
if r <= 0
    warning('这不是一个椭圆')
    return;
end


[V, D] = eig(P); 
aa = sqrt(r/D(1));
bb = sqrt(r/D(4));
t = linspace(0, 2*pi, 60);
xy = V*[aa*cos(t);bb*sin(t)];
h = plot(xy(1,:)-x0,xy(2,:)-y0, 'k', 'linewidth', 2);

ellipsefig2函数的原理是利用线性代数中所讲的二次型化标准型的办法将一般椭圆方程化为标准椭圆方程,先作出标准椭圆曲线,然后通过坐标旋转得到所要的椭圆曲线图像。

【例2】已知椭圆方程:[x,y][3, 1;1, 4][x,y]' = 5,即3*x*x + 2*x*y + 4*y*y = 5

可用MATLAB自带的ezplot函数,或自编的ellipsefig1ellipsefig2函数画此椭圆,命令分别如下:

 
>> ezplot('3*x^2+2*x*y+4*y^2 = 5')
>> axis([-2 2 -2 2])


>> ellipsefig1(3,2,4,0,0,5);


>> ellipsefig2(3,2,4,0,0,5);

二、根据椭圆中心坐标、长半轴、偏心率和方向角画椭圆

【例3已知椭圆中心坐标为[1, 2],长半轴为10,短半轴为5,方向角为45°



调用MATLAB自带的ellipse1函数画此椭圆,ellipse1函数根据椭圆中心坐标、长半轴、偏心率和方向角画椭圆。
 
>> ecc = axes2ecc(10,5);  % 根据长半轴和短半轴计算椭圆偏心率
>> [elat,elon] = ellipse1(1,2,[10 ecc],45);
>> plot(elat,elon)


PS此处想说一下自己的体会

之前看集员滤波相关的文献中,对于椭圆约束

一直没太理解清楚,其实很简单,展开后Q为P的逆可得出


也就是说可以写作椭圆边界

q11x1.^2+(q12+q21)*x1*x2+q22*x2.^2=1

就可以利用椭圆的一般式来绘图了。

另外,链接里给出的椭圆画法都是位于坐标原点处的椭圆,想要画在不同中心处的椭圆,可以稍微对代码加以修改

比如,我用的是ellipsefig1函数,将函数第一行function  h = ellipsefig1(a,b,c,d,e,f)变为

function  h = ellipsefig1(a,b,c,d,e,f,x,y)

最后一行改为h = plot(xy(1,:)-x0+x,xy(2,:)-y0+y, 'k');

调用时x,y即为椭圆中心点。

0 0
原创粉丝点击