用manim证明函数的左右极限

news2024/9/30 19:40:34

http://t.csdnimg.cn/2pVdFicon-default.png?t=N7T8http://t.csdnimg.cn/2pVdF在上一节的最后两个示例中,我们看到了两个不存在的限制。然而,对于每个例子来说,每个限制不存在的原因是不同的。

我们看一下下面的例子:

\mathop {\lim }\limits_{t \to 0} \,\,\cos \left( {\frac{\pi }{t}} \right)

 极限不存在,因为函数没有固定为单个值  t 走近 t=0。越接近  t=0  我们移动得越厉害,函数振荡得越厉害,为了存在一个极限,函数必须稳定到一个单一的值。

from manim import *  

class CosLimit(Scene):  
    def construct(self):  
        # 设置坐标轴  
        axes = Axes(  
            x_range=[-0.25, 0.25, 0.1],  # x 显示范围  
            y_range=[-1, 1.5, 1],        # y 显示范围  
            axis_config={"color": BLUE},  # 坐标轴颜色  
        )  
        
        # 创建函数: cos(pi/t)  
        cos_function = axes.plot(lambda t: np.cos(np.pi / t), x_range=[-0.5, 0.5], color=RED,stroke_width=5)  
        
        # 标签设置  
        function_label = axes.get_graph_label(cos_function, label='\\cos\\left(\\frac{\\pi}{t}\\right)')  
        
        # 添加坐标轴和函数到场景中  
        self.play(Create(axes), Create(cos_function), Write(function_label))  
        self.wait(2)  # 等待 2 秒以观察结果  

        # 创建两个点  
        point1 = Dot(axes.c2p(0.1, np.cos(np.pi / 0.1)), color=RED)  # 第一个点的初始位置  
        point2 = Dot(axes.c2p(-0.1, np.cos(np.pi / -0.1)), color=GREEN)  # 第二个点的初始位置  
        
        # 添加点到场景  
        self.play(Create(point1), Create(point2))  
        self.wait(1)  # 等待 1 秒以观察点  

        # 动画:使两个点移动到极限位置 (0, np.cos(+-inf))  
        self.play(  
            point1.animate.move_to(axes.c2p(0, 1)),  # 第一个点移动到 (0, 1)  
            point2.animate.move_to(axes.c2p(0, 1)),  # 第二个点移动到 (0, 1)  
            run_time=3  # 动画运行时间  
        )  
        self.wait(2)  # 等待 2 秒以观察点的移动  

        # 结束场景  
        self.play(FadeOut(axes), 
                  FadeOut(cos_function), FadeOut(function_label),
                  FadeOut(point1), FadeOut(point2))

运行结果:

 接下来优化一下改代码:

from manim import *  

class CosLimitFollow(Scene):  
    def construct(self):  
        # 设置坐标轴  
        axes = Axes(  
            x_range=[-0.5, 0.5, 0.1],  # x 显示范围  
            y_range=[-1, 1, 1],        # y 显示范围  
            axis_config={"color": BLUE},  # 坐标轴颜色  
        )  
        
        # 创建函数: cos(pi/t)  
        cos_function = axes.plot(lambda t: np.cos(np.pi / t), x_range=[-0.5, 0.5], color=WHITE)  
        
        # 标签设置  
        function_label = axes.get_graph_label(cos_function, label='\\cos\\left(\\frac{\\pi}{t}\\right)')  
        
        # 添加坐标轴和函数到场景中  
        self.play(Create(axes), Create(cos_function), Write(function_label))  
        self.wait(2)  # 等待 2 秒以观察结果  

        # 根据函数设置点的起始位置  
        t1 = 0.1  # 第一个点的初始 t 值  
        t2 = -0.1  # 第二个点的初始 t 值  
        point1 = Dot(axes.c2p(t1, np.cos(np.pi / t1)), color=RED)  # 第一个点在初始位置  
        point2 = Dot(axes.c2p(t2, np.cos(np.pi / t2)), color=GREEN)  # 第二个点在初始位置  
        
        # 添加点到场景  
        self.play(Create(point1), Create(point2))  
        self.wait(1)  # 等待 1 秒以观察点  

        # 动画:使两个点沿着函数移动,分别朝向 t = 0  
        self.play(  
            point1.animate.move_to(axes.c2p(0.1, np.cos(np.pi / 0.1))),  # 第一个点沿 x = 0.1 移动  
            point2.animate.move_to(axes.c2p(-0.1, np.cos(np.pi / -0.1))),  # 第二个点沿 x = -0.1 移动  
            run_time=3  # 动画运行时间  
        )  

        # 设置持续时间,让点在轨迹上移动  
        t_values = np.linspace(0.1, 0, 100)  # 针对第一个点,t 从 0.1 值线性变化到 0  
        point1_path = [axes.c2p(t, np.cos(np.pi / t)) for t in t_values]  # 创建路径  
        
        t_values = np.linspace(-0.1, 0, 100)  # 针对第二个点,t 从 -0.1 线性变化到 0  
        point2_path = [axes.c2p(t, np.cos(np.pi / t)) for t in t_values]  # 创建路径  

        # 沿着轨迹移动点  
        point1.animate.move_to(point1_path[-1])  # 移动到极限位置  
        point2.animate.move_to(point2_path[-1])  # 移动到极限位置  
        
        # 移动动画  
        self.play(  
            *[point1.animate.move_to(point) for point in point1_path],   
            *[point2.animate.move_to(point) for point in point2_path],   
            run_time=6  # 总移动时间  
        )  

        self.wait(2)  # 等待 2 秒以观察点的移动  

        # 结束场景  
        self.play(FadeOut(axes), FadeOut(cos_function), 
                  FadeOut(function_label), 
                  FadeOut(point1), FadeOut(point2))

