我正在尝试将一些实验数据拟合到具有一个参数的非线性函数,该参数包括一个反余弦函数,因此它的定义区域从-1到1受到限制。我使用scipy的curve_fit来查找函数的参数,但是它返回以下错误:
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 400.
我想要适合的功能是这个:
def fitfunc(x, a):
y = np.rad2deg(np.arccos(x*np.cos(np.deg2rad(a))))
return y
对于拟合,我分别为 x 和 y 提供了一个 numpy 数组,其中包含度数(这就是该函数包含与弧度之间的转换的原因)。
param, param_cov = curve_fit(fitfunc, xs, ys)
当我使用其他拟合函数(例如多项式)时,curve_fit 返回一些值,上述错误仅在我使用包含反余弦的此函数时发生。
我怀疑它不能拟合数据点,因为根据反余弦函数的参数,一些数据点不在反余弦的定义区域内。我尝试提高迭代次数(maxfev)但没有成功。
样本数据:
ys = np.array([113.46125, 129.4225, 140.88125, 145.80375, 145.4425,
146.97125, 97.8025, 112.91125, 114.4325, 119.16125,
130.13875, 134.63125, 129.4375, 141.99, 139.86,
138.77875, 137.91875, 140.71375])
xs = np.array([2.786427013, 3.325624466, 3.473013087, 3.598247534, 4.304280248,
4.958273121, 2.679526725, 2.409388637, 2.606306639, 3.661558062,
4.569923009, 4.836843789, 3.377013596, 3.664550526, 4.335401233,
3.064199519, 3.97155254, 4.100567011])