前言
最近,我在重温高数极限的时候,有时自己计算极限有些耗时,我就想着利用程序代码来帮我计算,这样就能很大的程度上压缩计算时间,将更多的时间利用在极限计算原理的理解上。
因此,在我重温了高数极限计算的基础部分之后,我就着手构建程序。
对于这个程序,在我看来要从简单开始,然后一步一步的开始计算复杂的极限。于是,这个计算器要能够计算基本初等函数的极限,比如:三角函数、指出函数等等。
在这个程序中,利用数学函数极限的定义和性质来计算函数极限,在计算中我分别计算函数的正无穷处的极限和负无穷处的极限,如果两个值相等,则函数在无穷远处具有极限,极限就等于之前计算的值,反之则没有极限;如果只计算其中一处的极限,那么能计算出值就有极限,反之没有。这个计算器也能计算出趋近确切值出的函数极限。
正篇
函数极限定义和性质
一、定义
趋于有限值的极限:
设函数f(x)在点xo的一个去心邻域内有定义,如果当x趋于xo时,函数值f(x)无线接近于某个确定的值A,则此值就为函数f(x)在点xo的极限,记为:
或者
反之,A不存在,则函数f(x)没有极限,常用不存在。
左极限和右极限:
根据上述定义我们很容易得知左极限和右极限,记为:
左极限: 或者
右极限: 或者
趋于无穷远处的极限:
或者
正无穷和负无穷的极限同上。
二、性质
1、唯一性:
如果存在,那么这个极限是唯一的。
2、局部有限性:
如果存在,那么在点的某个去心邻域内,函数有界。
3、局部保号性:
如果,且(或),那么在点的某个去心邻域内,有(或)
定义函数计算极限
根据以上内容,我可以知道函数的极限是唯一的,那么计算函数正无穷处的极限和负无穷处的极限应当相等,得出函数在无穷远处的极限,于是在代码中发分别计算正无穷和负无穷处的极限,如果两者相等,则函数有极限,输出值;反之无极限。
如果自变量趋近某个确切的值,那么直接计算即可。
总之,计算函数极限我在代码中分为以上两种情况,趋于无穷和趋于某个特定的值。
代码展示:
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)
效果演示
完成了主要代码的设置之后,开始验证:
注意:因为代码中选取接近值作为图像的起点,如果是oo就无法画出图像,所以我直接给了一个确定的值。
感言
这段代码还不能计算很复杂的函数极限,我会加油改进,如果这段代码中有错误,请各位大佬指正,不胜感激。