首页 > 其他分享 >用manim证明函数的左右极限

用manim证明函数的左右极限

时间:2024-08-30 11:50:35浏览次数:12  
标签:cos 函数 point1 0.1 self axes 极限 np manim

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 这取决于我们正在处理的单边限制。

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

             

标签:cos,函数,point1,0.1,self,axes,极限,np,manim
From: https://blog.csdn.net/qq_45449625/article/details/141692464

相关文章

  • 常用函数
    一、常用日期函数1.unix_timestamp:返回当前或指定时间的时间戳selectunix_timestamp();selectunix_timestamp("2020-10-28",'yyyy-MM-dd');2.from_unixtime:将时间戳转为日期格式selectfrom_unixtime(1603843200);3.current_date:当前日期selectcurrent_date......
  • DBA_oracle日期函数-【来自多个项目】
    selectTO_DATE(trunc(F_GXSJ),'YYYY-MONTH-DD')fromfsxx_dx_log_newwheretrunc(F_GXSJ)=TO_DATE()selecttrunc(F_GXSJ)fromfsxx_dx_log_new--2012-10-26selectSUBSTR(TO_CHAR(trunc(F_GXSJ),'YYYY-MM-DD'),6,2)fromfsxx_dx_......
  • Makefile编写2--使用变量,函数
    一、使用变量1、变量值的替换其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾的“a”替换成“b”字串。2、把变量的值再当成变量x=yy=za:=$($(x))3、override指示符如果有变量是通常make的命令行参数设置的,那么......
  • C++学习随笔——委托构造函数
    C++11中,引入了委托构造函数(delegatingconstructors)的概念。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以减少代码重复。 委托构造函数的语法:classMyClass{public:MyClass(intx):value(x){//这个构造函数初始化value}M......
  • sql函数
    1.presto:1.array_position(applist_install,'com.funtomic.matchmasters')>02.split('joyit_daily_mas_cleaner','_')[3]—>presto从1开始计位(spark从0开始计位)3.日期diff:1.DATE_DIFF('day',DATE_PARSE('20220301&#......
  • 开窗函数汇总
    Function(arg1)over(partitionbyargorderbyarg<windows_expression>)1.窗口函数over()后面的为窗口函数,sum这种为分析函数.over():指定分析函数工作的数据窗口大小,窗口会随着行进行变化.window_express:窗口的边界设置.默认:[rowsbetweenunbo......
  • 禁用时钟中断并不直接保证中断处理函数能够不受时钟干扰即时执行
    实际上,关闭系统定时器(或更准确地说是禁用时钟中断)并不直接保证中断处理函数能够“不受时钟干扰即时执行”。相反,这种做法可能会带来一系列问题,包括影响系统的任务调度、时间管理、以及可能破坏其他依赖于时钟中断的功能。在Linux系统中,时钟中断(也称为节拍器中断或tick中断)扮演着......
  • C语言基础——函数详解
    目录 函数的概述1函数的概念2函数的意义 函数的定义和使用1函数的定义2函数的调用2.1在同一文件中函数定义后函数调用2.2在同一文件中函数定义前函数调用2.3调用其它文件中定义的函数2.3.1在函数调用文件中进行声明2.3.2在头文件中进行函数的声明 函......
  • 各种注意力评分函数的实现
    预备知识本文基于MXNet进行实现,需要对于注意力机制有一定初步了解。也需要对Python有足够了解。另外这里稍加说明,在注意力机制中,本质上是“注意”的位置,即加权计算后进行Softmax回归的结果。在Nadaraya-Watson核回归中,首先具有一个键值对(key-value),输入称为一个查询(query),对于......
  • 29:函数查询,添加,修改,删除
    #_*_coding:utf-8_*_importosdeffile_handle(filename,backend_data,record_list=None,type='fetch'):#type:fetchappendchangenew_file=filename+'_new'bak_file=filename+'_bak'iftype=='fetch':......