Shortcuts

torch.trapezoid

torch.trapezoid(y, x=None, *, dx=None, dim=-1) 张量

计算沿dim梯形法则。默认情况下,假设元素之间的间距为1,但可以使用dx来指定不同的常数间距,并且可以使用x来指定沿dim的任意间距。

假设 y 是一个一维张量,其元素为 y0,y1,...,yn{y_0, y_1, ..., y_n}, 默认的计算方式是

i=1n112(yi+yi1)\begin{aligned} \sum_{i = 1}^{n-1} \frac{1}{2} (y_i + y_{i-1}) \end{aligned}

当指定 dx 时,计算变为

i=1n1Δx2(yi+yi1)\begin{aligned} \sum_{i = 1}^{n-1} \frac{\Delta x}{2} (y_i + y_{i-1}) \end{aligned}

有效地将结果乘以 dx。当 x 被指定时, 假设 x 也是一个一维张量, 元素为 x0,x1,...,xn{x_0, x_1, ..., x_n},计算变为

i=1n1(xixi1)2(yi+yi1)\begin{aligned} \sum_{i = 1}^{n-1} \frac{(x_i - x_{i-1})}{2} (y_i + y_{i-1}) \end{aligned}

xy 具有相同大小时,计算如上所述,不需要广播。 当它们的大小不同时,此函数的广播行为如下。对于 xy,函数计算沿维度 dim 的连续元素之间的差异。这实际上创建了两个张量,x_diffy_diff,它们与原始张量具有相同的形状,除了沿维度 dim 的长度减少了 1。 之后,这两个张量一起广播以计算最终输出,作为梯形规则的一部分。 有关详细信息,请参见下面的示例。

注意

梯形法则是一种通过平均函数的左黎曼和和右黎曼和来近似定积分的技术。随着分区分辨率的增加,近似的准确性也会提高。

Parameters
  • y (张量) – 计算梯形法则时使用的值。

  • x (张量) – 如果指定,定义如上所述的值之间的间距。

Keyword Arguments
  • dx (float) – 值之间的常数间距。如果既没有指定 x 也没有指定 dx,则默认为 1。实际上会将结果乘以其值。

  • dim (int) – 计算梯形法则的维度。默认是最后一个(最内层)维度。

示例:

>>> # 计算一维梯形法则,间距隐含为1
>>> y = torch.tensor([1, 5, 10])
>>> torch.trapezoid(y)
tensor(10.5)

>>> # 直接计算相同的梯形法则以验证
>>> (1 + 10 + 10) / 2
10.5

>>> # 计算一维梯形法则,间距为2
>>> # 注意:结果与之前相同,但乘以2
>>> torch.trapezoid(y, dx=2)
21.0

>>> # 计算一维梯形法则,间距任意
>>> x = torch.tensor([1, 3, 6])
>>> torch.trapezoid(y, x)
28.5

>>> # 直接计算相同的梯形法则以验证
>>> ((3 - 1) * (1 + 5) + (6 - 3) * (5 + 10)) / 2
28.5

>>> # 计算3x3矩阵每行的梯形法则
>>> y = torch.arange(9).reshape(3, 3)
tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
>>> torch.trapezoid(y)
tensor([ 2., 8., 14.])

>>> # 计算矩阵每列的梯形法则
>>> torch.trapezoid(y, dim=0)
tensor([ 6., 8., 10.])

>>> # 计算3x3全1矩阵每行的梯形法则
>>> # 使用相同的任意间距
>>> y = torch.ones(3, 3)
>>> x = torch.tensor([1, 3, 6])
>>> torch.trapezoid(y, x)
array([5., 5., 5.])

>>> # 计算3x3全1矩阵每行的梯形法则
>>> # 使用每行不同的任意间距
>>> y = torch.ones(3, 3)
>>> x = torch.tensor([[1, 2, 3], [1, 3, 5], [1, 4, 7]])
>>> torch.trapezoid(y, x)
array([2., 4., 6.])