我如何在MATLAB椭圆适合我的数据吗?

238(30天)
我有一些测量数据存储在向量“x”和“y”。我想找到最适合这些数据的椭圆(最小二乘意义上的)。

接受的答案

MathWorks支万博1manbetx持团队
编辑:MathWorks支万博1manbetx持团队 2022年11月28日
这个问题可以被看作是一个矩阵的问题,作为一个非线性最小二乘问题。
椭圆方程是:
(x - c (1)) ^ 2 / r (1) ^ 2 + (y - c (2)) ^ 2 / r (2) ^ 2 = 1
线性最小二乘
- - - - - - - - - - - - - - - - - - - - -
首先,把这个问题看作一个线性最小二乘问题的参数方程:
x = (1) + (2) * cos (t);
y =(3) +(4) *罪(t);
在这里,你想找到“a”来确定最适合的x和y (t)在最小二乘意义上的这些方程。(假设你不知道椭圆集中的地方。如果是集中在原点,那么(1)和(3)为零,可以排除方程。)
假设数据(x, y, t)是生成的
t =(0:π/ 2 *π)';
x = 5 + 4 * cos (t) +兰德(大小(t));
y = 8 + 2 * sin (t) +兰德(大小(t));
然后你想要执行的操作:
最小化| | W * a - (x, y) | |_2
一个
W:
我=大小(t);% t是一个列向量
W = [1 (i)因为(t) 0 (i) 0(我);
0 (i) 0 (i) 1 (i)罪(t)];
确定“一个”,解决了确定系统:
W * af = (x, y)
使用反斜杠
房颤= W \ (x, y);
衡量健康的美好通过查看2-norm残余向量:
规范(W * a - (x, y))
你也可以直观地检查结果:
情节(x, y,‘*’);持有
房颤xnew = (1) + af (2) * cos (t);
ynew = af (3) + af (4) * sin (t);
情节(xnew ynew,“r”)
非线性最小二乘
- - - - - - - - - - - - - - - - - - - - - - - -
如果“t”不知道(或者即使是),你也可以确定最适合的,在最小二乘意义上,x和y的一个椭圆。也就是说,您想要执行的操作:
最小化| | f (x, y) | |_2
一个
f = ((- a (1)) ^ 2) / (2)。^ 2 +(一(3))^ 2)/ (4)。^ 2 - 1。换句话说,你是残差的平方和最小化:
min (sum (f。* f))
一个
您可以使用非线性最小二乘函数(LSQNONLIN)优化工具箱来解决这个问题。使用x和y数据从之前的问题,和初始猜测[10 10 10 10],我们可以确定椭圆的:
a0 = (10 10 10 10);
f = @ (a) ((- a (1)) ^ 2) / (2)。^ 2 +(一(3))^ 2)/ (4)。^ 2 1;
选择= optimset (“显示”,“通路”);
房颤= lsqnonlin (f, a0,[]、[]选项);
匿名函数介绍了在MATLAB 7.0 (R14)。如果您使用的是以前的版本中,您需要创建一个内联函数使用:
f =内联(x”(((1)) ^ 2) / (2)。^ 2 +(一(3))^ 2)/ (4)。^ 2 1 ',“一个”,“x”,“y”);
并通过x和y LSQNONLIN作为额外参数:
房颤= lsqnonlin (f, a0,[]、[]选项,x, y);
因为变量分母和分子,它们可以缩小和共同成长,你可以获得非常大或非常小的系数。为了避免这种情况,解决(1)和(2)(提供椭圆的中心)的平均数据的x和y,然后改变其他两个参数:
a0 = 10 [10];
选择= optimset (“显示”,“通路”);
c =(平均(x)平均(y));
f = @ (a)((得到(1))^ 2)/ (1)。^ 2 + (y-c (2)) ^ 2) / (2)。^ 2 1;
房颤= lsqnonlin (f, a0,[]、[]选项);
情节(x, y,‘*’),持有
情节(c c (1), (2),的r *)
t = 0:π/ 2 *π;
情节(c (1) + af (1) * cos (t), c (2) + af(2) *罪(t)“r”)
如果您正在使用MATLAB MATLAB 7.0之前的版本(R14),您将需要创建一个内联函数
f =内联(”((得到(1))^ 2)/ (1)。^ 2 + (y-c (2)) ^ 2) / (2)。^ 2 1 ',“一个”,“x”,“y”,“c”);
和改变LSQNONLIN命令:
房颤= lsqnonlin (f, a0,[]、[]选项,x, y, c);
如果你没有优化工具箱,您还可以使用FMINSEARCH函数来解决这个问题。FMINSEARCH不是专门喜欢LSQNONLIN处理最小二乘问题,但目标函数可以修改账户。FMINSEARCH的平方和评价必须在目标函数中执行。
f = @ (a)规范(((得到(1))^ 2)/ (1)。^ 2 + (y-c (2)) ^ 2) / (2)。^ 2 1);
房颤= fminsearch (f, a0、期权);
如果您正在使用MATLAB MATLAB 7.0之前的版本(R14),您将需要创建一个内联函数:
f =内联(“规范(((得到(1))^ 2)/ (1)。^ 2 + (y-c (2)) ^ 2) / (2)。^ 2 1),“一个”,“x”,“y”,“c”);
房颤= fminsearch (f, a0,选项,x, y, c)
7评论
约翰D 'Errico
约翰D 'Errico 2023年2月21日
移动:约翰D 'Errico 2023年2月21日
请不要发布一个问题一个答案。

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!