Curve fitting: general Parabola --> translated and rotated coordinate system

8 ビュー (過去 30 日間)
Shubham
Shubham 2013 年 6 月 28 日
編集済み: Christoph 2017 年 4 月 3 日
Hi guys, I have a set of points through which I need to fit a general parabola (to find out its vertex, angle of inclination of directrix from x-axis and parameter a). But problem is these points are not well conditioned and they are in a rotated and translated coordinate system, though not inclined set of axes(angle between axes ==90 degree). Does anyone how to do that in matlab?
Points are something like this:
x= [-5.2:.4:0,-5.2:.4:0]';
y=[4,3.6,5.2,6,6.4,6.8,6.8,7.2,7.6,10.4,10.4,11.2,11.6,11.2,3.6,3.2,2.8,2.4,2,1.6,1.2,0.4,0,-.4,-1.2,-1.2,-1.6,-1.6]';
Just do plot(x,y,'.') and you will see what I am talking about.
Any help would be much appreciated.
Thanks, Shubham

採用された回答

Matt J
Matt J 2013 年 6 月 28 日
編集済み: Matt J 2013 年 6 月 28 日
Something like this, maybe:
function [vertex,theta, a] = myfit(x,y)
xy=[x(:),y(:)].';
theta= fminsearch(@(theta) cost(theta,xy), 45);
[~,coeffs]=cost(theta,xy);
[a,b,c]=deal(coeffs(1),coeffs(2), coeffs(3));
xv=-b/2/a;
vertex=R(-theta)*[xv;polyval(coeffs,xv)];
function [Cost,coeffs,xx,yy] = cost(theta,xy)
Rxy=R(theta)*xy;
[xx,idx]=sort(Rxy(1,:));
yy=Rxy(2,idx);
[coeffs,S]=polyfit(xx,yy,2);
Cost=S.normr;
function Rmat=R(theta)
Rmat=[cosd(theta), -sind(theta); sind(theta), cosd(theta)];
  5 件のコメント
Carl Witthoft
Carl Witthoft 2016 年 10 月 17 日
I think there's a bug in the proposed solution: if the original parabola is rotated in the opposite direction, the default starting value (+45) will find a local minimum at a value roughly 90 degrees off, and not very accurately there. Probably the initial value should be selected after determining in which quadrant(s) the majority of the input dataset reside(s). The reason for this problem is that the parabola x=y^2 will yield a minimum more or less for a degenerate parabola, i.e. straight line, along the axis of the parabola.
Christoph
Christoph 2017 年 4 月 3 日
編集済み: Christoph 2017 年 4 月 3 日
First let me thank you very much for your provided code, it helped me a lot. Second this would be an idea how to draw the ellipse afterwards,
a = coeffs(1);
b = coeffs(2);
c = coeffs(3);
t=-1000:1:+1000;
xEllipse = -(a.*t.^2 + b*t + c) * sin(-theta) + cos(-theta)*t;
yEllipse = +(a.*t.^2 + b*t + c) * cos(-theta) + sin(-theta)*t;
plot(xEllipse,yEllipse,'b.');
Example Image or curve fitting, red the original points fitted with a polynomial for each side, plotted in blue.
And my question would be: If I am skipping the fminsearch for minimizing the cost function and finding the best theta angle and just use the 45° theta angle for the coefficient calculation I can also achieve good, sometimes also better cost results as while using the fminseach function. I am not able to understand this at the moment, could you provide a clarification for me. Thank you very much, Christoph

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by