既然某点处的导数就是某点处切线的斜率,这样依托于计算机的力量,今天我就把各个点的切线都画出来看看是啥样的。
分析
切线方程 :
假如画在处的切线,斜率,由斜截式方程,得
实践
由于画切线需要求斜率(也就是求导),拿出之前写的求导函数来: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()
成果:
只画一个切线没啥意思,把全部的点都画出来吧!(并没有全部)
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()
貌似这里的固化参数小技巧没有什么用了,懒得改了。-_-!
这里的函数写起来有点乱,命令式编程的缺点暴露出来了,或许改成函数式编程更好看一点。下次把函数式编程总结一下
成果:
再次感叹一下,计算机太强大了!