How can I make curve form data?
조회 수: 3 (최근 30일)
이전 댓글 표시
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
Walter Roberson
2020년 2월 7일
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
답변 (1개)
David Goodmanson
2020년 2월 8일
편집: David Goodmanson
2020년 2월 8일
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
참고 항목
카테고리
Help Center 및 File Exchange에서 Curve Fitting Toolbox에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!