# How to aproximate a set of points into a polynomial parametric spline

11 views (last 30 days)

Show older comments

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:

where and are the coefficients

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.

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 Comments

### Answers (2)

John D'Errico
on 31 Oct 2020

Edited: John D'Errico
on 31 Oct 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 Comments

Moreno, M.
on 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')

##### 1 Comment

Moreno, M.
on 16 Apr 2022

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!