scipy 用Python拟合双曲余弦曲线

g6ll5ycj  于 2023-01-26  发布在  Python
关注(0)|答案(2)|浏览(204)

现在,我想将双曲余弦曲线的一个凸起拟合到以下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()
qqrboqgw

qqrboqgw1#

@WarrenWeckesser是正确的,您需要考虑cosh函数中的转换。您可以向模型添加一个额外的参数d,并在优化器中为其给予一个初始条件0。然后,在绘图之前,您将最佳系数解包并插入模型中。

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, d):
    return a * np.cosh((x-d)/b) + c

poptcosh, pcovcosh = curve_fit(model_hcosine, xData, yData, p0=[min(yData), max(xData), max(yData), 0])

aapopt, bbopt, cccopt, ddopt = poptcosh
xCoshModel = np.linspace(min(xData), max(xData), 100)
yCoshModel = model_hcosine(xCoshModel, aapopt, bbopt, cccopt, ddopt)

plt.scatter(xData, yData)
plt.plot(xCoshModel, yCoshModel, 'b-')

plt.show()

qybjjes1

qybjjes12#

这篇文章不是一个答案,而是一个评论,太长了,无法在评论区编辑。
供参考:
通常的拟合方法(如Python中的方法)涉及一个迭代过程,从参数的"猜测"值开始,这些值必须离未知的精确值不远。
有一种不常见的方法,它不是迭代的,也不需要初始值来开始计算。下面用一个数值例子说明它在双曲余弦函数中的应用。

上述方法是对一个积分方程进行线性拟合,其解为双曲余弦。一般解释见https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales。本文没有明确处理双曲余弦的情况。这就是上面给出细节的原因。
注:如果指定了一些特定的拟合标准(MLSE,MLSAE,MLSRE或其他),则无法避免非线性回归。然后,上面找到的参数的近似值是非常好的值,可以开始迭代过程,以期望更好的可靠性。

相关问题