2.4微积分

%matplotlib inline
import numpy as np
from matplotlib_inline import backend_inline
from d2l import torch as d2l


def f(x):
    return 3 * x ** 2 - 4 * x
  • %matplotlib inline:这是一个Jupyter Notebook的魔法命令,它告诉Jupyter Notebook在输出结果中显示Matplotlib绘图的结果,并将这些图形嵌入到Notebook中。

  • import numpy as np:这是导入NumPy库,并将其命名为np,以便在代码中使用NumPy的函数和方法。

  • from matplotlib_inline import backend_inline:这是从matplotlib_inline库中导入backend_inline模块。backend_inline模块提供了在Jupyter Notebook中绘制Matplotlib图形的功能。

  • from d2l import torch as d2l:这是从d2l库中导入torch模块,并将其命名为d2ld2l库是《动手学深度学习》一书的配套代码库,提供了一些用于深度学习的实用函数和工具。

  • def f(x)::这是一个函数定义,它定义了一个名为f的函数,该函数接受一个参数x

  • return 3 * x ** 2 - 4 * x:这是函数体,它使用输入的x计算一个值,并将其作为函数的返回值。在这个例子中,函数计算了3 * x的平方减去4 * x的值,并将结果返回。

这段代码的作用是定义了一个简单的二次函数f(x),并导入了一些常用的库和模块,以便在后续的代码中使用它们。


def numerical_lim(f, x, h):
    return (f(x + h) - f(x)) / h

h = 0.1
for i in range(5):
    print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}')
    h *= 0.1
  • def numerical_lim(f, x, h)::这是一个函数定义,它定义了一个名为numerical_lim的函数,该函数接受三个参数fxh

  • return (f(x + h) - f(x)) / h:这是函数体,它使用输入的fxh计算一个值,并将其作为函数的返回值。在这个例子中,函数计算了f(x + h) - f(x)除以h的值,并将结果返回。

  • h = 0.1:这是一个赋值语句,它将0.1赋值给变量h

  • for i in range(5)::这是一个循环语句,它会执行下面缩进的代码块5次。

  • print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}'):这是一个打印语句,它会将一些文本和变量的值打印到控制台。在这个例子中,它打印了h的值和通过调用numerical_lim函数计算得到的数值极限值。

  • h *= 0.1:这是一个赋值语句,它将h乘以0.1的值再赋给h。这个操作会使h的值逐渐减小,用于计算不同步长下的数值极限值。

这段代码的作用是计算一个函数在不同步长下的数值极限值。它首先定义了一个函数numerical_lim,然后使用一个循环来计算并打印不同步长下的数值极限值。


def use_svg_display():  #@save
    """使用svg格式在Jupyter中显示绘图"""
    backend_inline.set_matplotlib_formats('svg')
  • backend_inline.set_matplotlib_formats('svg'):这是一个函数调用语句,它调用了backend_inline模块的set_matplotlib_formats函数,并将字符串'svg'作为参数传递给该函数。这个函数调用的作用是设置Matplotlib绘图库在Jupyter Notebook中使用SVG格式显示图形。

  • 注意,注释#@save是一个特殊的标记,会将对应的函数、类或语句保存在d2l包中。 因此,以后无须重新定义就可以直接调用它们(例如,d2l.use_svg_display())。
    def set_figsize(figsize=(3.5, 2.5)):  #@save
        """设置matplotlib的图表大小"""
        use_svg_display()
        d2l.plt.rcParams['figure.figsize'] = figsize

    我们定义set_figsize函数来设置图表大小。 注意,这里可以直接使用d2l.plt,因为导入语句 from matplotlib import pyplot as plt已标记为保存到d2l包中。

  • d2l.plt.rcParams 是 Matplotlib 的全局配置对象,用于设置各种默认参数。
  • ['figure.figsize'] 是配置对象中的一个属性,用于设置图表的大小。
  • = 是赋值操作符,将 figsize 的值赋给 d2l.plt.rcParams['figure.figsize']

这行代码将 figsize 的值设为了 d2l.plt.rcParams['figure.figsize'],即将默认图表大小设置为 figsize。这样,在后续的绘图操作中,如果没有显式指定图表大小,就会使用这个默认值。


#@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
    """设置matplotlib的轴"""
    axes.set_xlabel(xlabel)
    axes.set_ylabel(ylabel)
    axes.set_xscale(xscale)
    axes.set_yscale(yscale)
    axes.set_xlim(xlim)
    axes.set_ylim(ylim)
    if legend:
        axes.legend(legend)
    axes.grid()

  • axes.set_xlabel(xlabel):设置X轴的标签。
  • axes.set_ylabel(ylabel):设置Y轴的标签。
  • axes.set_xscale(xscale):设置X轴的刻度。
  • axes.set_yscale(yscale):设置Y轴的刻度。
  • axes.set_xlim(xlim):设置X轴的范围。
  • axes.set_ylim(ylim):设置Y轴的范围。
  • if legend::检查legend是否为真。
  • axes.legend(legend):显示图例。
  • axes.grid():显示网格线

#@save
def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
         ylim=None, xscale='linear', yscale='linear',
         fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):
    """绘制数据点"""
    if legend is None:
        legend = []

    set_figsize(figsize)
    axes = axes if axes else d2l.plt.gca()

    # 如果X有一个轴,输出True
    def has_one_axis(X):
        return (hasattr(X, "ndim") and X.ndim == 1 or isinstance(X, list)
                and not hasattr(X[0], "__len__"))

    if has_one_axis(X):
        X = [X]
    if Y is None:
        X, Y = [[]] * len(X), X
    elif has_one_axis(Y):
        Y = [Y]
    if len(X) != len(Y):
        X = X * len(Y)
    axes.cla()
    for x, y, fmt in zip(X, Y, fmts):
        if len(x):
            axes.plot(x, y, fmt)
        else:
            axes.plot(y, fmt)
    set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)

