Week 5 - Curve fitting
AIM :-
To write code to perform curve fitting in python.
OBJECTIVE :-
- To write codes to fit a linear and cubic polynomial for the Cp data.
- To plot the linear and cubic fit curve along with the raw data points.
- Tp measure the fitness characteristics for both the curves
THEORY :-
Curve fitting is that the way we model or represent data by assigning the simplest fit function(curve) together with the complete range. ideally, it'll capture the trend within the data series which will behave within the future.
Type of curve fitting including:
Interpolation, Where you discover a function that's exact to the info points. Since this assumes no measurement error, it's limited application to real-life scenarios.
Smoothing is after we find a function that's an approximate acceptable the information points, but we give room for error and that we allow our actual points to be near, but not necessarily on the line; given the error is minimized overall.
Linear and Polynomial Curve fitting
* Linear curve fitting, or rectilinear regression, is when the information is acceptable a line. Although there may well be some curve to your data, a string line provides an inexpensive enough suitable make predictions.
* Polynomial curve fitting is once we fit our data to the graph of a polynomial function. the identical least-squares method may be wont to find the polynomial, of a given degree, that includes a minimum total error.
STEP :-
1. At first, necessary modules such as math,matplotlib,Numpy,scipy are imported to perform their respective functions.
2. Two functions are defined which return linear and cubic equations.
3. The following data is loaded into Python by placing it in the right directory and a function read_file is created. For loop is used to run each line by using 'open' command with 'r' to read it.
4. From the data obtained, two individual column matrices of temperature and specific heat are derived.
5. For curve fitting, 'popt' and 'pcov' are used as output fostoring parameters obtained by 'curve_fit' command which takes input as the required function(linear or cubic) , temperature, and Cp. Now, another variable named 'fit_cp' stores the new values of Cp calculated by using temperature array.
6. Plots of both raw dataset and predicted dataset are made and compared to find fitness characteristics for both the curves for both linear and cubic polynomial.
CODE :-
import math
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
# Curve fit function
# Linear function
def function_0(t,a,b):
return a*t + b
# Cubic function
def function_2(t,a,b,c,d):
return a*pow(t,3) + b*pow(t,2) + c*t +d
# Reading thermodynamic data file
def read_file():
temperature = []
cp = []
for line in open('data','r'):
values = line.split(',')
temperature.append(float(values[0]))
cp.append(float(values[1]))
return [temperature , cp]
# Main Program
temperature , cp = read_file()
popt, pcov = curve_fit(function_0,temperature,cp)
fit_cp_l = function_0(np.array(temperature), *popt)
plt.figure(1)
plt.plot(temperature,cp,'k--')
plt.plot(temperature,fit_cp_l,color='red',linewidth = 1)
plt.legend(['Actual data','Curve fit'])
plt.xlabel('Temperature (K)')
plt.ylabel('Cp')
plt.title('Linear Curve fitting')
plt.show()
popt, pcov = curve_fit(function_2,temperature,cp)
fit_cp_c = function_2(np.array(temperature), *popt)
plt.figure(3)
plt.plot(temperature,cp,'k--')
plt.plot(temperature,fit_cp_c,color='red',linewidth = 1)
plt.legend(['Actual data','Curve fit'])
plt.xlabel('Temperature (K)')
plt.ylabel('Cp')
plt.title('Cubic Curve fitting')
plt.show()
'''
Measuring the fitness characetristics of the curves
SSE (sum of error squared)
SSR (sum of squares of the regression)
SST = SSE + SSR
R^2 = SSR/SST
RMSE = (SSE/l)^0.5
Finding mean of Cp data
mean = ( sum of all elements)/(total number of elements)'''
s = np.sum(cp)
l = np.size(cp)
m = s/l
print('Mean of all cp :',m)
print('')
# For Linear curve fit
linear_sse = 0
linear_ssr = 0
for i in range(l):
linear_error = abs((np.sum((cp[i] - fit_cp_l[i]))))
linear_sse = linear_sse+pow(linear_error,2)
linear_ssr = linear_ssr+ np.sum(pow((fit_cp_l[i] - m),2))
linear_sst = linear_sse + linear_ssr
print('linear_sst :',linear_sst)
linear_R2 = linear_ssr/linear_sst
print('linear_R2 :',linear_R2)
linear_rmse = pow((linear_sse/l),0.5)
print('linear_RMSE :',linear_rmse)
print('')
# For Cubic curve fit
cubic_sse = 0
cubic_ssr = 0
for j in range(l):
cubic_error = abs(np.sum((cp[i] - fit_cp_c[i])))
cubic_sse = cubic_sse+(pow(cubic_error,2))
cubic_ssr = cubic_ssr+np.sum(pow((fit_cp_c[i] - m),2))
cubic_sst = cubic_sse + cubic_ssr
print('cubic_sst :',cubic_sst)
cubic_R2= cubic_ssr/cubic_sst
print('cubic_R2 :',cubic_R2)
cubic_rmse = pow((cubic_sse/l),0.5)
print('cubic_RMSE :',cubic_rmse)
ERROR :-
- The following errors occured-

- This was caused by the statement "for i in l:" because the
forstatement operates on iterable data such as a string, list, tuple, or other object container. It was rectified by providing range to it. The range function is a great way to loop for a specified number of times.

- The error says the list is not callable because I was trying to access/use a python list but using parenthesis for it. Parenthesis are used to call a function and because a list is not a function. To access/use a python list, you should use square brackets.
RESULTS :-
Output -

Linear curve fitting -

Cubic curve fitting -

After solving this we can answer the given questions :
Answers :
Q. What do popt and pcov mean?
Ans. 'popt' represents the matrix that stores and extracts the coefficients for the fitting functions per the overall equations defined.
popt : array, Optimal values for the parameters in order that the sum of the squared residuals of f(xdata, *popt) - ydata is minimized 'pcov' represents the matrix which stores the estimated values of covariance of the coefficients of the above. The diagonal elements of this matrix also represent the variance of those coefficients
pcov : 2d array
The estimated covariance of popt. The diagonals provide the variance of the parameter estimate. To compute one variance deviation errors on the parameters use perr = np.sqrt(np.diag(pcov)).How the sigma parameter affects the estimated covariance depends on absolute_sigma argument, as if True, sigma is employed in an absolute sense and therefore the estimated parameter covariance pcov reflects these absolute values. If False, only the relative magnitudes of the sigma values matter. The returned parameter covariance matrix pcov is predicted on scaling sigma by a constant factor.
Q. What does np.array(temperature) do?
Ans This command converts each value of temperature within the data file into an array using the NumPy module.
Q. What does the * in *popt mean?
Ans '*' , '*popt' indicates and returns each coefficient stored in popt array.
Q. What needs to be done in order to make the curve fit perfectly?
Ans If we increase the order of the polynomial, the error produced are less and curve fit perfectly. On increasing the order of the polynomial the worth of are going to be near 1 and is assumed to an ideal fit.