极限计算器(基础版)

前言

最近,我在重温高数极限的时候,有时自己计算极限有些耗时,我就想着利用程序代码来帮我计算,这样就能很大的程度上压缩计算时间,将更多的时间利用在极限计算原理的理解上。

因此,在我重温了高数极限计算的基础部分之后,我就着手构建程序。

对于这个程序,在我看来要从简单开始,然后一步一步的开始计算复杂的极限。于是,这个计算器要能够计算基本初等函数的极限,比如:三角函数、指出函数等等。

在这个程序中,利用数学函数极限的定义和性质来计算函数极限,在计算中我分别计算函数的正无穷处的极限和负无穷处的极限,如果两个值相等,则函数在无穷远处具有极限,极限就等于之前计算的值,反之则没有极限;如果只计算其中一处的极限,那么能计算出值就有极限,反之没有。这个计算器也能计算出趋近确切值出的函数极限。

正篇

函数极限定义和性质

一、定义

趋于有限值的极限:

设函数f(x)在点xo的一个去心邻域内有定义,如果当x趋于xo时,函数值f(x)无线接近于某个确定的值A,则此值就为函数f(x)在点xo的极限,记为:

eq?%5Clim_%7Bx%20%5Cto%20xo%7D%7Bf%28x%29%7D%3DA  或者  eq?f%28x%29%5Crightarrow%20A%28x%5Crightarrow%20xo%29

反之,A不存在,则函数f(x)没有极限,常用eq?%5Clim_%7Bx%20%5Cto%20xo%7D%7Bf%28x%29%7D不存在。

左极限和右极限:

根据上述定义我们很容易得知左极限和右极限,记为:

左极限:eq?%5Clim_%7Bx%20%5Cto%20x_%7B0%7D%5E%7B-%7D%7D%7Bf%28x%29%7D%5Cdoteq%20A     或者   eq?f%28x_%7Bo%7D%5E%7B-%7D%29%3DA

右极限:eq?%5Clim_%7Bx%20%5Cto%20x_%7Bo%7D%5E%7B+%7D%7D%7Bf%28x%29%7D%3DA     或者   eq?f%28x_%7Bo%7D%5E%7B+%7D%29%3DA

趋于无穷远处的极限:

eq?%5Clim_%7Bx%20%5Cto%20%5Cinfty%20%7D%7Bf%28x%29%7D%3DA   或者   eq?f%28x%29%5Crightarrow%20A%28x%5Crightarrow%20%5Cinfty%20%29

正无穷和负无穷的极限同上。

二、性质

1、唯一性:

如果eq?%5Clim_%7Bx%20%5Cto%20x_%7Bo%7D%7Df%28x%29存在,那么这个极限是唯一的。

2、局部有限性:

如果eq?%5Clim_%7Bx%20%5Cto%20x_%7Bo%7D%7Df%28x%29存在,那么在点eq?x_%7Bo%7D的某个去心邻域内,函数eq?f%28x%29有界。

3、局部保号性:

