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

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


了解详情 >

既然某点处的导数就是某点处切线的斜率,这样依托于计算机的力量,今天我就把各个点的切线都画出来看看是啥样的。

分析

切线方程 : y=ax+by=ax+b

假如画f(x)=x2f(x)=x^2x=1x=1处的切线,斜率a=f(x)a=f'(x),由斜截式方程y=ax+by=ax+b,得b=yaxb=y-ax

实践

由于画切线需要求斜率(也就是求导),拿出之前写的求导函数来:numerical_diff

def numerical_diff(f, x):
    h = 1e-10
    return (f(x + h) - f(x)) / h


def tangent_line(f, x):
    # 斜率 = 该点导数
    a = numerical_diff(f, x)
    b = f(x) - a * x

    return lambda z: a * z + b

这里返回的lambda是为了固化前面的x参数,这样求单个点的切线就只需考虑该点了。

测试:

# 画坐标轴
# ...省略..

def fun1(x):
    return x ** 2


x_ray = np.arange(-20, 20, 0.1)
y_ray = fun1(x_ray)
# 这里实际上是做出了一个切线方程
tl = tangent_line(fun1, 1)
tangentLine = tl(x_ray)

# 生成,展示
plt.plot(x_ray, y_ray, color='red', linewidth=5)
plt.plot(x_ray, tangentLine, color='skyblue')

plt.show()

成果:

image-20210709113850005

只画一个切线没啥意思,把全部的点都画出来吧!(并没有全部)

def fun1(x):
    return x ** 2

x_ray = np.arange(-20, 20, 0.1)
y_ray = fun1(x_ray)


# 生成,展示
plt.plot(x_ray, y_ray, color='red', linewidth=5)
for i in range(-20, 20, 1):
    tl = tangent_line(fun1, i)
    tangentLine = tl(x_ray)
    plt.plot(x_ray, tangentLine, color='skyblue')
plt.show()

貌似这里的固化参数小技巧没有什么用了,懒得改了。-_-!

这里的函数写起来有点乱,命令式编程的缺点暴露出来了,或许改成函数式编程更好看一点。下次把函数式编程总结一下

成果:

image-20210709113929672

再次感叹一下,计算机太强大了!

评论