我正在尝试将超新星数据拟合到一个scipy.curve_fit
函数中。但是,当我的代码运行时,给出的未知变量的值popt
是准确的。也没有产生协方差矩阵。该代码没有为未知变量提供正确的值,,和. 我使用的适合我的模型如下:
下面是我的数据集,其中年月日之后的第二列作为 t,第四列作为通量密度,第五列(最后一列)作为 yerr。
有人可以告诉如何在这段代码中产生协方差矩阵吗?另外,我的代码最初的猜测是什么?
import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
t=np.genfromtxt("data_1390.dat",dtype=np.float64,usecols=3)
y=np.genfromtxt("data_1390.dat",dtype=np.float64,usecols=5)
yerr=np.genfromtxt("data_1390.dat",dtype=np.float64 ,usecols=6)
def FFA(t,K1,K2,alpha,beta):
CSM_unif=K2*((1.39/5)**(-2.1))*(t/1)**(-3)
return K1*((1.39/5)**(alpha))*((t/1)**beta)*np.exp(-CSM_unif)
fig,ax1=plt.subplots()
plt.errorbar(t,y,yerr=yerr,color='blue',fmt='o-',elinewidth=3,capsize=2,barsabove=True)
#sigma=[132899.651,-261.945481,-261.945481,14.3752141]
popt,pcov=curve_fit(FFA,t,y,p0=[1.02,5,1.151,1.151], sigma=yerr, maxfev=2000)
K1,K2,alpha,beta=popt
print("value of K1 = ",K1)
print("value of K2 = ",K2)
print("value of beta = ",beta)
print("value of alpha = ",alpha)
ax1.set_xscale("log", nonpositive='clip')
ax1.set_yscale("log", nonpositive='clip')
ax1.plot(t,y,FFA(t,*popt),color='r')
ax1.set_xlabel('time (in s)')
ax1.set_ylabel('spectral flux density (in Jansky)')
ax1.set(title='Light Curve')
ax1.set_ylim(bottom=0.1)
ax1.set_xlim(left=10)
fig.tight_layout()
plt.show()
以下是我的警告信息和输出;
Warning (from warnings module):
File "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\scipy\optimize\minpack.py", line 833
warnings.warn('Covariance of the parameters could not be estimated',
OptimizeWarning: Covariance of the parameters could not be estimated
value of K1 = 579.2356457671407
value of K2 = 243.98216449823164
value of beta = 1.1217015399194465
value of alpha = 444.59686079559594
我的最佳拟合曲线。曲线不正确,因为弯曲应该更高。最大值应该更高。