然而,我们看一下面的内容,

\mathop {\lim }\limits_{t \to 0} H\left( t \right)\hspace{0.25in}{\mbox{where,}}\hspace{0.25in}H\left( t \right) = \left\{ \begin{array}{ll}0 & {\mbox{if }}t < 0\\ 1 & {\mbox{if }}t \ge 0\end{array} \right.

它极限不存在,是因为当我们向 移动时函数没有稳定到一个数字 t=0 而是因为它取决于 的哪一边,变成了两个不同的数。

我们看一下它的图像。下面是用 Manim 库实现你所要求的阶跃函数 H(t) 的图像,

from manim import *  

class StepFunctionLimit10(Scene):  
    def construct(self):  
        # 设置坐标轴  
        axes = Axes(  
            x_range=[-1, 1, 0.5],  # x 显示范围  
            y_range=[-0.5, 1.5, 1],  # y 显示范围  
            axis_config={"color": BLUE},  # 坐标轴颜色  
        ).add_coordinates()  
        
        # 定义阶跃函数 H(t)  
        def H0(t):  
            return 0   # H(t) 定义为阶跃函数 
        
        def H1(t):  
            return 1   # H(t) 定义为阶跃函数 
        
        
        
        # 创建阶跃函数的离散图像  
        step_graph = axes.plot(lambda t: H0(t), x_range=[-1, 0], color=RED, use_smoothing=False)
        
        step_graph1 = axes.plot(lambda t: H1(t), x_range=[0, 1], color=RED, use_smoothing=False) 
        
        
        
        # 防止函数线段连起来,添加跳跃  
        self.play(Create(axes), Create(step_graph),Create(step_graph1))  # 添加坐标轴和阶跃函数到场景中  
        self.wait(2)  # 等待 2 秒以观察结果  
        
        texM=MathTex(r"\hspace{0.25in}H\left( t \right) = \left\{ \begin{array}{ll}0 & {\mbox{if }}t < 0\\ 1 & {\mbox{if }}t \ge 0\end{array}\right.")
        texM.set_color(BLUE).move_to(axes.c2p(-0.5, 1))
        self.add(texM)
        # 创建两个点,分别在函数的不同位置  
        point1 = Dot(axes.c2p(-0.5, H0(-0.5)), color=WHITE)  # 第一个点的初始位置  
        point2 = Dot(axes.c2p(0.5, H1(0.5)), color=GOLD)  # 第二个点的初始位置  
        
        # 添加点到场景  
        self.play(Create(point1), Create(point2))  
        self.wait(1)  # 等待 1 秒以观察点的变化  

        # 动画:使两个点同时走向极限位置 (0, 1)  
        self.play(  
            point1.animate.move_to(axes.c2p(0, H0(0))),  # 第一个点移动到 (0, 1)  
            point2.animate.move_to(axes.c2p(0, H1(0))),  # 第二个点移动到 (0, 1)  
            run_time=3  # 动画运行时间  
        )  

        self.wait(2)  # 等待 2 秒以观察点的移动  

        # 结束场景  
        self.play(FadeOut(axes), FadeOut(step_graph), FadeOut(point1), FadeOut(point2))

        在这种情况下,函数是一个很好的函数,不像第一个函数。唯一的问题是,当我们接近 时 t=0,函数向两边的不同数字移动。我们想要一种方法来区分这两个例子。 

        我们用片面的限制来做这件事。顾名思义,由于片面的限制,我们将只看到所讨论点的一面。下面是两个单面极限的定义。

右边的极限

        定义:

f(a+0)=\lim_{x \to a^{ +} } f(x)=L

\forall \epsilon >0 ,\exists \delta >0,\forall x ,0<x-a<\delta    有  |f(x)-A|<\epsilon

 前提是我们能使 f(x)的值差不多对于所有的x足够接近与 x > a,而不让x是a

左边的极限

        定义:

f(a-0)=\lim_{x \to a^{ -} } f(x)=L

\forall \epsilon >0 ,\exists \delta >0,\forall x ,-\delta<x-a<0    有  |f(x)-A|<\epsilon

前提是我们能使 f(x)的值差不多对于所有的x足够接近与 x< a,而不让x是a

         注意,符号的变化非常小,如果您不注意,实际上可能会错过。唯一的区别是位在限制的“lim”部分之下。对于右极限x \mapsto a^{+},(注意“+”)这意味着我们知道只会看 x>a 。同样的,对于右极限x \mapsto a^{1},(注意“-”)这意味着我们知道只会看 x<a。

此外,请注意,与“正常”极限(即前一节的极限)一样,我们仍然需要函数稳定到单个数字,以便极限存在。唯一不同的是,这个函数只需要在 的右边取一个数字 x=a 或者说x的左边 x=a 这取决于我们正在处理的单边限制。

        所以,当我们看极限的时候我们要特别注意看我们是在做一个正常的极限还是一个单面极限。现在我们来看一下上一节的一些问题看看单面极限,而不是一般极限。 

             

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

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

相关文章

Redis基本全局命令

文章目录 get和setkeysexistsdelexpirettltype redis全局命令&#xff1a; redis支持很多种数据结构&#xff0c;整体上来说。redis是键值对结构&#xff0c;key固定就是字符串&#xff0c;value实际上就会有很多种&#xff0c;比如说&#xff1a; 字符串哈希表列表有序集合 …

linux系统编程-网络-tcp(29)

C/S B/S P2p模型 在Linux系统编程中&#xff0c;C/S&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09;和B/S&#xff08;Browser/Server&#xff0c;浏览器/服务器&#xff09;模型是两种常见的架构模式&#xff0c;用于构建分布式应用程序。它们在设计和实现上…

C语言 | Leetcode C语言题解之第384题打乱数组

题目&#xff1a; 题解&#xff1a; typedef struct {int* num;int* src;int numsize; } Solution;Solution *obj NULL;Solution* solutionCreate(int* nums, int numsSize) {if (obj ! NULL) {return obj;}Solution *obj (Solution*)malloc(sizeof(Solution));obj->nums…

#C++ 笔记二

四、运算符重载 1.友元 1.1 概念 类实现了数据的隐藏和封装&#xff0c;类的数据成员一般定义为私有成员&#xff0c;仅能通过类的公有成员函数才能进行读写。 如果数据成员定义成公共的&#xff0c;则又破坏了封装性。但是在某些情况下&#xff0c;需要频繁的读写数据成员…

Java 7.3 - 分布式 id

分布式 ID 介绍 什么是 ID&#xff1f; ID 就是 数据的唯一标识。 什么是分布式 ID&#xff1f; 分布式 ID 是 分布式系统中的 ID&#xff0c;它不存在于现实生活&#xff0c;只存在于分布式系统中。 分库分表&#xff1a; 一个项目&#xff0c;在上线初期使用的是单机 My…

2-80 基于matlab-GUI,实现kalman滤波对目标物的位置进行检测跟踪

基于matlab-GUI,实现kalman滤波对目标物的位置进行检测跟踪。检测汽车中心和最大半径&#xff0c;与背景差分选择较大差异的区域进行形态学处理&#xff0c;用冒泡法对目标面积从大到小排序。程序已调通&#xff0c;可直接运行。 2-80 kalman视频跟踪滤波 - 小红书 (xiaohongsh…

光学涡旋Talbot阵列照明器的matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 光学涡旋 Talbot 阵列照明器是一种利用光学涡旋&#xff08;Optical Vortex&#xff09;和 Talbot 效应&#xff08;Talbot Effect&#xff09;相结合的技术&…

【HTML源码】上传即可使用的在线叫号系统源码

这个叫号系统的过程是这样的 接了一个任务&#xff0c;某学校要对学生进行逐个面试&#xff0c;希望能有类似医院门诊那种叫号系统。 条件&#xff1a;首先说硬件&#xff0c;就是教室里边一台笔记本电脑&#xff0c;同屏到教室外面的电视机。 需求&#xff1a;软件需求是可…

汉诺塔递归解决思路图解分析,python代码实现

目录 4.假设四层汉诺塔&#xff0c;n4&#xff0c;利用整体思想分解为两层的情况 3.分解到n3 3.1 分解上面n4时第一个步骤&#xff1a; 3.2 分解上面n4时第三个步骤&#xff1a; 2.继续分解到n2 &#xff08;同理略&#xff09; 1.当分解到n1 python代码 问题&#xff1…

【Linux】升级OpenSSH版本规避远程代码执行漏洞

本文首发于 ❄️慕雪的寒舍 升级OpenSSH版本规避远程代码执行漏洞。 说明 今天早上逛别人的博客的时候看到了这个重磅消息。OpenSSH爆出能远程通过root身份执行任意代码的漏洞&#xff0c;影响版本是 8.5p1 < OpenSSH < 9.8p1&#xff0c;奇安信的报告可以点我查看。 上…

计算机三级网络第4套练习记背

计算机三级网络第4套练习记背

全志/RK安卓屏一体机:医疗自助服务终端,支持鸿蒙国产化

医疗自助服务终端 为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通…

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…

day44.动态规划

718.最长重复子数组 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 思路:1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义: dp[i][j] &#xff1a;以下标i - 1为结尾的A&#xff0c;和以下标j - 1为结尾的B&…

【论文速读】|RO-SVD:一种用于 AIGC 应用的可重构硬件版权保护框架

本次分享论文&#xff1a;RO-SVD: A Reconfigurable Hardware Copyright Protection Framework for AIGC Applications 基本信息 原文作者&#xff1a;Zhuoheng Ran, Muhammad A.A. Abdelgawad, Zekai Zhang, Ray C.C. Cheung, Hong Yan 作者单位&#xff1a;香港城市大学电…

linux 内核代码学习(七)

linux内核代码的研究中断了一段时间了&#xff0c;现在又重新开始了研究&#xff0c;个人觉得linux内核的学习是没有上限的&#xff0c;总是一个温故而知新的过程&#xff0c;是一个不断积累的过程。首先还是要先搭建一个方便自己学习和研究的平台&#xff0c;经过不断的尝试&a…

Java的IO模型详解-BIO,NIO,AIO

一、BIO相关知识 Java 的 BIO (Blocking I/O) 模型是基于传统的同步阻塞 I/O 操作。在这种模型中&#xff0c;每个客户端连接都需要一个独立的线程来处理请求。当线程正在执行 I/O 操作时&#xff08;如读取或写入&#xff09;&#xff0c;它会被阻塞&#xff0c;直到操作完成…

三级_网络技术_55_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)在不改变路由表项的前提下&…

django学习入门系列之第十点《案例 用户登录》

文章目录 案例 用户登录安全认证django中的隐藏值获得用户账户密码空值 往期回顾 案例 用户登录 安全认证 ​ 如果提交数据后&#xff0c;发现并没有跳转到自己想要的界面&#xff0c;是因为django比Flask多一层 ”安全机制“ 的东西 解决方法&#xff1a; {% csrf_token %…

使用maven搭建微服务框架

徒手搭建cloud 1.认准SpringBoot,SpringCloud,SpringCloudAlibaba版本之间的对用关系 官网给出了声明&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki 2.选择好版本之后 spring bootspring cloudspring cloud alibaba2.3.12.RELEASEHoxton.SR102.2.5.REL…