![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/351980/image.png)
ellipse fitting with matlab using fittype
52 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Johannes Tischer
am 25 Aug. 2020
Kommentiert: Matt J
am 27 Aug. 2020
Hello,
I want to use fitoptions and fittype for a staistical nonlinear least squares fitting approach. The problem is, I cant find the correct equation for my model (ellipse). I tried multiple like:
to fittype ('sqrt(b^2*(1-(x^2/a^2)))' ). In this example, the square root has to be positive. I tried to tightening the upper and lower bounderies, but it doesnt work.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/351392/image.gif)
Can someone make an example of the following form:
fo = fitoptions('Method','NonLinearLeastSquares')
ft = fittype('ellipse equation')
[myfit, gof] = fit(x_data, y_data, ft, fo)
0 Kommentare
Akzeptierte Antwort
Matt J
am 26 Aug. 2020
Bearbeitet: Matt J
am 26 Aug. 2020
You could use fit() if you convert your data to polar cooridnates. In polar coordinates, an ellipse is given by an explicit function,
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/351980/image.png)
2 Kommentare
Matt J
am 27 Aug. 2020
The problem with this method, of course, is that it assumes that the ellipse is centered at the origin. In general, that may not be true or known to be true.
Weitere Antworten (3)
Alan Stevens
am 25 Aug. 2020
Have a look here: https://uk.mathworks.com/help/curvefit/fittype.html?s_tid=srchtitle
It shows you how to construct your own function correctly.
6 Kommentare
Alan Stevens
am 26 Aug. 2020
Hmm. I'm struggling to see your basic data as elliptical. Nevertheless, the code below tries to fit them using an ellipse (I've deleted a few obvious non-elliptical outliers below; however, you could easily retain them if you wish):
load('EllipseData.mat')
% The next three lines remove outliers that are obviously not part of an
% ellipse! Delete the three lines if you wish to retain the outliers.
ix = find(data_x<-600); data_x(ix) = [];data_y(ix) = [];
iylo = find(data_y<-220); data_x(iylo) = [];data_y(iylo) = [];
iyhi = find(data_y>220); data_x(iyhi) = [];data_y(iyhi) = [];
% Set the origin at the means of the x and y data
x = data_x - mean(data_x);
y = data_y - mean(data_y);
% "Linearise" and do a straightforward least-squares fit
N = length(x);
X = x.^2; Y = y.^2;
M = [N -sum(X); sum(X) -sum(X.^2)];
V = [sum(Y); sum(X.*Y)];
AB = M\V; % AB = [A; B]
% Extract constants
A = AB(1);
B = AB(2);
% Create ellipse semimajor axes from "linear" constants
a = sqrt(A/B);
b = sqrt(A);
% Separate upper and lower halves of "elliptical" values.
xhi = x(x>=0); xlo = x(x<0);
yhi = b*sqrt(1 - (xhi/a).^2);
ylo = -b*sqrt(1 - (xlo/a).^2);
% Put them back together and shift the origin back
xf = [xhi xlo] + mean(data_x);
yf = [yhi ylo] + mean(data_y);
% Plot and compare Data and fit.
plot(data_x,data_y,'o',x,yf,'*'), grid
xlabel('x'),ylabel('y')
legend('Data','"Elliptical" fit')
This is the result:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/351968/image.jpeg)
Image Analyst
am 26 Aug. 2020
For what it's worth, attached is a paper that describes the method.
Least Squares orthogonal distances fitting of circle, sphere, ellipse, hyperbola, and parabola.pdf
0 Kommentare
Siehe auch
Kategorien
Mehr zu Linear and Nonlinear Regression finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!