Search code examples
pythoncurve-fitting

The covariance of the parameters cannot be estimated during curve fitting


I'm trying to solve two unknown parameters based on my function expression using the scipy.optimize.curve_fit function. The equation I used is as follows: enter image description here

My code is as follows:

p_freqs =np.array(0.,8.19672131,16.39344262,24.59016393,32.78688525,
                  40.98360656,49.18032787,57.37704918,65.57377049,73.7704918,
                  81.96721311,90.16393443,98.36065574,106.55737705,114.75409836,
                  122.95081967,131.14754098,139.3442623, 147.54098361,155.73770492,
                  163.93442623,172.13114754,180.32786885,188.52459016,196.72131148,
                  204.91803279,213.1147541, 221.31147541,229.50819672,237.70491803,
                  245.90163934)
p_fft_amp1 = np.array(3.34278536e-08,5.73549829e-08,1.94897033e-08,1.59088184e-08,
                      9.23948302e-09,3.71198908e-09,1.85535722e-09,1.86064653e-09,
                      1.52149363e-09,1.33626573e-09,1.19468040e-09,1.08304535e-09,
                      9.96594475e-10,9.25671797e-10,8.66775330e-10,8.17287132e-10,
                      7.75342888e-10,7.39541296e-10,7.08843676e-10,6.82440637e-10,
                      6.59712650e-10,6.40169517e-10,6.23422124e-10,6.09159901e-10,
                      5.97134297e-10,5.87146816e-10,5.79040074e-10,5.72691200e-10,
                      5.68006964e-10,5.64920239e-10,5.63387557e-10)
def  cal_omiga_tstar(omiga,tstar,f):
    return omiga*np.exp(-np.pi*f*tstar)/(1+(f/18.15)**2)
omiga,tstar = optimize.curve_fit(cal_omiga_tstar,p_freqs,p_fft_amp1)[0]

When I run the code I get the following prompt: OptimizeWarning: Covariance of the parameters could not be estimated warnings.warn('Covariance of the parameters could not be estimated'


Solution

  • I couldn't exactly pinpoint the cause of your error message because your code had some errors prior to that. First, the construction of the two arrays has invalid syntax, then your definition of cal_omiga_tstar has the wrong argument order. While fixing these problems I did get your error message once, but I haven't been able to reproduce it, weirdly enough. However, I did manage to fit your function. You should supply initial guesses to the parameters, especially since your y has so many low values. There's no magic here, just plot your model and data until it's relatively close. Then, let the algorithm take the wheel.

    Here's my code:

    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    import numpy as np
    
    # Changed here, was "np.array(0.,..."
    p_freqs =np.array([0.,8.19672131,16.39344262,24.59016393,32.78688525,
                      40.98360656,49.18032787,57.37704918,65.57377049,73.7704918,
                      81.96721311,90.16393443,98.36065574,106.55737705,114.75409836,
                      122.95081967,131.14754098,139.3442623, 147.54098361,155.73770492,
                      163.93442623,172.13114754,180.32786885,188.52459016,196.72131148,
                      204.91803279,213.1147541, 221.31147541,229.50819672,237.70491803,
                      245.90163934])
    p_fft_amp1 = np.array([3.34278536e-08,5.73549829e-08,1.94897033e-08,1.59088184e-08,
                          9.23948302e-09,3.71198908e-09,1.85535722e-09,1.86064653e-09,
                          1.52149363e-09,1.33626573e-09,1.19468040e-09,1.08304535e-09,
                          9.96594475e-10,9.25671797e-10,8.66775330e-10,8.17287132e-10,
                          7.75342888e-10,7.39541296e-10,7.08843676e-10,6.82440637e-10,
                          6.59712650e-10,6.40169517e-10,6.23422124e-10,6.09159901e-10,
                          5.97134297e-10,5.87146816e-10,5.79040074e-10,5.72691200e-10,
                          5.68006964e-10,5.64920239e-10,5.63387557e-10])
    # Changed sequence from "omiga, tstar, f" to "f, omiga, tstar".
    def  cal_omiga_tstar(f, omiga,tstar):
        return omiga*np.exp(-np.pi*f*tstar)/(1+(f/18.15)**2)
    
    # Changed this call to get popt, pcov, and supplied the initial guesses
    popt, pcov = curve_fit(cal_omiga_tstar,p_freqs,p_fft_amp1, p0=(1E-5, 1E-2))
    

    Here's popt: array([ 4.51365934e-08, -1.48124194e-06]) and pcov: array([[1.35757744e-17, 3.54656128e-12],[3.54656128e-12, 2.90508007e-06]]). As you can see, the covariance matrix could be estimated in this case.

    Here's the model x data curve:

    enter image description here