现在,我想将双曲余弦曲线的一个凸起拟合到以下X和Y数据中:
xData = np.array([1.7, 8.8, 15, 25, 35, 45, 54.8, 60, 64.7, 70])
yData = np.array([30, 20, 13.2, 6.2, 3.9, 5.2, 10, 14.8, 20, 27.5])
以下是我迄今为止所做的,但我没有得到预期的结果,我不知道我做错了什么:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy.interpolate as inp
xData = np.array([1.7, 8.8, 15, 25, 35, 45, 54.8, 60, 64.7, 70])
yData = np.array([30, 20, 13.2, 6.2, 3.9, 5.2, 10, 14.8, 20, 27.5])
def model_hcosine(x, a, b, c):
return a * np.cosh(x/b) + c
poptcosh, pcovcosh = curve_fit(model_hcosine, xData, yData, p0=[min(yData), max(xData), max(yData)])
aapopt, bbopt, cccopt = poptcosh
xCoshModel = np.linspace(min(xData), max(xData), 100)
yCoshModel = model_hcosine(xCoshModel, aapopt, bbopt, cccopt)
plt.scatter(xData, yData)
plt.plot(xCoshModel, yCoshModel, 'b-')
plt.show()
2条答案
按热度按时间qqrboqgw1#
@WarrenWeckesser是正确的,您需要考虑
cosh
函数中的转换。您可以向模型添加一个额外的参数d
,并在优化器中为其给予一个初始条件0
。然后,在绘图之前,您将最佳系数解包并插入模型中。qybjjes12#
这篇文章不是一个答案,而是一个评论,太长了,无法在评论区编辑。
供参考:
通常的拟合方法(如Python中的方法)涉及一个迭代过程,从参数的"猜测"值开始,这些值必须离未知的精确值不远。
有一种不常见的方法,它不是迭代的,也不需要初始值来开始计算。下面用一个数值例子说明它在双曲余弦函数中的应用。
上述方法是对一个积分方程进行线性拟合,其解为双曲余弦。一般解释见https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales。本文没有明确处理双曲余弦的情况。这就是上面给出细节的原因。
注:如果指定了一些特定的拟合标准(MLSE,MLSAE,MLSRE或其他),则无法避免非线性回归。然后,上面找到的参数的近似值是非常好的值,可以开始迭代过程,以期望更好的可靠性。