微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种方法可以拟合由两个波浪创建的波浪?

如何解决有没有一种方法可以拟合由两个波浪创建的波浪?

我需要拟合由两个正弦波创建的正弦曲线并提取拟合曲线的参数(例如频率、幅度等)。

数据示例:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.arange(0,50,0.01)
x2 = np.arange(0,100,0.02)
x3 = np.arange(0,150,0.03)
sin1 = np.sin(x)
sin2 = np.sin(x2)
sin3= np.sin(x3/2)

sin4 = sin1 + sin2+sin3
plt.plot(x,sin4)
plt.show()

enter image description here

我使用了 this answer 中提供的代码

yy = sin4
tt = x
res = fit_sin(tt,yy)
print(str(i),"Amplitude=%(amp)s,Angular freq.=%(omega)s,phase=%(phase)s,offset=%(offset)s,Max. Cov.=%(maxcov)s" % res )
fit_values=res["fitfunc"](tt)
Frequenc_fit= res['freq']
print(i,Frequenc_fit)
Frequenc_fit=Frequenc_fit
Amp_fit=res['amp']
Omega_fit=res['omega']
Phase_fit=res['phase']
Offset_fit=res['offset']
maxcov_fit=res['maxcov']
plt.plot(tt,yy,"-k",label="y",linewidth=2)
plt.plot(tt,fit_values,"r-",label="y fit curve",linewidth=2)
plt.legend(loc="best")
plt.show()

我得到了一个具有单一频率和幅度的拟合正弦曲线,如下所示:

2 Amplitude=1.0149282025860233,Angular freq.=2.01112187048004,phase=-0.2730905030152767,offset=0.003304158823058212,Max. Cov.=0.0015266032307905222
2 0.3200799868471169

enter image description here

有没有一种方法可以获得与原始曲线匹配的拟合曲线?

解决方法

假设要拟合的函数是

y(x)=a * sin( w * x )+b * sin( W * x )

下面方法的原理在https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales

中有解释

enter image description here

结果的图形表示为:

蓝色曲线:来自通过扫描问题中给出的图表获得的数据。

黑色曲线:来自上述演算。

enter image description here

可用数据不准确,因为它来自原始图的扫描。偏差主要是由于计算 SS 和 SSSS 值时的数值积分(四个连续的数值积分不准确,尤其是有偏差的数据)。

可能正确的结果应该是: w=2,W=1,a=1,b=1.

注意:上述方法不是迭代的,因此不需要猜测参数值来启动迭代过程。参数的近似结果可以是很好的初始值,以便使用迭代非线性回归过程。

注意:如果 w 和 W 的值是先验已知的,那么线性回归的求解将非常简单且非常准确(仅上面显示的最后一个 2X2 矩阵演算)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。