I have written a code that will calculate the coefficients of the polynomial that will best fit a given set of data-points.

The procedure is based on least square approximation, which, in simple words,works by finding a polynomial that is at a minimum distance possible from all the points.

Let’s say you have the x-axis points stored in a matrix,* ‘x’* & the y-axis points stored in a matrix

*and you want to find a polnomial of*

**‘y’***degree that best fits the data. Then the following code returns the values of the coefficients of the best fit-polynomial.*

**n-th****CODE:**

//Polynomial Fitting //To fit a given set of data points to an n-degree polynomial //Written By: Manas Sharma (www.bragitoff.com) funcprot(0); function A=npolyfit(x,y,n) format(6); N=size(x); if N(2)>N(1) then N=N(2) else N=N(1); end X(1)=N; for i=1:2*n X(i+1)=0; for j=1:N X(i+1)=X(i+1)+x(j)^i; end end for i=1:n+1 for j=1:n+1 B(i,j)=X(i+j-1) end end disp(B); for i=0:n C(i+1)=0; for j=1:N C(i+1)=C(i+1)+(x(j)^i)*y(j); end end C=-C; disp(C); A=linsolve(B,C); endfunction

**Sample Demo**:

x=[1,2,3,4,5]; y=[1,8,27,64,125]; a=npolyfit(x,y,3)

In the above code I have a set of data-points for the *x-axis being stored in the matrix ‘x’*, and the *y-axis points in the matrix ‘y’.* As you can clearly see that the equation of y should be x^3 as it is just the cube of the x-axis points, so I have given the third argument n=3 when I called the function * npolyfit*.

**Output:**

a =

0.000

– 0.000

0.000

1.

The output is a matrix whose fourth element is 1 while the first three are 0. Since the (n+1)th element of the matrix corresponds to the coefficient of x^n(where n goes from 0 to n), therefore we get the coefficient of x^3 to be 1.

Hence, we know that the polynomial which best fits the data is x^3+0*x^2+0*x^1+0*x^0.

The last example was a little bit straight-forward. Now let’s try something a little more tricky.

x=[1,2,3,4,5]; y=[1.6,7.5,24.6,66,130]; a=npolyfit(x,y,3)

Now this time we can’t exactly calculate the polynomial ourselves, but by intuition we can tell that the best fit would be a polynomial of 3rd degree. Why? Because if you compare the data-points with the previous example then you can see that they are only just a little bit off.

**Output:**

a =

5.64

– 6.264

1.486

0.95

In case you are wondering if it’s correct or not or maybe you want to plot it then you can define a function f(x) which is a polynomial of degree 3 with the above coefficients:

deff('g=f(x)','g=0.95*(x^3)+1.486*(x^2)-6.264*(x)+5.64')

Then create a matrix ‘yfit’ which stores the fitted points:

yfit=f(x);

And then plot the original/observed data-points as markers/dots:

plot2d(x,y,-5)

and then plot the fitted data points as red line:

plot2d(x,yfit,5)

**Output:**

I have created a module in SCILAB which contains the above macro, and once installed can be used as an in-built function. You can download it from here: https://atoms.scilab.org/toolboxes/curvefit

Leave your questions/suggestion/corrections in the comments section down below and I’ll get back to you soon.

I’m a physicist specializing in computational material science with a PhD in Physics from Friedrich-Schiller University Jena, Germany. I write efficient codes for simulating light-matter interactions at atomic scales. I like to develop Physics, DFT, and Machine Learning related apps and software from time to time. Can code in most of the popular languages. I like to share my knowledge in Physics and applications using this Blog and a YouTube channel.

Thank you. Excellent

polynomial fitting