How can I make curve form data?
Show older comments
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
Rik
on 6 Feb 2020
Do you want to fit a specific function to the data, or do you want to just have a smooth curve?
John D'Errico
on 7 Feb 2020
@ Riyadh Muttaleb
There is no reason to use an answer to make a comment. Moved:
"I want to to have a smooth curve."
Rik
on 7 Feb 2020
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?
Riyadh Muttaleb
on 7 Feb 2020
Walter Roberson
on 7 Feb 2020
After the polyfit,
xs = linspace(x(1), x(2));
ys = polyval(p, xs);
plot(xs, ys)
Riyadh Muttaleb
on 7 Feb 2020
Walter Roberson
on 7 Feb 2020
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
Answers (1)
David Goodmanson
on 8 Feb 2020
Edited: David Goodmanson
on 8 Feb 2020
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
Riyadh Muttaleb
on 9 Feb 2020
Categories
Find more on Spline Postprocessing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!