我正在尝试简单地拟合a*(x-x0)**b
形式的指数衰减数据,其中我知道a
和b
必须为负。因此,如果将其绘制在对数-对数图上,我应该看到所获得数据的线性趋势。
正因为如此,我给出了scipy.optimize
的初始猜测,其中a和b为负,但是它一直忽略它们并给出错误信息,
OptimizeWarning: Covariance of the parameters could not be estimated
..并给我a
和b
的正值。然后它也不会给我指数衰减,而是一个抛物线触底并开始增加。
对于大范围值的初始参数,我已经尝试了许多不同的猜测(下面的代码中有一个这样的猜测),但是没有给我毫无意义的回报和错误,没有一个奏效。这让我开始怀疑我的代码是否错误,或者是否有一些显而易见的方法可以对代码进行良好的初步猜测而不会被拒绝。
import math
import numpy as np
import sys
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize
from scipy.optimize import curve_fit
import numpy.polynomial.polynomial as poly
x= [1987, 1993.85, 2003, 2010.45, 2009.3, 2019.4]
t= [31, 8.6, 4.84, 1.96, 3.9, 1.875]
def model_func(x, a, b, x0):
return (a*(x-x0)**b)
# curve fit
p0 = (-.0005,-.0005,100)
opt, pcov = curve_fit(model_func, x, t,p0)
a, b, x0 = opt
# test result
x2 = np.linspace(1980, 2020, 100)
y2 = model_func(x2, a, b,x0)
coefs, cov = poly.polyfit(x, t, 2,full=True)
ffit = poly.polyval(x2, coefs)
plt.loglog(x,t,'.')
plt.loglog(x2, ffit,'--', color="#1f77b4")
print('S = (',coefs[0],'*(t-',coefs[2],')^',coefs[1])