贝利信息

PyTorch 教程:高效拼接张量模拟布朗运动轨迹

日期:2026-01-17 00:00 / 作者:碧海醫心

本文详解如何使用 `torch.cat` 动态构建布朗运动路径张量,避免原地修改导致的内存共享问题,并输出形状为 `(n_points, n_steps)` 的完整轨迹矩阵。

在 PyTorch 中模拟多起点布朗运动时,一个常见误区是试图用列表累积修改后的张量(如 x += ...),这会导致所有元素引用同一内存地址,最终路径失去时间演化特征。正确做法是逐步创建新张量并安全拼接

核心解决方案是使用 torch.cat,它沿指定维度连接一系列张量。注意:所有待拼接张量必须具有相同的除拼接维外的所有维度大小。

以下为修正后的完整实现(已适配最新 PyTorch 与 NumPy 兼容性):

import torch
import numpy as np

def brownian_motion(x, t, dt):
    """
    生成多起点一维布朗运动轨迹

    Args:
        x (Tensor): 初始位置向量,shape = (n_points, 1) 或 (n_points,)
        t (float): 总模拟时间
        dt (float): 时间步长

    Returns:
        Tensor: 轨迹矩阵,shape = (n_points, k+1),列对应 t=0, dt, 2dt, ..., t
    """
    k = 

int(t / dt) # 初始化路径:起始点 x(保持原始 shape) path = [x.clone() if x.requires_grad else x.detach().clone()] for _ in range(k): # 生成标准正态增量:shape 同 x dW = torch.normal(mean=0.0, std=1.0, size=x.shape, dtype=x.dtype, device=x.device) # 累积更新:x_{i+1} = x_i + sqrt(dt) * dW_i next_x = path[-1] + torch.sqrt(torch.tensor(dt, dtype=x.dtype, device=x.device)) * dW path.append(next_x) # 沿最后一维(dim=-1)水平拼接 → 得到 (n_points, k+1) return torch.cat(path, dim=-1) # 示例用法 data = torch.normal(0, 1, size=(1, 3)) dataset = data.T.float() # shape: (3, 1) print("初始位置:") print(dataset) trajectory = brownian_motion(dataset, t=0.02, dt=0.01) print("\n布朗运动轨迹(t=0, 0.01, 0.02):") print(trajectory) # 输出形如: # tensor([[-2.1445, -2.1035, -2.1022], # [-1.3322, -1.3121, -1.3210], # [-0.6355, -0.6156, -0.5999]])

关键要点总结

该方法扩展性强——只需调整 dW 的生成逻辑(如加入漂移项、相关性协方差矩阵),即可支持几何布朗运动、Ornstein-Uhlenbeck 过程等更复杂随机微分方程的离散模拟。