爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 384|回复: 0

[源代码] 傅里叶三角级数拟合

[复制链接]

新浪微博达人勋

发表于 2024-1-7 09:03:44 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 柿子柿子柿子 于 2024-1-7 09:08 编辑

原本在想着怎么通过傅里叶变换找有序数列的周期、振幅和相位的,找了一圈没找到网上现成的程序,但是通过一堆零零碎碎的教程给我指向了《高数》……于是跟着《高数》的内容调试出了这个段拟合代码
【吐槽】想往这个发帖的框框里填代码是真的麻烦……


from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit


def fourier(x, *a):
    aa = a[1:]
    m = len(aa) // 2
    ret = a[0]
    for i,nn in enumerate(aa[:m],1):
        ret += nn * np.cos(i*x)
    for i,nn in enumerate(aa[m:],1):
        ret += nn * np.sin(i*x)
    return ret

def fit_fourier(x,y,n):
    popt, pcov = curve_fit(fourier, x, y, [1.]*(2*n+1))
    p = fourier(x,*popt)
    # print(popt)
    return popt

def test_func(x):
    y  = 1.5 + 2.5 * np.sin(x - np.pi/4)
    # 添加噪声
    y += 0.2 * np.random.normal()
    return y


if __name__ == '__main__':

    op = Path("pic")
    op.mkdir(511,True,True)

    x = np.linspace(0,2*np.pi,20)
    y = test_func(x)

    a = fit_fourier(x,y,2)

    x1 = np.linspace(0,4*np.pi,50)
    y1 = fourier(x1, *a)

    plt.plot(x,y,'ko',label='data')
    plt.plot(x1,y1,'r',label='fit')
    plt.legend()

    plt.savefig(op.joinpath("fitting.png"), dpi=300)

1.5+2.5sin(x-pi/4)

1.5+2.5sin(x-pi/4)



密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表