第二十天学习进度--规律寻找算法之傅里叶级数拟合周期函数(4)

在上次的规律寻找算法中说明了规律寻找算法并不太支持周期函数,当前几天刷刷头条的时候发现了一个傅里叶级数的动画,为了把规律寻找算法中,对于周期函数模拟的短板给补全了,今天打算在数列找规律算法(预测算法)之更一般形式(2)的基础上,添加一个傅里叶级数的模拟,来让整个模拟曲线的过程丝滑流畅。

众所周知,傅里叶级数是用来拟合任意可导周期函数的,话句话说,只要是个周期函数,都可以这么表示。以下资料来自百度百科。

傅里叶级数有两种表示方式,一种是三角函数的表示方式,这种方式的数学含义明确,但是相对人的计算分析来说,显得相对麻烦。如下所示:

 

下面则是是指数形式的表示形式,相对与人对于周期函数的研究,一般采用这个函数进行研究。

(j为虚数单位)

其中,

 

 

傅里叶真是个天才,发现了周期函数的通用表示方式,前几天一直在寻找周期函数的通用表示,却没想到大学高数中所教的傅里叶级数就是应用在此处,当初学习的时候只是知道这个公式,也没有说具体的应用。

有了上述的公式了之后,就能开始写出对应的傅里叶级数的函数了。根据scipy的函数拟合,则有以下代码

#傅里叶级数(周期函数拟合)
def func_fourier(x,*b):
    x=np.array(x)
    global t
    w = 2 * math.pi/(t*2)*b[-1]
    ret = 0
    a=b[:-2]
    for deg in range(0, int(len(a) / 2) + 1):
        ret += a[deg] * np.cos(deg * w * x) + a[len(a) - deg - 1] * np.sin(deg * w * x)
    return ret

其中t是周期,用网上提供的一组数据来进行函数拟合:

y = [490, 477, 467, 458, 450, 442, 433, 426, 419, 413, 411, 428, 445, 441, 434, 436, 446, 442, 427, 414, 402,
391, 381, 372, 366, 363, 363, 364, 366, 372, 382, 397, 414, 430, 444, 460, 481, 502, 522, 539, 551, 561,
567, 569, 568, 566, 570, 576, 578, 574, 565, 553, 541, 529, 519, 507, 496, 486, 494, 528, 551, 563, 576,
596, 612, 624, 631, 636, 639, 640, 640, 638, 635, 633, 630, 625, 620, 615, 609, 603, 597, 590, 584, 578,
571, 559, 541, 529, 524, 511, 486, 454, 422, 394, 372, 348, 340, 335, 334, 332, 332, 332, 332, 332, 333,
336, 339, 341, 344, 349, 355, 360, 366, 372, 383, 396, 408, 419, 432, 448, 463, 473, 482, 493, 511, 530,
551, 568, 580, 595, 597, 597, 595, 593, 598, 606, 619, 632, 642, 653, 659, 658, 653, 645, 640, 641, 643,
650, 656, 659, 659, 655, 649, 640, 632, 626, 621, 614, 603, 590, 575, 564, 550, 530, 519, 507, 495, 484,
472, 462, 452, 445, 437, 430, 423, 417, 423, 442, 445, 435, 423, 422, 431, 436, 428, 413, 401, 390, 381,
373, 367, 363, 364, 365, 367, 371, 378, 396, 411, 428]

周期函数拟合效果如下:

 

 

 

posted on 2020-07-29 11:27  Halone  阅读(1935)  评论(5编辑  收藏  举报