Fitting implicit function with data

조회 수: 10 (최근 30일)
Mohsen
Mohsen 2016년 4월 7일
편집: Tien Tran 2016년 4월 23일
Dear all
I want to fit an implicit function with data I have. The function is in terms of X and Y(2 variables) and has 8 constants (x(1)..x(8)) to be found.
f=x(1).*(abs(((x(2).*(X-x(3)))+x(4).*(Y-x(5))))).^(x(6))+x(7).*(abs((X-x(3)-(Y-x(5))))).^(x(6))-x(8).^(x(6));
and my data are:
X = [0 0.41 1.2 2.01 3.5 5 7.1 10.1 12.06 14.2 17.1 17.4 17.9 17.1 14.2 10.1 7.1 5 3.5 2.01 0 -0.8 -3.5 -5.4 -9.5 -12.1 -15.5 -18.5 -22.3 -25.5 -26.7 -27.3 -26.7 -22.5 -18.8 -15.5 -12.1 -9.5 -5.4 -1.7 0];
Y = [17.9 17.7 17.5 18.3 17.87 17.48 16.74 16.7 15.8 15.3 9.02 8.6 0 -4.6 -13.8 -24.1 -26.9 -26.7 -26.5 -26.2 -27.3 -27.9 -26.9 -25.2 -25.1 -22.8 -20.2 -20.1 -10.6 -4.6 -0.9 0 4 8 10.5 11.3 13.8 16.2 17 17.6 17.9];
Can anyone help me to find the constants?
  댓글 수: 1
Mohsen
Mohsen 2016년 4월 18일
편집: Walter Roberson 2016년 4월 22일
I did as follows but needs to be more accurate, How can I pass it through specific points?
function obj= fit_simp(x,X,Y)
X = [0 0.41 1.2 2.01 3.5 5 7.1 10.1 12.06 14.2 17.4 17.9 17.1 14.2 10.1 7.1 5 3.5 2.01 0 -0.8 -3.5 -5.4 -9.5 -12.1 -15.5 -18.5 -22.3 -25.5 -26.7 -27.3 -26.7 -22.5 -18.8 -15.5 -12.1 -9.5 -5.4 -1.7 0];
Y = [17.9 17.7 17.5 18.3 17.87 17.48 16.74 16 15 13.5 8.6 0 -4.6 -13.8 -24.1 -26.9 -26.7 -26.5 -26.2 -27.3 -27.5 -26.7 -26 -25.1 -22.8 -20.2 -17 -10.6 -4.6 -0.9 0 4 8 10.5 11.3 13.8 16.2 17 17.6 17.9];
obj = @(x) x(1).*(abs(((x(2).*(X-x(3)))+x(4).*(Y-x(5))))).^(x(6))+x(7).*(abs((X-x(3)-(Y-x(5))))).^(x(6))-x(8).^(x(6));
x0=[0.001 0.1880 -1.44 0.108 -4 9.984 2.9064e-10 2.1175];
options = optimset('Display','iter','TolFun',1e-8)
[x,resnorm,residual,exitflag,output]=lsqnonlin(obj,x0,[-1],[13],options)
obj_new= @(X,Y) x(1).*(abs(((x(2).*(X-x(3)))+x(4).*(Y-x(5))))).^(x(6))+x(7).*(abs((X-x(3)-(Y-x(5))))).^(x(6))-x(8).^(x(6))
scatter(X,Y)
hold on
ezplot(obj_new,[-30,30,-30,30])

댓글을 달려면 로그인하십시오.

채택된 답변

John D'Errico
John D'Errico 2016년 4월 19일
Sorry, but it seems a foolish goal to fit that curve with your function. There are far easier ways to accomplish a curve fit.
Some basic rules of curve fitting:
- If you are using a complex model that was suggested to you by a friend/colleague/boss/etc because it was able to fit their data, or they know of someone who used that model, then you are probably using the wrong model. Consider a spline instead.
- If you have no physical reasons for having chosen the model you are using, EXCEPT that it MIGHT fit IF you throw in enough terms, then you are probably using the wrong model. Consider a spline instead.
- If you are using a complicated model where the parameters have no meaning to you in context, so the resulting nonlinear fit does not converge (possibly) because you cannot guess good starting values, then you are using the wrong model. Consider a spline instead.
Were it my choice, I would just convert to polar coordinates, then fit r(theta) using a tool like a least squares spline model, designed to be a periodic function.
theta = atan2(Y,X);
[thetas,tags] = sort(theta);
r = sqrt(X.^2 + Y.^2);
rs = r(tags);
For example, using my SLM toolbox,I might try this:
slm = slmengine(thetas,rs,'plot','on','endconditions','periodic','knots',15);
thetahat = linspace(-pi,pi,200);
rhat = slmeval(thetahat,slm);
xhat = rhat.*cos(thetahat);
yhat = rhat.*sin(thetahat);
plot(X,Y,'-o',xhat,yhat,'r:')
grid on
  댓글 수: 3
John D'Errico
John D'Errico 2016년 4월 22일
So then fit the model. Wanting it to be more accurate is a waste of time though. The model will be as accurate as it is. If it is not sufficiently accurate, then the model is not a good approximation to the system that produced that data, or you need to get better data. In some cases, you may need to get better starting values.
Forcing the model to pass through specific points (which will take a fair amount of effort here) will just make the model fit worse overall, not better.
Tien Tran
Tien Tran 2016년 4월 23일
편집: Tien Tran 2016년 4월 23일
Hi John
How to get constants and the function of spline?

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with Curve Fitting Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by