抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

今天尝试一下在python中使用库函数求极限和求导。

求极限

sinxx(x)\frac{\sin x}{x}(x\to\infin)的python代码如下:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp


def main():
    x = sp.Symbol("x")
    f = sp.sin(x) / x
    f_limit = sp.limit(f, x, 'oo')
    print(f'f(x) = {f} 的极限是:{f_limit}')
    x_ray = np.arange(-100, 100, 0.01)
    y_ray = np.sin(x_ray) / x_ray

    # 画坐标轴
    plt.figure(figsize=(6, 5))
    ax = plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('axes', 0.5))
    # 生成,展示
    plt.plot(x_ray, y_ray)
    plt.show()
    
#
# output:
# f(x) = sin(x)/x 的极限是:0
#

通过下面的图片也可以看出x趋向于无穷大时逐渐向0靠拢。

img

求导

自制版(比较low)

根据导数的定义:导数是函数的局部性质。一个函数在某一点的导数描述了这个函数在这一点附近的变化率。如果函数的自变量和取值都是实数的话,函数在某一点的导数就是该函数所代表的曲线在这一点上的切线斜率

img

其实求导就是求该点的切线斜率,斜率 = 对边/临边。

如何求上图中P0P_0点的斜率呢?

读图可知,对边长度 = Δy\Delta y,邻边长度 = Δx\Delta x

=ΔyΔx斜边的斜率 = \frac{\Delta y}{\Delta x}

当然这里的斜边的斜率还不是P0P_0点的斜率,这里让Δx\Delta x 尽可能的小,小到P点和P0P_0 几乎接近,这时的斜率也就近似的取到P0P_0 点的斜率了。

推广到一般形式:

对边的长度 = 高点 - 低点 = f(x0+Δx)f(Δx)f(x_0 + \Delta x) - f(\Delta x)

邻边的长度 = 远点 - 近点 = (x0+Δx)x0=Δx(x_0 + \Delta x) - x_0 = \Delta x

即:

f(x0)limΔ0ΔyΔx=limΔx>0f(x0+Δx)f(x0)Δxf'(x_0) \lim_{\Delta \to 0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x->0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}

对于聪明的你,以上都是废话,直接敲代码,计算x2x^2的导数:

def numerical_diff(f, x):
    # 无穷小的值
    delta = 1e-10
    return (f(x + delta) - f(x)) / delta


def f1(x):
    return x ** 2

print(numerical_diff(f1, 2))

# output:
# 4.000000330961484

没错就是这么简单。。。

x2x^2的导数是2x,x=2带进去是4。

这里无穷小的值其实是不准确的,只能取个近似吧。

库函数版

直接上代码:

import sympy as sp

x = sp.symbols('x')
expr = sp.sin(x)
# sp.diff 求导返回结果表达式
x_d = sp.diff(expr)
print(x_d)
# 计算x=0时,sin(x)的导数
print(x_d.evalf(subs={'x': 0}))

# output:
# cos(x)
# 1.00000000000000

太厉害了,不知道怎么做到的。。。

评论