In this post I will be showing you how to write a code that fits the data-points to an exponential function, like:

where, A & B are some constants that we will determine.

We will be using the Least Squares Method (also known as Chi square minimization) to achieve this.

Let’s say you have * n* data points: and .

Then the fitted function can be calculated by minimizing the error(difference between the actual and fitted point):

minimize:

where

But this will give us alot of problem as doing that is not easy and a topic for another post, and very mathematical.

To cut the long story short, what we do instead is, we apply a trick, that is, we take the logarithm of eq(1) to get rid of the exponential

and applying a quick change of variables as :

we get,

which is exactly the equation of a straight line, and therefore, it becomes a problem of linear fitting. And we have already seen how to write a Linear Fitting program. We will use the following formulae from there:

You can refer to this link for a detailed proof.

From ‘c’ we calculate the value of A using:

So you will need to have some code for the user two enter the data-points or you could add them manually by initializing the arrays.

Once you have the data-points stored in the **x** and **y** arrays,

you can use the following code to find out the value of ‘**A**‘ and ‘**B**‘, which are the coefficients of exponential fitting funtion.

### CODE:

/****************************************************** *************Chi-square fitting************** Exponential Fitting: y=Ae^bx ******************************************************/ #include<stdio.h> #include<math.h> /***** Function that calculates and returns the slope of the best fit line Parameters: N: no. of data-points x[N]: array containing the x-axis points y[N]: array containing the corresponding y-axis points *****/ double slope(int N, double x[N], double y[N]){ double m; int i; double sumXY=0; double sumX=0; double sumX2=0; double sumY=0; for(i=0;i<N;i++){ sumXY=sumXY+x[i]*y[i]; sumX=sumX+x[i]; sumY=sumY+y[i]; sumX2=sumX2+x[i]*x[i]; } sumXY=sumXY/N; sumX=sumX/N; sumY=sumY/N; sumX2=sumX2/N; m=(sumXY-sumX*sumY)/(sumX2-sumX*sumX); return m; } /***** Function that calculates and returns the intercept of the best fit line Parameters: N: no. of data-points x[N]: array containing the x-axis points y[N]: array containing the corresponding y-axis points *****/ double intercept(int N, double x[N], double y[N]){ double c; int i; double sumXY=0; double sumX=0; double sumX2=0; double sumY=0; for(i=0;i<N;i++){ sumXY=sumXY+x[i]*y[i]; sumX=sumX+x[i]; sumY=sumY+y[i]; sumX2=sumX2+x[i]*x[i]; } sumXY=sumXY/N; sumX=sumX/N; sumY=sumY/N; sumX2=sumX2/N; c=(sumX2*sumY-sumXY*sumX)/(sumX2-sumX*sumX); return c; } main(){ int N; printf("Enter the no. of data-points:\n"); scanf("%d",&N); double x[N], y[N], Y[N]; printf("Enter the x-axis values:\n"); int i; for(i=0;i<N;i++){ scanf("%lf",&x[i]); } printf("Enter the y-axis values:\n"); for(i=0;i<N;i++){ scanf("%lf",&y[i]); } for(i=0;i<N;i++){ Y[i]=log(y[i]); } printf("The exponential fit is given by the equation:\n"); double m=slope(N,x,Y); double c=intercept(N,x,Y); double A, b; //y=Ae^bx A=exp(c); b=m; printf("y = %lf e^(%lf)x",A,b); }

### OUTPUT:

So that’s it.

You now have the value of ‘A’ and ‘B’ and thus the exponential fit:

**You can refer to the following links for more info:**

Exponential Fitting – Lab Write-Up

Exponential Fitting – C++ Program

Exponential Fitting – Scilab Code

Curve Fit Tools – Android App (using the above code)

Curve Fit Tools – Documentation

Curve Fit Tools – Play Store

Curve Fit Tools – GitHub Repository

Curve Fitters – Scilab Toolbox

**Hope you found this post useful.
If you have any questions/doubts drop them in the comments section down below.**

Ph.D. researcher at Friedrich-Schiller University Jena, Germany. I’m a physicist specializing in computational material science. 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.