1.

- `X`:数据点的x坐标,可以是一个列表或者一个数组。
- `Y`:数据点的y坐标,可以是一个列表或者一个数组。如果`Y`为`None`,则默认使用`X`作为y坐标。
- `xlabel`:x轴的标签。
- `ylabel`:y轴的标签。
- `legend`:图例的标签,可以是一个列表。
- `xlim`:x轴的取值范围。
- `ylim`:y轴的取值范围。
- `xscale`:x轴的缩放类型,默认为线性缩放。
- `yscale`:y轴的缩放类型,默认为线性缩放。
- `fmts`:数据点的样式,可以是一个字符串或者一个字符串的列表。默认为`('-', 'm--', 'g-.', 'r:')`。
- `figsize`:图表的大小,用一个元组表示,默认为`(3.5, 2.5)`。
- `axes`:绘图的`Axes`对象。如果为`None`,则默认使用当前的`Axes`对象。

2.

如果legend参数为None,则将其设置为空列表。

3.

axes参数表示绘图的Axes对象,如果为None,则默认使用当前的Axes对象。

接下来,代码使用了一个三元表达式来判断axes参数是否为None。如果axes不为None,则将axes赋值给axes,即axes = axes;如果axesNone,则调用d2l.plt.gca()函数获取当前的Axes对象,并将其赋值给axes

d2l.plt.gca()函数是matplotlib.pyplot模块中的一个函数,用于获取当前的Axes对象。gca是"get current axes"的缩写。当我们在绘图时没有指定Axes对象时,matplotlib会自动创建一个Axes对象,并将其设置为当前的Axes对象。因此,gca函数可以获取到当前的Axes对象。

最终,通过这行代码,我们可以获取到一个有效的Axes对象,用于后续的绘图操作                                                   

4.

has_one_axis函数用于判断一个对象X是否只有一个轴。

首先,函数使用了一个条件表达式来判断X是否具有属性ndim,并且ndim的值是否为1。ndimnumpy中的一个属性,用于表示数组的维度数。如果X是一个numpy数组,并且它的维度数为1,则条件表达式的值为True;否则为False

接下来,函数使用了一个条件表达式来判断X是否为一个列表,并且列表的第一个元素不具有属性__len____len__是一个特殊方法,用于返回对象的长度。如果X是一个列表,并且列表的第一个元素不具有__len__属性,则条件表达式的值为True;否则为False

最终,函数的返回值为两个条件表达式的逻辑或运算结果。如果其中任意一个条件表达式的值为True,则函数返回True;否则返回False

通过这个函数,我们可以判断一个对象是否只有一个轴,即判断它是否为一维数组或列表中的一个元素

  5.

if has_one_axis(X):
        X = [X]

如果X只有一个轴,将其转换为一个列表。

 6.

if Y is None:
        X, Y = [[]] * len(X), X
elif has_one_axis(Y):
        Y = [Y]

如果YNone,则将X转换为一个空列表的列表,并将X赋值给Y;如果Y只有一个轴,则将其转换为一个列表。

 7.

 if len(X) != len(Y):
        X = X * len(Y)

如果XY的长度不相等,则将X复制多次,使其长度与Y相等

8.

axes.cla()

清除当前的Axes对象。

9.

for x, y, fmt in zip(X, Y, fmts):
        if len(x):
            axes.plot(x, y, fmt)
        else:
            axes.plot(y, fmt)

代码使用zip()函数将XYfmts三个列表的对应元素进行配对,得到一个迭代器。zip()函数将每个列表的第i个元素组合成一个元组(X[i], Y[i], fmts[i]),并返回一个包含这些元组的迭代器。

接下来,代码使用for循环遍历这个迭代器中的每个元组,依次赋值给变量xyfmt

在每次循环中,代码使用一个条件语句判断x的长度是否大于0,即len(x)是否为非零值。如果x的长度大于0,则说明x是一个非空列表,可以直接使用axes.plot(x, y, fmt)来绘制线图。其中,xy分别表示横坐标和纵坐标的数据,fmt表示线图的格式。

如果x的长度为0,则说明x是一个空列表,无法用作横坐标数据。此时,代码使用axes.plot(y, fmt)来绘制线图,将y作为纵坐标数据,fmt作为线图的格式。

通过这段代码,可以根据给定的数据和格式,在指定的Axes对象上绘制线图。如果x不为空,则绘制xy的线图;如果x为空,则只绘制y的线图

10.

代码使用np.arange()函数创建一个从0到3(不包括3),步长为0.1的一维数组,并将其赋值给变量x。这个数组包含了从0到2.9的一系列数值。

接下来,代码调用plot()函数,传入三个参数:x[f(x), 2 * x - 3]'x'。其中,x是横坐标数据,[f(x), 2 * x - 3]是纵坐标数据,'x'是线图的格式。这个函数调用的目的是绘制xf(x)的线图,以及x2 * x - 3的线图。

最后,代码使用legend参数来添加图例。legend参数是一个列表,包含了两个字符串:'f(x)''Tangent line (x=1)'。这个参数的作用是为绘制的线图添加图例,分别表示f(x)和在点(1, f(1))处的切线。

通过这段代码,我们可以在一个图中同时绘制函数f(x)和它在点(1, f(1))处的切线,并添加相应的图例。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值