Python求函数导数并绘制切线

下面我们通过Python来求函数y = 0.01x**2 + 0.1*x的导数,并绘制函数图像以及函数在某一点的切线。

首先,我们给出导数的数学定义式:

其次,我们先来写一写函数导数的实现代码。一般来说,求导数我们可能会采用下面这样的代码:

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

其中的h = 10e-50是用来表达“微小变化”。但实际上,这样的表达会有两个问题,一个是会产生“舍入误差”, 另一个是虽然上述实现中计算了函数f在x+h和x之间的差分,但是这个计算从一开始就有误差,真的导数(真的切线)和上述实现中得到的导数的值在严格意义上并不一致,这个差异的出现是因为h不可能无限接近于0。

为了减小这个误差,我们可以计算f在(x+h)和(x-h)之间的差分。因为这种方法以x为中心,计算它左右两边的差分,所以也称为中心差分(而(x+h)和x之间的差分称为前向差分)。

下面是中心差分的实现代码:

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

接下来我们用中心差分对简单函数进行求导,并绘制其在某一点的函数:

import numpy as np



def function_1(x):
    return 0.01*x**2 + 0.1*x


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


def tangent_line(f, x):
    d = numerical_diff(f, x)
    y = f(x) - d*x
    return lambda t: d*t - y


x = np.arange(0.0, 20.0, 0.1)
y1 = function_1(x)

tf = tangent_line(function_1, x)
y2 = tf(x)

plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y1)
plt.plot(x, y2)
plt.show()
    

Python求函数导数并绘制切线_第1张图片

 

你可能感兴趣的:(深度学习学习笔记,python,开发语言)