mbj
mbj

Reputation: 107

opt.curve_fit with only one parameter

I'm having trouble fitting a curve with only one parameter using scipy.opt.curve_fit:

import scipy.optimize as opt
import numpy as np

def func(T):
    return 76.881324*np.exp((-L)/(8.314*T))

best_params, cov_matrix = opt.curve_fit(func, xdata = x, ydata = y, p0=[])

I have arrays of values, x (T in the below eq) and y (P) that I'm trying to fit to the equation enter image description here

but it seems it wants func() to have more than one argument. How do I fix this?

Upvotes: 1

Views: 1234

Answers (1)

James Phillips
James Phillips

Reputation: 4657

Here is a graphical Python fitter using your equation with some test data. Replace the example data with your own and you should be done.

plot

import numpy, scipy, matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

xData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.0, 6.6, 7.7])
yData = numpy.array([1.1, 20.2, 30.3, 60.4, 50.0, 60.6, 70.7])


def func(T, L):
    return 76.881324*numpy.exp((-L)/(8.314*T))


# all "1.0" is the same as the scipy defaults
initialParameters = numpy.array([1.0])

# curve fit the test data
fittedParameters, pcov = curve_fit(func, xData, yData, initialParameters)

modelPredictions = func(xData, *fittedParameters) 

absError = modelPredictions - yData

SE = numpy.square(absError) # squared errors
MSE = numpy.mean(SE) # mean squared errors
RMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSE
Rsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))

print('Parameters:', fittedParameters)
print('RMSE:', RMSE)
print('R-squared:', Rsquared)

print()


##########################################################
# graphics output section
def ModelAndScatterPlot(graphWidth, graphHeight):
    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
    axes = f.add_subplot(111)

    # first the raw data as a scatter plot
    axes.plot(xData, yData,  'D')

    # create data for the fitted equation plot
    xModel = numpy.linspace(min(xData), max(xData))
    yModel = func(xModel, *fittedParameters)

    # now the model as a line plot
    axes.plot(xModel, yModel)

    axes.set_xlabel('X Data') # X axis data label
    axes.set_ylabel('Y Data') # Y axis data label

    plt.show()
    plt.close('all') # clean up after using pyplot

graphWidth = 800
graphHeight = 600
ModelAndScatterPlot(graphWidth, graphHeight)

Upvotes: 1

Related Questions