1 view (last 30 days)

Hello,

I have the following data vectors; b_reference are the independant values and Y are the dependant values.

b_reference_1 = [485.9;251.975;358.55;313.6565;85.322;193.4422;53.425;106.66;71.88;84.8653];

Y_1 =[1;1;1.31;1.31;1.89;2;1.45;1.42;1.95;1.98];

b_reference_2 = [465.786;54.6699;351.2213;197.0658;125.7026;125.4637;68.0795;72.8793;83.1339;45.9044];

Y_2 =[1;1;1.3;1.3;1.95;2;1.41;1.40;2;1.85];

b_reference_3 = [465.9498;243.369;516.6983;452.2795;81.5134;179.418;65.7858;130.3574;58.6862;69.4206];

Y_3 =[0.95;0.96;1.88;1.88;1.85;1.85;1.75;1.75;1.65;1.58];

I am trying to fit a curve through these data points and trying to find a function which will fit a curve, and also predict some Y values for some other b_reference values.

I looked at lsqcurvefit and lsqnonlin, but they both require a function and I dont have it right now. I am trying to find a function which can fit the curve and also predict Y values for some other b_reference vector.

Does anyone know...?

KSSV
on 8 Sep 2020

b_reference_1 = [485.9;251.975;358.55;313.6565;85.322;193.4422;53.425;106.66;71.88;84.8653];

Y_1 =[1;1;1.31;1.31;1.89;2;1.45;1.42;1.95;1.98];

b_reference_2 = [465.786;54.6699;351.2213;197.0658;125.7026;125.4637;68.0795;72.8793;83.1339;45.9044];

Y_2 =[1;1;1.3;1.3;1.95;2;1.41;1.40;2;1.85];

b_reference_3 = [465.9498;243.369;516.6983;452.2795;81.5134;179.418;65.7858;130.3574;58.6862;69.4206];

Y_3 =[0.95;0.96;1.88;1.88;1.85;1.85;1.75;1.75;1.65;1.58];

x = [b_reference_1 ; b_reference_2 ; b_reference_3] ;

y = [Y_1 ; Y_2 ;Y_3] ;

[x,idx] = sort(x) ;

y = y(idx) ;

% Use interp1 to get your values

xi = 50 ; % give your required values

yi = interp1(x,y,xi) ; % get values at xi

KSSV
on 8 Sep 2020

John D'Errico
on 8 Sep 2020

Edited: John D'Errico
on 8 Sep 2020

The problem is, your data appears to be highly noisy.

You can use simple linear interpolation to interpolate the data. KSSV hs shown how to do so, using interp1. No NOT use a spline to interpolate this!!!!!! It would be highly inappropriate to try a spline, since a spline will introduce large oscillations into the curve, chasing what appears to be noise.

When highly noisy data arises, it is often the simplest models that are correct. Essentially, the signal to noise ratio is very low, so the only signal we can see above the noise may be a simple linear trend. For this, polyfit will be sufficient.

plot(b_reference_1,Y_1,'o')

P1 = polyfit(b_reference_1,Y_1,1)

P1 =

-0.00187650587476397 1.90736627968731

So the fitted model is just y = P1(1)*x + P1(2). You can use the model in this form, or you can use polyval to evaluate it at any point x.

By the way, if you have the curve fitting toolbox, then I would have done:

mdl1 = fit(b_reference_1,Y_1,'poly1')

mdl1 =

Linear model Poly1:

mdl(x) = p1*x + p2

Coefficients (with 95% confidence bounds):

p1 = -0.001877 (-0.003439, -0.0003144)

p2 = 1.907 (1.525, 2.289)

And now you can use the fitted model to predict y as a function of x.

mdl1(200)

ans =

1.53206510473452

But since everybody has a copy of polyfit, I used that.

hold on

x = linspace(min(b_reference_1),max(b_reference_1),10);

plot(x,P1(1)*x + P1(2),'r-')

The alternative of linear interpolation will create this "curve", which to my eyes is hardly useful, since it appears to be chasing the noise in your data.

[b1sort,ind] = sort(b_reference_1);

y1sort = Y_1(ind);

plot(b1sort,y1sort,'o-')

I've overlaid it with the simple linear fit to show the difference. Now, I've worked with scientists who truly had noisy data they needed to track carefully.

The question is, if you measured the same data again for this instance, would that curve shape repeat? Or would you just see a simple trend again, but with different totally random noise on top? This is a good justification for replication, which will help you to learn if what appears to be noise in your data really is noise, or if the bumps are truly signal, and must be treated as such. Until you learn which is the case, you cannot know how to treat your data, but I would typically argue that until then, you need to use the simplest models available.

Opportunities for recent engineering grads.

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

Start Hunting!
## 1 Comment

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/590452-curvefit-on-vector-data-points#comment_1000843

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/590452-curvefit-on-vector-data-points#comment_1000843

Sign in to comment.