Scipy曲线拟合,三角模型

ergxz8rk  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(221)

我试图从表中给定x和y值来模拟一个特定的trig函数。我应该找到的函数参数的形式是$A\cdot sin(x\cdot t + ph)+d$。其中$A$是振幅,$x $是周期,$ph$是相移,$d$是垂直位移。这里$t$是变量。

from pylab import * 
 from scipy.optimize import curve_fit
 time = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
 waterlevel = [125,199,223,176,101,73,109,181,219,188,122,85]

 def h(t,x, A , phi, d):
      return A*sin(x*t + phi) + d

 x, A, phi, d = curve_fit(h, time ,waterlevel, p0 = [0,71,-57,150]) # p0 are my approximations

 print("A =", round(A,2))
 print("phi =", round(phi,2))
 print("d =", round(d,2))
 print("x =", round(x,2))

 plot(tid, vannstand, "o")
 xlabel("Time (hours)")
 ylabel("water level (cm)")
 t = linspace(0,24,1000)
 plot(t, h(t,x,A,phi,d), "r")
 show()

这里的技巧是确定$x$,相移,没有最初的猜测。我已经尝试了上述代码,但我得到一个消息,没有足够的值在第七行解包(预期4,得到2)。任何想法,我的错误和潜在的步骤,以确定值?

zpf6vheq

zpf6vheq1#

https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales中,通过第21-36页的示例说明了一种无需初始猜测即可拟合正弦函数的方法。简化版本如下所示:

这些符号与你使用的符号不同。很容易看出其中的关系。特别是符号“omega”在你的公式中是“x”。
上述方法提供了ω(“你的“x”)的近似值。如果想要根据一些特定的拟合标准(LMSE或LMAE或LMRE或其它)得到更精确的值,则必须从上述找到的近似值开始进行迭代非线性回归。
示例:

注意事项:
该方法基于积分方程的拟合,不需要初始猜测,涉及到数值积分如果点的数量较少,数值积分会引入一些偏差,这会降低结果的精度。在上述仅具有12个点的示例中就是这种情况。尽管如此,该结果通常足以正确地启动非线性回归的进一步迭代演算。

当然拟合得更好。差异主要是由于点数太少。

相关问题