我需要拟合一条曲线到数据,并且首先在我自己创建的图上测试scipy.optimize.curve_fit
。令人担忧的是,仅仅稍微改变边界就会影响曲线参数的估计值,这并不能让人很有信心在真实的数据上正确估计。为什么会发生这种情况,我可以使用curve_fit的替代方法吗?
我正在测试的功能(最终需要适合数据)是y = a*(x/b)**9
。我在下面的代码中为a = 0.03
和b = 0.007
绘制了它,然后我用curve_适合估计a和B。如果我设定0 < a < 0.1
的界限,它会高估a
为0.0429
。如果我设定0 < a < 0.04
的界限,它会低估a
是0.0222
。我的实际数据有很多次幂(d
),所以我不仅要估计d = 9
,还要估计d
的范围。如果它们都被低估或高估,这将在最后产生很大的影响。有没有办法可以解决这个问题?
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
d = 9
def func(x,a,b):
return a*(x/b)**d
x = np.logspace(-3.2,-2,20)
a = 0.03
b = 0.007
print(f"a = {a}, b = {b}")
y = func(x,a,b)
plt.loglog(x,y)
plt.savefig("test.png")
plt.show()
popt, pcov = curve_fit(func,x,y, bounds = ([0,0.005],[0.04,0.009]))
print(f'a ≈ {popt[0]}, b ≈ {popt[1]}')
字符串
的数据
1条答案
按热度按时间2w3rbyxf1#
这个方程有无穷多个解,因为参数a和b的作用是一样的.
您可以通过取等式两边的对数并简化来看出这一点:
字符串
例如,如果你有一个解a,B,那么你可以用a除以1000,再用b除以1000的9次方根,这就是一个等价解。
型
如果函数有多个等效拟合,则curve_fit可能会拾取其中的任何一个。