How can I make curve form data?

Hi All,
I would like to make a convex curve from this (x,y) data that I have. The curve must connect the first and last points of y.
x= 7000,7050,7100,7150,7200
y= -92.9,-125.6,-158.5,-190.9,-223.5
The help would be apprecited,
Thanks in advance,
Riyadh

7 Comments

Do you want to fit a specific function to the data, or do you want to just have a smooth curve?
@ Riyadh Muttaleb
There is no reason to use an answer to make a comment. Moved:
"I want to to have a smooth curve."
Your data is already a smooth curve:
p=polyfit(x,y,2);
polyval(p,x)-y
polyfit returns a warning and the second line shows the deviation from the fit is minimal.
So what is your goal?
My data is a smooth line! I want curve connect the first and last points.
After the polyfit,
xs = linspace(x(1), x(2));
ys = polyval(p, xs);
plot(xs, ys)
I got a straight line!
No you didn't -- you get a curved line that was sampled over a small enough region that it looked flat.
If you look at diff(y) you will see that the differences between adjacent y values is approximately constant, which is what you would expect for a straight line.
If you fit as a polynomial of degree 2, then the minimum of that polynomial is at 23425 and the zero crossings are at 6859 and 39990

Sign in to comment.

Answers (1)

Riyadh;
The differences from a straight line are small, so it make sense to look at that difference.
x = [7000,7050,7100,7150,7200]'
y = [-92.9,-125.6,-158.5,-190.9,-223.5]'
ylin = linspace(y(1),y(end),5)'
ydiff = y - ylin;
figure(1)
plot(x,ydiff,'o-');
grid on
The three differences are all negative, so absent any other information it can just be fit with a parabola that is zero at the end points. This will lead to a curve that is convex downwards.
p = (x-x(1)).*(x-x(end)); % parabola, zero at end points
c = p\ydiff; % least squares fit
xnew = linspace(7000,7200,500); % grid with more points
ydiffnew = c*(xnew-x(1)).*(xnew-x(end)); % fitted parabola, zero at end points
figure(2)
plot(x,ydiff,'o-',xnew,ydiffnew)
grid on
Then the final result ynew is this plus the linear line
slope = (y(end)-y(1))/(x(end)-x(1));
ylinnew = y(1) + slope*(xnew-x(1));
ynew = ylinnew + ydiffnew;
figure(3)
plot(x,y,'o-',xnew,ynew)
grid on

1 Comment

Thank you so much for your great work, However, the seconed part the curve is very good while in the third part it looks like a straight line!

Sign in to comment.

Categories

Asked:

on 6 Feb 2020

Commented:

on 9 Feb 2020

Community Treasure Hunt

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

Start Hunting!