Non-linear curvefitting in MATLAB

Hey guys! I'm some given some huge set of data. I am trying to fit a set of data into a model of functional form as described below:
z(x, y) = c0. * x^0 * y^2 + c1. * x^1 * y^1 + c2. * x^2 *y^1
where c0, c1, c2 are the coefficients to be found.
My attempt is to use the nlinfit function to solve it.
So far I have tried:
% i have just added a small portion of my data
a= [ 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,0.011, 0.011, 0.011, 0.011, 0.011, 0.011, 0.011, 0.011, 0.011, 0.011];
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
y = x.* a;
z = [ -.304860225, .170315374, .343019354, .370114906, .373180536, .36719579, .363397853, .363417755, .366962504, .379710865, -.304860225, .170315374, .343019354, .370114906, .373180536, .36719579, .363397853, .363417755, .366962504, .379710865];
model= c0.* (x(:).^0).* (y(:).^2) + c1.* (x(:).^1).* (y(:).^1) + c2.* (x(:).^2).* (y(:).^0)
[c0 c1 c2] = [0.001 0.007 0.788]
C= nlinfit( [x,y], z, 'model', [0.001 0.007 0.788])
% Here x,y are independent variables and z is dependent variable.
How can one set these initial values for the coefficients? I'm not getting how to pass the arguments. I'm getting this error "??? Undefined function or variable 'c0' ". Please help!!!
Thanks in advance, Syeda

 Respuesta aceptada

Greg Heath
Greg Heath el 9 de Oct. de 2013
The solution is trivial because you have a linear system of equations for the 3 coefficients
A*c = b;
c = A\b
Hope this helps
Thank you for formally accepting my answer
Greg

3 comentarios

Syeda
Syeda el 9 de Oct. de 2013
Thankyou Greg! Now, if I put these three co-efficients back into my proposed model. and re-check for random x,y values again. It gives error:
x=1;
y=0.001;
z = 0 * x^0 * y^2 + 0.0000 * x^1 * y^1 + 0.0056 * x^0 * y^2
Any advice?
Matt J
Matt J el 9 de Oct. de 2013
Editada: Matt J el 9 de Oct. de 2013
It's really not ideal to fit polynomials bluntly using backslash. That's why MATLAB offers the more robust POLYFIT and why the File Exchange offers a variety of polynomial fitters.
Syeda
Syeda el 9 de Oct. de 2013
yes!! My results are not accurate by using this method.

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 8 de Oct. de 2013

1 voto

Using a nonlinear solver for a linear fitting problem seems like the wrong way to go. A better option might be

10 comentarios

Syeda
Syeda el 8 de Oct. de 2013
Thankyou for replying Matt.
I tried John D'Errico's polyfitn()as well. But, how can I fit my proposed model in this function?
model = [ ( x(:).^0 ).*( y(:).^2 ), ( x(:).^1 ).*( y(:).^1 ), ( x(:).^2 ).*( y(:).^0 ) ]
p = polyfitn([x,y], z, 'model');
It gives an error:
??? Error using ==> polyfitn at 137 indepvar and depvar are of inconsistent sizes.
Matt J
Matt J el 8 de Oct. de 2013
I've never used the tool myself. Perhaps you need to columnize z,
p = polyfitn([x,y], z(:), 'model');
Syeda
Syeda el 8 de Oct. de 2013
It still gives the same error.
Anyways, thankyou for replying!!
Matt J
Matt J el 8 de Oct. de 2013
Maybe this
p = polyfitn([x(:),y(:)], z(:), {'y', 'x*y', 'x^2*y'});
Syeda
Syeda el 8 de Oct. de 2013
Editada: Syeda el 8 de Oct. de 2013
This works for me
p = polyfitn([x(:),y(:)], z(:), 'model')
But, it is giving only one coefficient. I want 3 coefficients..
Syeda
Syeda el 8 de Oct. de 2013
Editada: Syeda el 8 de Oct. de 2013
I tried both equations, but it gives error!
p = polyfitn([x(:),y(:)], z(:), {'y', 'x*y', 'x^2*y'});
p = polyfitn([x(:),y(:)], z(:), {'x*y^2', 'x*y', 'x^2*y'});
??? Error using ==> polyfitn>parsemodel at 319 Variable is not a valid name: '2'
Error in ==> polyfitn at 151 [modelterms,varlist] = parsemodel(modelterms,p);
Matt J
Matt J el 8 de Oct. de 2013
I can't see why the syntax
p = polyfitn([x(:),y(:)], z(:), 'model')
would work. And it is obviously not working, since it gives you the wrong number of coefficients.
Syeda
Syeda el 8 de Oct. de 2013
yes! it is not working as well. I guess there is some syntax problem in my code.
Matt J
Matt J el 8 de Oct. de 2013
Dunno. Instead of 'x^2*y' maybe you should try either 'x*x*y' or 'y*x^2'.
Syeda
Syeda el 9 de Oct. de 2013
No, it still gives error.
??? Undefined function or method 'polyfitn' for input arguments of type 'cell'

Iniciar sesión para comentar.

Categorías

Preguntada:

el 8 de Oct. de 2013

Comentada:

el 9 de Oct. de 2013

Community Treasure Hunt

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

Start Hunting!

Translated by