用Python绘制傅里叶级数和泰勒级数逼近已知函数的动态过程

news2024/9/20 1:24:18

文章目录

    • Taylor级数
    • Fourier级数

本文代码: Fourier级数和Taylor级数对原函数的逼近动画

Taylor级数

级数是对已知函数的一种逼近,比较容易理解的是Taylor级数,通过多项式来逼近有限区间内的函数,其一般形式为

f ( x ) = ∑ n = 0 N a n x n f(x)=\sum_{n=0}^N a_nx^n f(x)=n=0Nanxn

其中最著名的应该是自然指数,根据其导数不变的特点,我们可以很容易得到其表达式

e x = ∑ n = 0 N x n n ! e^x=\sum_{n=0}^N \frac{x^n}{n!} ex=n=0Nn!xn

随着N的不断增加,其逼近过程如图所示

在这里插入图片描述
其中,Taylor级数的实现方法如下,除了exp函数之外,还包括sincos函数的Taylor级数。

def Taylor(x,funcType='exp',n=0):
    func = {
        'exp' : lambda x,n : x**n/fac(n),
        'sin' : lambda x,n : (-1)**n*x**(2*n+1)/fac(2*n+1),
        'cos' : lambda x,n : (-1)**n*x**(2*n)/fac(2*n)
    }
    return func[funcType](x,n)

绘图代码如下

def approxGif(num=30, funcType='exp'):
    funcType = func if type(func)==str else 'auto'
    if type(func)==str:
        func = funcDict[func]
    
    x = np.linspace(0,10,1000)
    Y =func if type(func)==type(x) else func(x)
    
    if method in ['Taylor','taylor']:
        y = Taylor(x,funcType,0)
    elif method in ['Fourier','fourier']:
        y = Fourier(x,funcType,0)
    num = range(num)

    #画图初始化
    fig = plt.figure()
    ax = fig.add_subplot(111,autoscale_on=False,
        xlim=(0,10),ylim=(min(Y)-0.5,max(Y)+0.5))
    ax.plot(x,Y,color='g',lw=0.2)
    ax.grid()

    line, = ax.plot([],[],lw=0.5)
    time_text = ax.text(0.1,0.9,'',transform=ax.transAxes)

    # 动画初始化
    def init():
        line.set_data([],[])
        time_text.set_text('level:'+str(0))
        return line, time_text

    # 动画迭代
    def animate(n):
        nonlocal y
        y = Taylor(x,funcType,n) if n==0 else y+Taylor(x,funcType,n)
        line.set_data(x,y)
        time_text.set_text('level:'+str(n))
        print(n)
        return line, time_text
    
    ani = animation.FuncAnimation(fig,animate,
        num,interval=200,blit=False,init_func=init)
    #ani.save(funcType+'.gif',writer='pillow')
    plt.show()

Fourier级数

Fourier级数也是本着相同的思维,只不过采用了不同频率的三角函数作为其空间中的基底。

对于以 2 π 2\pi 2π为周期的方波信号