如果eq?%5Clim_%7Bx%20%5Cto%20xo%7D%7Bf%28x%29%7D%3DA,且eq?A%3E0(或eq?A%3C0),那么在点eq?x_%7Bo%7D的某个去心邻域内,有eq?f%28x%29%3E0(或eq?f%28x%29%3C0

定义函数计算极限

根据以上内容,我可以知道函数的极限是唯一的,那么计算函数正无穷处的极限和负无穷处的极限应当相等,得出函数在无穷远处的极限,于是在代码中发分别计算正无穷和负无穷处的极限,如果两者相等,则函数有极限,输出值;反之无极限。

如果自变量趋近某个确切的值,那么直接计算即可。

总之,计算函数极限我在代码中分为以上两种情况,趋于无穷和趋于某个特定的值。

代码展示:

def calculate_limit(expr, var, approach):
    var = sp.symbols(var)
    expr = sp.sympify(expr)
    if approach == 'oo':  # 处理无穷大
        limit_result_plus = sp.limit(expr, var, sp.oo, dir='+')
        limit_result_minus = sp.limit(expr, var, sp.oo, dir='-')
        if limit_result_plus == limit_result_minus:
            limit_result = limit_result_plus
        else:
            limit_result = '不存在或不确定'
    elif approach == '-oo':  # 处理负无穷大
        limit_result_plus = sp.limit(expr, var, -sp.oo, dir='+')
        limit_result_minus = sp.limit(expr, var, -sp.oo, dir='-')
        if limit_result_plus == limit_result_minus:
            limit_result = limit_result_plus
        else:
            limit_result = '不存在或不确定'
    else:
        limit_result = sp.limit(expr, var, float(approach))
    return limit_result

代码解释:

var和expr的代码前者是将var字符转换为sympy的符号变量,后者是将表达式字符串转换为sympy可以识别和处理的表达式。

然后就是计算无穷的情况,注意没有处理无穷大时,我没有写+,这也默认是正无穷。

在计算无穷时函数的极限,这里出现了+或-的情况,但是请注意,这里在数学上是没有意义的,可是为了保证不引入特殊情况,让代码不复杂,就这样写了,我想这几句代码写不写都无所谓。

绘制函数图像

我为了更好的分析函数,于是添加了绘制图像的功能。

函数图像的绘制的方法中有一个是五点法,于是我在代码中生成1000关于自变量x的值,然后将其代入到获取的函数表达式中计算其函数值,最终形成1000个关于x和f(x)的数组,连线而成函数图像。

代码展示:

def plot_function(expr, var, x_min, x_max):
    var = sp.symbols(var)
    expr = sp.sympify(expr)
    x = np.linspace(x_min, x_max, 1000)
    y = [expr.subs(var, x_i).evalf() for x_i in x]
    plt.plot(x, y)
    plt.xlabel(var)
    plt.ylabel('f(' + str(var) + ')')
    plt.title('函数 f(' + str(var) + ') 的图像')
    plt.grid(True)
    plt.show()

创建输入界面

做完上述工作,要更好的输入函数表达式,也不用频繁的更改代码来实现函数的变更,于是创建了一个UI界面,以便于更好的进行函数极限的运算。

代码展示:

def create_ui():
    root = tk.Tk()
    root.title("极限计算器和函数图像绘制器")

    # 创建输入框和标签
    # 输入函数表达式,注意输入时要表现数字与自变量之间的关系,比如:2x不能输入2x,要输入2*x
    expr_label = tk.Label(root, text="函数表达式 (例如 x^2, e^x, sin(x), 1/x):")
    expr_label.grid(row=0, column=0)
    expr_entry = tk.Entry(root)
    expr_entry.grid(row=0, column=1)
    # 定义自变量,因为有时计算函数的极限时,函数表达式中有字母,那就要表明其不是自变量,防止干扰计算
    var_label = tk.Label(root, text="变量 (例如 x):")
    var_label.grid(row=1, column=0)
    var_entry = tk.Entry(root)
    var_entry.grid(row=1, column=1)
    # 输入接近值时,确切的数字输入就不再赘述,输入无穷时要注意输入的是o,不是零
    approach_label = tk.Label(root, text="接近的值 (例如 1, 'oo' 表示无穷大):")
    approach_label.grid(row=2, column=0)
    approach_entry = tk.Entry(root)
    approach_entry.grid(row=2, column=1)

按钮绑定

设置了UI界面,就肯定有按钮,要让按钮发挥作用就需要为其绑定事件,当我们按下时就会触发,实现我们想要的功能。

代码展示:

 # 定义计算极限的函数
    def calculate():
        try:

            # 从UI界面获取函数表达式、自变量和趋近值
            expr = expr_entry.get()
            var = var_entry.get()
            approach = approach_entry.get()

            # 调用函数计算极限
            limit_result = calculate_limit(expr, var, approach)

            # 显示结果
            messagebox.showinfo("结果", f"当 {var} 趋近于 {approach} 时,函数的极限值为 {limit_result}")
        except Exception as e:
            messagebox.showerror("错误", str(e))

    # 创建计算按钮,用于触发极限计算
    calculate_button = tk.Button(root, text="计算极限", command=calculate)

    # 按钮放置的位置
    calculate_button.grid(row=3, column=0, columnspan=2)

    # 定义绘制函数图像的函数
    def plot():
        try:

            # 获取函数表达式和自变量
            expr = expr_entry.get()
            var = var_entry.get()
            
            x_min = float(approach_entry.get())  # 使用接近值作为x的最小值
            x_max = x_min + 10  # 设置x的最大值为接近值加10
            
            # 绘制图像
            plot_function(expr, var, x_min, x_max)
        except Exception as e:
            messagebox.showerror("错误", str(e))

    # 创建绘图按钮
    plot_button = tk.Button(root, text="绘制图像", command=plot)

    # 按钮放置位置
    plot_button.grid(row=4, column=0, columnspan=2)

效果演示

完成了主要代码的设置之后,开始验证:

6f6011a469fc4997a2dfb92bcc02480d.png

7368217745ae4d9dad4ebd68a10d8b3f.png

注意:因为代码中选取接近值作为图像的起点,如果是oo就无法画出图像,所以我直接给了一个确定的值。

感言

这段代码还不能计算很复杂的函数极限,我会加油改进,如果这段代码中有错误,请各位大佬指正,不胜感激。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值