首页 > 解决方案 > 曲线拟合问题

问题描述

我在拟合函数时遇到问题。事实上,当将函数定义为硬代码时,它可以完美运行。请考虑以下示例:

创建 Y 数据数组

ydata= np.array([5.37E+04, 3.36E+04, 1.99E+04, 1.12E+04, 5.96E+03, 3.02E+03, 1.45E+03, 6.67E+02, 2.98E+02, 1.29E+02, 5.59E+01, 2.44E+01, 1.09E+01, 4.71E+00, 2.46E+00, 1.25E+00])

创建 X 数据数组

xdata = np.array([300., 188., 118., 73.6, 46.0, 28.8, 18.0, 11.3, 7.06, 4.42, 2.77, 1.73, 1.08, 0.678, 0.425, 0.266])

定义我的拟合函数

def fit_storage (w,G0, G1, t1, G2, t2, G3, t3, G4, t4, G5, t5, G6, t6, G7, t7):
fit_str = G0 + (G1*w**2*t1**2)/(1+w**2*t1**2) + (G2*w**2*t2**2)/(1+w**2*t2**2) + (G3*w**2*t3**2)/(1+w**2*t3**2) + (G4*w**2*t4**2)/(1+w**2*t4**2) + (G5*w**2*t5**2)/(1+w**2*t5**2) + (G6*w**2*t6**2)/(1+w**2*t6**2) + (G7*w**2*t7**2)/(1+w**2*t7**2)
return fit_str 

比,我打电话给curve_fit(从scipy导入):

popt, pcov = curve_fit(fit_storage, xdata, ydata, bounds=(bound_lower, bound_upper), maxfev = 50000)

这非常有效,但正如您所见,它完全是对系数进行硬编码。因此,我正在尝试做一个更通用的功能,定义为:

def str_func(w, x, n):
summation_str = np.array(np.zeros(len(frequency)))
for i in range (1,2*n+1,2): 
    summation_str = summation_str + ((x[i]*w**2*x[i+1]**2)/(1+(w**2*x[i+1]**2))) 
y_str = x[0] + summation_str
return y_str

但是,我无法调用曲线拟合它。我正在做的方式如下:

popt, pcov = curve_fit(str_func, xdata, ydata, bounds=([bound_lower], [bound_upper]), maxfev = 50000)

而且它不起作用......有人可以帮我解决这个问题(你可以考虑任何bound_lower和bound_upper......错误不在那里)?提前致谢。

标签: pythonscipyscipy-optimize

解决方案


推荐阅读