f ( x ) = { 1 x ∈ [ 0 , π ) − 1 x ∈ [ − π , 0 ) f(x)=\left\{\begin{aligned} 1\quad &x \in[0,\pi)\\ -1\quad &x\in[-\pi,0) \end{aligned}\right. f(x)={11x[0,π)x[π,0)

其Fourier级数为

f ( x ) = 4 π ∑ n = 0 N sin ⁡ x 2 n + 1 f(x)=\frac{4}{\pi}\sum_{n=0}^N\frac{\sin x}{2n+1} f(x)=π4n=0N2n+1sinx

实现为

def Fourier(x,funcType='square',n=0):
    func = {
        'square' : lambda x,n : 4/np.pi*np.sin((2*n+1)*x)/(2*n+1),
        'tri' : lambda x,n: np.pi/2 if n == 0 \
            else -4/np.pi*np.cos((2*n-1)*x)/(2*n-1)**2,
        'oblique': lambda x,n : 2*np.sin((n+1)*x)/(n+1)*(-1)**n
    }
    return func[funcType](x,n)

绘图代码为

def square(x):
    x = np.mod(x,np.pi*2)
    x[x>np.pi] = -1
    x[x!=-1] = 1
    return x 

def tri(x):
    return np.pi-np.abs(np.mod(x,2*np.pi)-np.pi)

funcDict = {
    'exp':np.exp,
    'sin':np.sin,
    'cos':np.cos,
    'square':square,
    'tri':tri,
}

# func支持三种输入模式,即字符串,函数以及numpy数组
def approxGif(func='square',method='fourier',num=30):
    funcType = func if type(func)==str else 'auto'
    if type(func)==str:
        func = funcDict[func]
    
    x = np.linspace(0,10,1000)
    Y =func if type(func)==type(x) else func(x)
    
    if method in ['Taylor','taylor']:
        y = Taylor(x,funcType,0)
    elif method in ['Fourier','fourier']:
        y = Fourier(x,funcType,0)
    num = range(num)

    #画图初始化
    fig = plt.figure()
    ax = fig.add_subplot(111,autoscale_on=False,
        xlim=(0,10),ylim=(min(Y)-0.5,max(Y)+0.5))
    ax.plot(x,Y,color='g',lw=0.2)
    ax.grid()

    line, = ax.plot([],[],lw=0.5)
    time_text = ax.text(0.1,0.9,'',transform=ax.transAxes)

    # 动画初始化
    def init():
        line.set_data([],[])
        time_text.set_text('level:'+str(0))
        return line, time_text

    # 动画迭代
    def animate(n):
        nonlocal y
        if method in ['taylor','Taylor']:
            y = Taylor(x,funcType,n) if n==0 \
                else y+Taylor(x,funcType,n)
        elif method in ['fourier','Fourier']:
            y = Fourier(x,funcType,n) if n==0 \
                else y+Fourier(x,funcType,n)
            pass
        line.set_data(x,y)
        time_text.set_text('level:'+str(n))
        print(n)
        return line, time_text
    
    ani = animation.FuncAnimation(fig,animate,
        num,interval=200,blit=False,init_func=init)
    #ani.save(funcType+'.gif',writer='pillow')
    plt.show()

如图所示

在这里插入图片描述

相应地三角波为

在这里插入图片描述
在这里插入图片描述

上述只是给出了几个直观的例子,用以表明Taylor级数和Fourier级数的使用方法,从而让我们具备这种通过多项式或者三角函数来逼近已知函数的意识。而对于已知表达形式的函数 y = f ( x ) y=f(x) y=f(x),Taylor级数和Fourier级数都有导数或者积分的表示形式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lua 运算符 - 较为特殊部分

Lua 运算符 - 较为特殊部分 参考至菜鸟教程。 算术运算符 操作符描述实例^乘幂A^2 输出结果 100-负号-A 输出结果 -10//整除运算符(>lua5.3)5//2 输出结果 2在 lua 中,/ 用作除法运算,计算结果包含小数部分,// 用作整除运算,计…

Shiro学习文档

Shiro Java安全框架 1.什么是权限管理 ​ 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理…

oracle mysql postgresql opengauss 批量kill session

oracle alter system kill session sid,serial# immed; (根据v$session中查出sid和serial#进行替换) 这里提供一个常用脚本,支持跨实例kill会话 (替换&1条件或放到脚本调用都行) select alter system kill sessi…

Dubbo 简介

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性&…

嵌入式工程师的2022 || 2023

因为一些个人关系,2022年初我从北京回到了石家庄。在找工作,包括后续的研发工作中,不同地点的经历在对比中我逐渐总结出了一些经验。关于“人”方面的感悟我就不赘述了,下面主要在这里总结一些找工作,做工作的经验&…

八、迁移学习和多任务学习

文章目录1、迁移学习2、多任务学习3、端到端学习THE END1、迁移学习 \qquad迁移学习是将某个任务学习到的知识(神经网络的参数信息)迁移到另外一个相似的任务中使用,从而重复利用相似任务学习共同之处,节省模型训练的时间,提高模型的训练效率…

一名普通22届本科毕业生|前端程序员|22年年终总结

文章目录22年上半年:最后的学生时光隔离实习币基金迷茫困惑难受不要去想人生意义读书景点环境的力量再次隔离返校入职前的学习22年下半年:上班工作生活总结本来准备在22年年末写的,奈何那段时间工作太忙没抽出时间。现在是23年的1月27日&…

paddleOCR代码工程的MD模式改造

一、下载cmake_3.22.3,用于生成vs工程 Index of /files/v3.22 下载完成,解压文件,打开cmake-gui.exe,即可使用: 二、下载Git(Git-2.36.0-64-bit.exe)并按照默认路径安装,cmake需调用…

使用Moment格式化时间出现时间差

诶嘿,很离奇。前些天后端老哥给我说我这时间展示不对。 我就奇了个大怪,就是取的这个字段嘛,怎么肥事😭 看半天发现是时间格式化出的问题。 原代码⬇️,看起来没毛病嘛,值打印出来也与接口里的这个时间一…

到底卡在了哪里,2023年再撒谎网慢就说不过去了

前言互联网下行带来灵魂追问。钱花哪去了?产出在哪里?动辄自建的遮羞布逐步显现,不过自建的成本可能还不是最大的负担,掣肘的可能是把不重要的事情当成了主业来做,比如:互联网比如数字化转型比如研发效率和…

Verilog HDL基本语法规则

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库&#xf…

10大面试必备的排序算法 Python 实现(附源码)

今天给大家分享一篇关于Python实现排序算法的文章,来自GitHub。 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一…

STM32入门基础

GPIO <1>说明 引脚电平&#xff1a;0~3.3V&#xff0c;部分可达到5V(参考引脚定义&#xff0c;带FT的就可以) 同时 GPIO有两个模式 输出模式&#xff1a;进行端口高低电平的输出&#xff0c;用于驱动LED&#xff0c;蜂鸣器等 输入模式&#xff1a;读取端口高低电平…

SimBERT剖析

SimBERT SimBERT&#xff0c;它是以Google开源的BERT模型为基础&#xff0c;基于微软的UniLM思想设计了融检索与生成于一体的任务&#xff0c;来进一步微调后得到的模型&#xff0c;所以它同时具备相似问生成和相似句检索能力。 UniLM UniLM是一个融合NLU和NLG能力的Transfo…

远程桌面控制:SmartCode VNC ViewerX ActiveX 3.10 Crack

SmartCode::ViewerX VNC 查看器 ActiveX 毫不费力地将 VNC 查看器功能添加到您的应用程序 SmartCode ViewerX VNC 查看器 ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX 控件&#xff0c;开发人员可以轻松地为其应用程序提供屏…

将自己写的代码利用git 上传到码云(gitee)或者github----最简洁明了版

前置操作 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 生成并配置 SSH 公钥 官方提供的生成并配置公钥的方法点此 创建空白的码云仓库 输入仓库名称之后路径会自动生成 把本地项目上传到码云对应的空白仓库中 如果您是…

MyBatis-Plus快速开始

文章目录介绍特性框架结构传统编程模式快速开始介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。只做增强不做改变的意思是&#xff1a;MP不会影响原生的 M…

[HITCON 2017]SSRFme(perl脚本中get命令执行漏洞)

目录 代码审计 思路 知识补充 PHP中$_SERVER的详细用法 pathinfo() 函数 str_replace() 函数 escapeshellarg peal函数中get命令漏洞 Perl中open命令执行&#xff08;GET&#xff09; 代码审计 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers…

GuLi商城-项目初始结构创建

GitHub账号和密码 账号&#xff1a;11360XXXXXqq.com 密码&#xff1a;ZH**SH*19**1016 新建仓库&#xff1a; gulimall 记得勾选下Add a README file&#xff0c;上面忘记勾选了&#xff0c;实际建议还是要勾选下 复制路径&#xff1a; 打开IDEA检出项目 创建商品微服务模…

flutter 作为模块引入 iOS 项目

原文 http://summerxx.com/2023/01/28/ios-use-flutter/ 前言: 上篇我讲了下 flutter 环境在 MacOs 下搭建, 今天写下如何在一个成熟的 iOS 项目内引用 flutter, Demo 会放到文章最后哈 上篇 : MacOS 下配置flutter 环境 大致如下: 在项目内创建一个 flutter 模块 新建一个 …