# Import modules
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# Read file function
def read_file(fileName):
# Initialize temperature and cp arrays
temperature,cp = [],[]
# Open file
with open(fileName,\\\'r\\\') as data:
for line in data.readlines():
values = list(map(float,line.strip().split(\\\',\\\')))
temperature.append(values[0])
cp.append(values[1])
return temperature,cp
# Linear Curve fit function
def linearFunc(t,a,b):
return a*t + b
# Cubic Curve fit function
def cubicFunc(t,a,b,c,d):
return a*pow(t,3)+b*pow(t,2)+c*t+d
# Fit function
def fitCurve(fitFunction,temperature,cp):
popt,pcov = curve_fit(fitFunction,temperature,cp)
fit_cp = fitFunction(np.array(temperature),*popt)
return fit_cp
# Get sum of squares of residuals
def sumSquareResiduals(cp,fit_cp):
return np.sum(pow(np.array(cp)-np.array(fit_cp),2))
# Plot curves
def plotCurves(temperature,cp):
plt.plot(temperature,cp,c=\\\'b\\\',linewidth=3,label=\\\'original data\\\')
cp_fit_linear = fitCurve(linearFunc,temperature,cp)
plt.plot(temperature,cp_fit_linear,c=\\\'r\\\',linewidth=3,label=\\\'linear fit\\\')
cp_fit_cubic = fitCurve(cubicFunc,temperature,cp)
plt.plot(temperature,cp_fit_cubic,c=\\\'g\\\',linewidth=3,label=\\\'cubic fit\\\')
# Compare residuals
def compareResiduals(temperature,cp):
cp_fit_linear = fitCurve(linearFunc,temperature,cp)
cp_fit_cubic = fitCurve(cubicFunc,temperature,cp)
residualSquareSum_linear = sumSquareResiduals(cp,cp_fit_linear)
residualSquareSum_cubic = sumSquareResiduals(cp,cp_fit_cubic)
print(\\\"Sum of squares of residuals:\\\")
print(\\\"For linear fit: {}\\\".format(residualSquareSum_linear))
print(\\\"For cubic fit: {}\\\".format(residualSquareSum_cubic))
def main():
fileName=\\\"data\\\"
temperature, cp = read_file(fileName)
plt.figure(figsize=(15,10))
plotCurves(temperature,cp)
plt.legend(loc=\\\'best\\\')
plt.xlabel(\\\"Temperature\\\")
plt.ylabel(\\\'Cp\\\')
plt.savefig(\\\"DataFit.png\\\")
compareResiduals(temperature,cp)
if __name__ ==\\\"__main__\\\":
main()