Where does the diffrence beetween lsqcurvefit and data come from?

Hello,
I am using lsqcurvefit to determine the best fitting circle (in terms of the center point) with known tangent point and radius to a certain number of points. The code works fine but as shown in the screenshot below, one can see that there is a gap beetween the data and the fitted values.
Is the error located in the code or in the function?
Problem:
Code:
load('data-ask.mat')
% Gleichung 1: Tangentengleichung mit wt als Tangentenpunkt und bekanntem Radius
fun =@(x1,xdata1)((x1(1).^2-x1(1).*gp(1)-x1(1).*xdata1+x1(2).^2-x1(2).*gp(2)+gp(1).*xdata1-gr.^2).*((x1(2)-gp(2)).^-1));
u = [mean(xdata1) mean(ydata1)+gr];
options=optimoptions(@lsqcurvefit,'StepTolerance',1e-32);
lb=[0 min(ydata1)];
ub=[inf gp(2)+gr];
x1 = lsqcurvefit(fun,u,xdata1,ydata1,lb,ub,options);
%figure
figure()
h(1)=plotCircle(x1(1,1),x1(1,2),gr);
h(1).Marker='*'
h(1).Color='black';
hold on;axis equal; grid on
s(2)=scatter(xdata1,ydata1,'red','s');
xlim([min(xdata1) max(xdata1)])
ylim([min(ydata1) max(ydata1)])
l=legend({'Circle-Fit' 'Data'})
l.Location='northoutside'

 Respuesta aceptada

Torsten
Torsten el 31 de Mzo. de 2022
Editada: Torsten el 31 de Mzo. de 2022
Does this answer your question ?
1st code (free radius):
load('data-ask.mat')
fun =@(x)(xdata1-x(1)).^2+(ydata1-x(2)).^2 - x(3)^2;
u = [mean(xdata1) mean(ydata1) 5];
x1 = lsqnonlin(fun,u);
t = linspace((3/2-1/16)*pi,(3/2+3/16)*pi,100)';
circsx = x1(3)*cos(t) + x1(1);
circsy = x1(3)*sin(t) + x1(2);
plot(circsx,circsy);
h(1).Marker='*'
h(1).Color='black';
hold on;axis equal; grid on
s(2)=scatter(xdata1,ydata1);%,'red','s');
l=legend({'Circle-Fit' 'Data'})
l.Location='northoutside'
2nd code (radius fixed):
load('data-ask.mat')
fun =@(x)(xdata1-x(1)).^2+(ydata1-x(2)).^2 - gr^2;
u = [mean(xdata1) mean(ydata1)];
x1 = lsqnonlin(fun,u);
t = linspace((3/2-1/16)*pi,(3/2+3/16)*pi,100)';
circsx = gr*cos(t) + x1(1);
circsy = gr*sin(t) + x1(2);
plot(circsx,circsy);
h(1).Marker='*'
h(1).Color='black';
hold on;axis equal; grid on
s(2)=scatter(xdata1,ydata1);%,'red','s');
l=legend({'Circle-Fit' 'Data'})
l.Location='northoutside'
3rd code: (radius and tangent fixed)
Your code

2 comentarios

Thanks for this alternative solution to my Problem. Unfortunately it does not consider a fixed radius. I have slightly modified your answer and checked it. It's getting better but doesn't solve completely. I have to find out if this a result of setting the radius fixed. Your code helped anways.
Torsten
Torsten el 31 de Mzo. de 2022
Editada: Torsten el 31 de Mzo. de 2022
I included the code for fixed radius.
It's clear that the fit becomes worse the more restrictions you impose.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Productos

Versión

R2022a

Preguntada:

el 31 de Mzo. de 2022

Editada:

el 31 de Mzo. de 2022

Community Treasure Hunt

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

Start Hunting!

Translated by