How to aproximate a set of points into a polynomial parametric spline
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
I have a set of points into an xlsx file and I would like to aproximate this set of points into a parametric curve,
Curve
where
and
are in polynomial form, for example: ![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398769/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398754/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398759/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398764/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398769/image.png)
where
and
are the coefficients
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398774/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398779/image.png)
This is the spline representation in excel, and i would like to do the same thing but using matlab and also try to aproximate the curve equation.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/398784/image.png)
I know the basics of matlab, like using polyfit and polyval but does not work for this case, i tried doing an aproximation with Bezier Curve but uses the set of points as "control points" and doing so the curve does not pass through all the points.
If anyone has any advice for this problem it would be much apreciated :) Thanks
0 Kommentare
Antworten (2)
John D'Errico
am 31 Okt. 2020
Bearbeitet: John D'Errico
am 31 Okt. 2020
Download my interparc utility, which does exactly what you want, though it is not a polynomial tool, but a spline tool. Lacking your data, I can't go much further.
Can you find a parametric polynomial form? Possibly. Well, perhaps I should say I can. Do you need it? Why?
0 Kommentare
Moreno, M.
am 16 Apr. 2022
It is possible to fit a Bézier curve through your points, and then transform its control points to Bernstein basis. The following function bsplfit fits a Bezier curve bspl through a series of points:
And, the Bernstein coefficients (https://en.wikipedia.org/wiki/B%C3%A9zier_curve) are obtained as (factorial calculations can be modified if there are floating-point exception errors, for more than 170 points to fit. Note that overflows happen in the class double if there are more than 57 points to fit). This coefficients are the polynomial form of a Bézier curve. When the control points 'x' are parsed as input, the polynomial coefficients are:
function c = bez2ber(x)
n = size(x, 1) - 1;
N = prod(1 : n);
c = x;
for i = 1 : n - 1
I = prod(1 : i);
s = (-1) ^ i;
j = s * x(1, :) / I;
for k = 1 : i - 1
s = -s;
j = j + s * x(k + 1, :) / prod(1 : k) / prod(1 : i - k);
end
j = j + x(i + 1, :) / I;
c(i + 1, :) = N / prod(1 : n - i) * j;
end
s = (-1) ^ n;
j = s * x(1, :) / N;
for k = 1 : n
s = -s;
j = j + s * x(k + 1, :) / prod(1 : k) / prod(1 : n - k);
end
c(n + 1, :) = N * j;
end
Example:
% 50 points to fit with a curve of order 7
a = [0.117398673031460,0.953748444824301;0.117833137935425,0.927141442361390;0.121699059272131,0.895310554454398;0.128723944752550,0.859376538882510;0.138640166793072,0.820393660102137;0.151183200708567,0.779346475384486;0.166090110859401,0.737147055532541;0.183098284752403,0.694632640177448;0.201944415095776,0.652563727654311;0.222363729807971,0.611622599457391;0.244089469980494,0.572412279274718;0.266852615794680,0.535455926602106;0.290381860392405,0.501196664936579;0.314403831700756,0.469997844549202;0.338643562210649,0.442143739837317;0.362825206709393,0.417840681256196;0.386673007967213,0.397218621830092;0.409912510377714,0.380333138242702;0.432272021552304,0.367167866507035;0.453484321868560,0.357637372214691;0.473288621972548,0.351590455364546;0.491432768235094,0.348813889770841;0.507675696162002,0.349036597050686;0.521790131758226,0.351934255190964;0.533565540845991,0.357134341694647;0.542811326336862,0.364221611306520;0.549360273457764,0.372744008318308;0.553072242930961,0.382219013453214;0.553838112107967,0.392140425329867;0.551583964057427,0.401985576505671;0.546275524606938,0.411222984099566;0.537922847338815,0.419320434994198;0.526585246539823,0.425753505617490;0.512376478104846,0.430014516303629;0.495470168394511,0.431621920233452;0.476105491046761,0.430130126954249;0.454593091742385,0.425139760478963;0.431321260924483,0.416308351964806;0.406762354471901,0.403361466971279;0.381479462326599,0.386104267297600;0.356133325074980,0.364433507399538;0.331489498483164,0.338349965385659;0.308425765986219,0.307971308592975;0.287939799131329,0.273545393741999;0.271157065974929,0.235464001671216;0.259338987433779,0.194277006650956;0.253891341589990,0.150706980276670;0.256372915950002,0.105664229941621;0.268504407657516,0.0602622718889815;0.292177571660369,0.0158337388433344];
b = bsplfit(a, 7);
c = bez2ber(b);
d = zeros(100, 2);
t = (0 : 1 / (100 - 1) : 1)';
for i = 1 : 7
d = d + c(i, :) .* t .^ (i - 1);
end
plot(d(:, 1), d(:, 2))
hold on
plot(a(:, 1), a(:, 2), '.')
legend('Fitted Curve', 'Data Points')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/965855/image.jpeg)
1 Kommentar
Moreno, M.
am 16 Apr. 2022
https://uk.mathworks.com/matlabcentral/fileexchange/110220-polynomial-and-bezier-coefficient-conversion
Siehe auch
Kategorien
Mehr zu Splines finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!