当前位置: 首页 > article >正文

张量网络MPS/MPO求解粘性Burgers方程:突破CFD维度灾难的量子启发方法

1. 项目概述当张量网络遇上流体方程在计算流体力学CFD领域我们每天都在和维度灾难作斗争。想象一下你要模拟一个三维湍流场每个空间方向离散成100个点时间再取100步那么整个系统的自由度就是100^3 * 100 1亿个。这还只是最基础的网格实际工程问题动辄千万甚至上亿的网格点直接存储和计算整个状态向量对内存和算力都是天文数字。这就是所谓的“维度诅咒”——问题的复杂度随着维度增加呈指数级爆炸。传统的有限差分法FDM、有限体积法FVM虽然成熟但在面对高维、多尺度问题时常常力不从心。近年来一个从量子多体物理领域“跨界”而来的工具——张量网络Tensor Network, TN为我们提供了新的思路。其核心思想矩阵乘积态Matrix Product State, MPS本质上是一种数据压缩技术。它不存储完整的、臃肿的高维数组而是将其分解为一串低秩的小张量称为“核心”或“位点张量”的乘积。这就像用乐高积木搭建一个复杂模型你不需要记住整个模型的每一个原子位置只需要知道如何用有限的几种积木块核心张量和连接规则键维数来组合它。我最初接触MPS是为了处理量子自旋链的基态计算但很快意识到这种对高维信息进行“智能压缩”的思想完全可以迁移到CFD中。许多流体场特别是那些具有光滑性或局部相关性的场比如层流、大尺度结构主导的流动其信息本质上是低秩的可以被高效压缩。粘性Burgers方程就是一个绝佳的试金石它虽然形式简单一维非线性对流扩散方程却包含了流体模拟中两个最核心的物理过程——非线性对流和耗散扩散并且能产生激波等复杂结构是检验新数值方法鲁棒性的经典算例。本文将手把手带你走通基于MPS和**矩阵乘积算子Matrix Product Operator, MPO**求解周期性边界条件下粘性Burgers方程的全过程。这不是一篇充满数学符号的论文复述而是一个从业者的实战笔记。我会重点分享在实现过程中如何将连续的微分方程“翻译”成张量网络的语言如何构建高效的MPO来表示微分算子以及在时间推进中如何平衡计算精度与效率。你会发现这套量子启发的框架在经典计算机上就能带来显著的内存和计算优势。2. 核心思路与方案设计为何选择MPS/MPO在深入代码和公式之前我们必须先想清楚为什么是MPS和MPO面对一个偏微分方程PDE我们有无数的数值方法可选从经典的FDM、FEM到近年热门的物理信息神经网络PINN。MPS/MPO方案的价值主张究竟是什么2.1 从“网格存储”到“关联存储”的范式转变传统CFD方法如FDM的思维是“网格中心化”的。我们将空间离散成N个网格点解向量u就是一个长度为N的数组。任何操作无论是求导还是非线性乘法都直接作用在这个庞大的数组上。当N很大时存储和计算O(N)甚至O(N^2)的矩阵向量乘法就成为了瓶颈。MPS带来了一种“关联中心化”的思维。它不再显式存储每个点的值而是存储点与点之间的关联信息。一个L-位点的MPS其状态由L个核心张量 {A^[1], A^[2], ..., A^[L]} 表示。每个核心张量 A^[k] 有三个索引一个物理索引 i_k对应该网格点的可能状态在二进制编码下就是0或1以及两个虚拟索引或称键索引α_{k-1} 和 α_k。键维数 χ_k 的大小直接量化了位点k与位点k1之间纠缠或关联的强度。核心洞见对于大多数物理场特别是那些变化平滑或具有局部相关性的场远离的网格点之间的关联很弱。这意味着我们只需要一个较小的键维数 χ就能以极高的精度捕获整个场的信息。存储开销从O(N)降为O(L * d * χ^2)其中d是每个位点的物理维度二进制编码下d2。当N很大时N2^L这种压缩是指数级的。2.2 MPO将算子也“网络化”光压缩状态还不够我们还需要高效地对压缩后的状态进行操作比如计算导数∂u/∂x。如果我们将导数矩阵D一个N×N的庞大矩阵直接作用在MPS上会首先需要将MPS恢复成完整向量这便失去了压缩的意义。MPO正是为解决这一问题而生。它将大型线性算子如微分算子、哈密顿量也表示成一个张量网络。对于周期性边界条件下的中心差分格式一阶和二阶导数算子可以构造为键维数仅为3的精确MPO。这意味着应用一个微分算子到MPS上MPO MPS只需要进行一系列局部的小张量收缩其计算复杂度与键维数χ的多项式相关而不是网格点数N。这是实现高效时间演化的关键。2.3 针对粘性Burgers方程的定制化流程我们的目标方程是经典的粘性Burgers方程∂u/∂t u * ∂u/∂x ν * ∂²u/∂x²在周期性边界条件x ∈ [0, 1]初始条件u(x,0) sin(2πx)下求解。采用MPS/MPO框架求解可以拆解为四个逻辑清晰的步骤我称之为“D-T-E-D”流程离散化Discretization将连续的PDE用有限差分法离散到网格上得到离散的更新方程u_{t1} u_t Δt * L(u_t)。张量化Tensorization将离散后的状态向量u重塑reshape为一个高阶张量并利用SVD分解将其压缩为MPS格式。同时将离散的微分算子构建为MPO。演化Evolution在MPS表示下执行时间步进。每一步都需要计算L(u_t) -u_t · (D1 u_t) ν * (D2 u_t)这涉及MPS与MPO的收缩、MPS之间的哈达玛积点乘以及MPS的加法。每一步操作后都需要进行截断以控制键维数增长。解码Decoding将演化后的MPS重新收缩contract回完整的网格向量以便进行可视化、误差分析或作为下一步迭代的输入。这个流程将传统CFD的数值离散与张量网络的数据压缩技术紧密结合形成了一套自洽的求解器框架。接下来我们将深入每个步骤的魔鬼细节。3. 第一步空间离散化与算子构造一切始于网格。我们选择在空间域[0, 1]上使用均匀网格网格点数N 2^L。这里选择2的幂次方并非必须但为了后续的二进制编码和张量重塑操作更加自然和高效这通常是一个好习惯。网格间距Δx 1/N。3.1 离散格式的选择与实现对于时间推进我们采用最简单的显式欧拉法。这不是一个高精度的时间积分方案但其形式简单便于我们专注于空间离散和张量网络操作的原理。更新规则为u_{t1} u_t Δt * L(u_t)其中空间算子L(u) -u · ∂u/∂x ν ∂²u/∂x²。空间导数的离散是关键。为了保证数值稳定性和精度我们采用二阶中心差分格式一阶导数对流项(∂u/∂x)_i ≈ (u_{i1} - u_{i-1}) / (2Δx)二阶导数扩散项(∂²u/∂x²)_i ≈ (u_{i-1} - 2u_i u_{i1}) / (Δx)²这些差分格式可以写成矩阵形式。以一阶导数为例它对应一个循环矩阵D1因为周期性边界条件u_{N1} u_1,u_0 u_ND1 (1/(2Δx)) * [ 0 1 0 ... 0 -1 ] [-1 0 1 ... 0 0 ] [ 0 -1 0 ... 0 0 ] ... ... ... ... ... ... [ 0 0 0 ... 0 1 ] [ 1 0 0 ... -1 0 ]类似地二阶导数矩阵D2也是一个循环三对角矩阵。实操心得稳定性条件CFL条件显式欧拉法是有条件稳定的。对于对流扩散方程时间步长Δt需要同时满足对流和扩散的稳定性限制。一个经验性的条件是Δt ≤ min( CFL * Δx / max|u|, 0.5 * Δx² / ν )其中CFL数通常取0.5左右。在代码中务必在循环开始前计算并验证Δt的取值否则计算会迅速发散。这是我早期调试时踩过的一个大坑——结果直接“爆炸”NaN。3.2 非线性项的处理技巧Burgers方程的非线性项u · ∂u/∂x在离散后是逐点乘法哈达玛积(u · (D1 u))_i u_i * (D1 u)_i。 在传统向量运算中这很简单。但在MPS框架下我们需要计算两个MPS代表u和D1 u的逐点乘积。这引出了MPS的一个核心操作局部直积Local Kronecker Product。假设我们已经有了代表场u的MPS以及通过MPO作用得到的代表∂u/∂x的MPS。那么计算它们的哈达玛积理论上需要对每个位点k将两个核心张量A_u^[k]和A_∂u^[k]在物理指标上进行直积W^[k]_{α,β, (i_k, j_k)} A_u^[k]_{α, i_k, γ} ⊗ A_∂u^[k]_{γ, j_k, β}但这会产生一个新的、物理维度为d^2的张量。为了保持物理维度为d代表单个场我们需要一个“对角映射”只取i_k j_k的分量。更高效的做法是在完成D1MPO对uMPS的作用后直接对结果MPS的每个核心张量进行缩放缩放因子来自uMPS在该位点的期望值不这不对。实际上我们需要先计算v D1 u得到一个MPS然后构造一个新的MPSw使得其每个核心张量A_w^[k]满足对于物理指标i_k的每个取值其对应的张量切片是A_u^[k][:, i_k, :]和A_v^[k][:, i_k, :]的某种组合。最直接但非最优的方法是暂时将两个MPS在物理指标上直积然后通过后续的SVD截断来压缩。注意事项键维数膨胀与控制MPS的加法或哈达玛积都会导致结果MPS的键维数增长。加法使键维数近似相加哈达玛积则可能使键维数相乘。如果不加控制几步迭代后键维数就会爆炸完全丧失压缩优势。因此在每一次加法或乘法操作后必须紧跟一个SVD截断步骤将键维数压缩回预设的最大值χ_max。截断会引入误差但通过控制截断阈值丢弃小于某个奇异值的分量我们可以平衡精度和效率。4. 第二步状态与算子的张量网络表示这是整个方法最核心、也最具“量子色彩”的一步。我们要把熟悉的网格向量和差分矩阵变成张量网络的语言。4.1 从向量到MPS二进制编码与SVD分解我们有一个长度为N2^L的向量u。如何把它变成一个MPS核心思想是二进制索引。将每个网格点索引j(从0到N-1) 用L位二进制数表示j (i_1 i_2 ... i_L)_2其中每个i_k ∈ {0, 1}。这样向量u就自然地被重塑reshape为一个2×2×...×2(L个2) 的高阶张量U满足U_{i_1 i_2 ... i_L} u_j。例如L3,N8U_{000} u_0U_{001} u_1U_{010} u_2...U_{111} u_7现在我们有一个L阶张量U。MPS分解的目标是将其表示为一系列小张量核心的乘积U_{i_1 i_2 ... i_L} ≈ Σ_{α_1,...,α_{L-1}} A^[1]_{i_1, α_1} A^[2]_{α_1, i_2, α_2} ... A^[L]_{α_{L-1}, i_L}其中α_k是连接第k和第k个核心的虚拟索引其维度χ_k称为键维数。如何得到这些A^[k]最标准的方法是逐位SVD分解也称为左正则化将张量U重塑为矩阵M_{i_1, (i_2...i_L)}然后进行SVDM U * S * V^†。将左奇异矩阵U作为第一个核心A^[1]其形状为(2, χ_1)其中χ_1 ≤ 2。将S * V^†重塑为新的矩阵M_{(α_1 i_2), (i_3...i_L)}再次进行SVD。重复这个过程直到处理完所有指标。# 伪代码示意从左到右的SVD分解构建MPS def vector_to_mps(u_vector, L, max_bond_dim): 将长度为 2^L 的向量 u_vector 转化为MPS。 # 1. 重塑为2^L维张量 tensor u_vector.reshape([2]*L) cores [] remaining_tensor tensor for k in range(L-1): # 将当前张量重塑为矩阵第一个物理指标作为行其余作为列 d remaining_tensor.shape[0] matrix remaining_tensor.reshape(d, -1) # 进行截断SVD U, S, Vh np.linalg.svd(matrix, full_matricesFalse) # 根据最大键维数截断 r min(max_bond_dim, len(S)) U U[:, :r] S S[:r] Vh Vh[:r, :] # 当前核心是U形状为 (d, r) core U.reshape(d, -1) # 注意对于第一个核心虚拟索引只有一边 cores.append(core) # 更新剩余张量 diag(S) Vh并重塑以准备下一次SVD remaining_tensor np.diag(S) Vh # 重塑时将下一个物理指标维度加回来 next_physical_dim 2 remaining_tensor remaining_tensor.reshape(r*next_physical_dim, -1) # 处理最后一个核心 cores.append(remaining_tensor.reshape(-1, 2, 1)) # 最后一个虚拟索引维度为1 return cores重要提示上述代码是高度简化的教学示例。实际中MPS核心通常是3阶张量左虚拟索引、物理索引、右虚拟索引并且需要处理左右正则化等细节以保持数值稳定性。使用专业的张量网络库如Python的quimb、tensornetwork或ITensor是更可靠的选择。4.2 构建微分算子的精确MPO这是张量网络方法最精妙的部分之一。对于周期性边界条件下的中心差分格式一阶和二阶导数算子可以写成求和形式的局部算符。以二阶导数为例D2 Σ_{i1}^L I⊗...⊗h_{i,i1}⊗...⊗I其中h_{i,i1} -2 I_i ⊗ I_{i1} T^-_i ⊗ T^_{i1} T^_i ⊗ T^-_{i1}T^ |01|,T^- |10|是升降算符。这种“求和式”的结构天然对应一个键维数为3的MPO。我们可以直接写出每个位点上的MPO张量W^[k]一个4阶张量两个虚拟索引两个物理索引。对于内部位点 (2 ≤ k ≤ L-1)一阶导数算子的MPO张量可以写成如下形式在虚拟索引和物理索引的表示下W^k[a, b, i, j] 如果 a1, b1: δ(i,j) * I (单位矩阵) 如果 a1, b2: δ(i,j) * (-T^) 如果 a2, b3: δ(i,j) * (T^-) 如果 a3, b3: δ(i,j) * I 其他: 0其中a是左虚拟索引b是右虚拟索引i, j是物理输入和输出索引。边界张量W^[1]和W^[L]是行向量和列向量形式用于闭合环并施加周期性边界条件。这种构造是精确的意味着这个MPO收缩后得到的矩阵与之前定义的N×N循环矩阵D1或D2完全一致。构建它的计算成本几乎为零因为它只是一个按固定规则填充数值的小张量。# 伪代码示意构建一阶导数MPO周期性边界条件 def construct_first_derivative_mpo(L, dx): 构建键维数为3的一阶导数MPO核心列表。 # 定义局部算符在物理空间维度为2x2 I np.eye(2) T_plus np.array([[0, 1], [0, 0]]) # |01| T_minus np.array([[0, 0], [1, 0]]) # |10| scale 1.0 / (2.0 * dx) mpo_cores [] bond_dim 3 phys_dim 2 # 第一个核心 (行向量) W1 np.zeros((1, bond_dim, phys_dim, phys_dim)) W1[0, 0, :, :] I W1[0, 1, :, :] -T_plus # 注意根公式(65)第一个核心第三项是I但为了闭合环通常需要调整。 # 更常见的构造是W1[0,2,:,:] 0? 实际上需要仔细匹配边界条件。 # 这里给出一个更标准的版本参考自旋链相互作用MPO # W1[0,0,:,:] I # W1[0,1,:,:] T_minus # W1[0,2,:,:] 0? 这需要根据具体MPO公式。 # 鉴于其复杂性强烈建议查阅文献或使用库函数。 mpo_cores.append(W1) # 中间核心 for _ in range(L-2): W np.zeros((bond_dim, bond_dim, phys_dim, phys_dim)) W[0, 0, :, :] I W[1, 0, :, :] T_plus W[2, 1, :, :] T_minus W[2, 2, :, :] I mpo_cores.append(W) # 最后一个核心 (列向量) WL np.zeros((bond_dim, 1, phys_dim, phys_dim)) WL[0, 0, :, :] 0? # 需要匹配 WL[1, 0, :, :] T_minus WL[2, 0, :, :] I mpo_cores.append(WL) # 最后乘以全局系数 1/(2*dx) # 可以将系数乘到任意一个核心上或者单独处理。 return mpo_cores, scale警告MPO的精确构造需要对虚拟索引的收缩顺序有清晰的理解上述代码仅为示意可能包含错误。在实际项目中我强烈建议使用成熟的张量网络库如ITensor.jl、TeNPy中内置的MPO生成函数来构建微分算子这可以避免大量低级错误。5. 第三步时间演化与截断策略有了初始状态的MPS和微分算子的MPO我们就可以在压缩表示下进行时间演化了。演化方程是显式欧拉格式u_{new} u Δt * (- u * (D1 u) ν * (D2 u) )。在MPS框架下每一步演化需要依次进行以下操作计算对流项v D1 u将一阶导数MPO作用在MPSu上得到一个新的MPSv。操作是MPO-MPS收缩结果MPS的键维数会增长大致是MPO键维数与MPS键维数的乘积。计算非线性项w u ◦ v计算MPSu和v的逐点哈达玛积得到MPSw。这会导致键维数进一步增长两个MPS键维数的乘积。计算扩散项d D2 u将二阶导数MPO作用在MPSu上得到MPSd。线性组合计算r -w ν * d。这涉及MPS的标量乘法和加法。时间步进计算u_{new} u Δt * r。压缩截断对u_{new}进行SVD截断将其键维数压缩回预设的最大值χ_max。5.1 关键操作MPO-MPS收缩与MPS加法MPO-MPS收缩可以理解为将MPO的每个“层”与MPS的每个核心在物理指标上收缩。假设MPO核心为W^[k]_{a_{k-1}, a_k, i_k, j_k}MPS核心为A^[k]_{b_{k-1}, j_k, b_k}那么结果MPS的核心B^[k]的索引为(a_{k-1}, b_{k-1}),i_k,(a_k, b_k)。虚拟索引的维度是相乘的关系。高效的收缩算法会按顺序从左到右或从右到左进行并适时进行压缩。MPS加法两个MPSA和B相加最直接的方法是构造一个新的MPSC其每个核心C^[k]是A^[k]和B^[k]在虚拟索引方向上的直和堆叠。这会使键维数变为两者之和。加法操作本身不增加计算复杂度但会使后续操作的复杂度提高。5.2 截断精度与效率的平衡艺术截断是MPS算法的核心也是主要的误差来源。每一步操作后我们得到的中间MPS的键维数都可能膨胀。如果不加控制几步之后计算就会变得不可行。如何进行截断最常用的方法是规范化和SVD截断。我们通常将MPS转化为一种规范形式例如所有核心都是左正交或右正交的然后对中心某个键进行SVD分解。保留最大的χ_max个奇异值及其对应的奇异向量丢弃其余部分。截断误差由被丢弃的奇异值的平方和估计。如何选择χ_max这是一个超参数需要在精度和效率之间权衡。χ_max太小压缩过于剧烈丢失重要信息可能导致解失真、数值不稳定特别是对激波等尖锐特征。χ_max太大压缩效果有限计算和存储成本高。 一个实用的策略是自适应截断不固定χ_max而是设定一个奇异值截断阈值ϵ。保留所有奇异值大于ϵ * σ_max最大奇异值的分量。这样在解平滑的区域键维数会自动降低在梯度大的区域键维数会自动增加以保持精度。实操心得截断的时机与顺序不要在所有操作后才截断应在每个显著增加键维数的操作如MPO-MPS收缩、MPS乘法之后立即进行局部截断。这称为“及时截断”canonicalize然后truncate。使用规范形式在截断前确保MPS处于正确的规范形式例如对于从左到右的截断确保待截断键左侧的所有核心是左正交的。这能保证SVD分解的是该键处最重要的关联信息。监控截断误差在迭代过程中记录每一步的截断误差被丢弃的奇异值平方和。如果误差突然剧增可能是χ_max设置过小或Δt过大导致解的结构变复杂。# 伪代码示意单步时间演化高度简化忽略大量细节 def evolve_one_step(mps_u, mpo_d1, mpo_d2, dt, nu, chi_max, truncate_eps): 对MPS u执行一步显式欧拉时间推进。 # 1. 计算对流项: v D1 * u mps_v apply_mpo(mpo_d1, mps_u) # MPO-MPS收缩 mps_v truncate_mps(mps_v, chi_max, truncate_eps) # 截断 # 2. 计算非线性项: w u ◦ v (逐点乘) mps_w hadamard_product_mps(mps_u, mps_v) mps_w truncate_mps(mps_w, chi_max, truncate_eps) # 3. 计算扩散项: d D2 * u mps_d apply_mpo(mpo_d2, mps_u) mps_d truncate_mps(mps_d, chi_max, truncate_eps) # 4. 组合右端项: rhs -w nu * d mps_rhs add_mps(scalar_multiply_mps(mps_d, nu), scalar_multiply_mps(mps_w, -1.0)) mps_rhs truncate_mps(mps_rhs, chi_max, truncate_eps) # 5. 欧拉步进: u_new u dt * rhs mps_u_new add_mps(mps_u, scalar_multiply_mps(mps_rhs, dt)) mps_u_new truncate_mps(mps_u_new, chi_max, truncate_eps) return mps_u_new6. 第四步解码、误差分析与实战调参经过若干时间步的演化我们得到了最终时刻tT的状态MPS。为了与参考解如高精度FDM解比较或者进行可视化我们需要将MPS解码回普通的网格向量。6.1 解码从MPS恢复全场信息解码就是MPS构造的逆过程将所有的核心张量按照虚拟索引完全收缩起来。u_j Σ_{α_1,...,α_{L-1}} A^[1]_{i_1, α_1} A^[2]_{α_1, i_2, α_2} ... A^[L]_{α_{L-1}, i_L}其中j (i_1 i_2 ... i_L)_2。对于周期性边界条件的MPS收缩形成一个环需要计算张量网络的迹。高效的收缩顺序可以避免中间张量尺寸爆炸。通常从左到右或从右到左顺序收缩每次合并两个核心并适时对中间结果进行压缩如果只需要部分网格点的值甚至可以采用更高效的局部解码算法。def decode_mps_to_vector(mps_cores): 将MPS核心列表收缩回一个向量。 vec_tensor mps_cores[0] for core in mps_cores[1:]: # 将当前累积张量与下一个核心在共享的虚拟索引上收缩 # 例如使用 np.tensordot vec_tensor np.tensordot(vec_tensor, core, axes(-1, 0)) # 假设虚拟索引在最后一个轴 # 最终 vec_tensor 的形状应为 (2, 2, ..., 2)然后展平 full_vector vec_tensor.flatten() return full_vector6.2 误差来源与调参指南MPS求解器的结果与标准FDM解之间的误差主要来自三个方面空间离散误差由有限差分格式引入是O(Δx²)量级。时间离散误差由显式欧拉法引入是O(Δt)量级。张量截断误差由SVD截断引入取决于截断阈值ϵ或最大键维数χ_max。如何调参网格分辨率N与时间步长Δt首先在较小的N如N64和较小的χ_max如χ10下运行确保算法基本正确。然后固定χ_max为一个较大的值如50细化网格增大N并相应减小Δt满足CFL条件观察误差是否收敛到离散误差主导的平台。这是验证算法实现正确性的重要一步。键维数χ_max在网格和Δt固定的情况下逐渐增大χ_max观察解的变化。当χ_max增大到一定程度后解的变化将微乎其微此时的误差主要来自空间和时间离散。这个χ_max就是该问题所需的“内在信息维度”。截断阈值ϵ与固定χ_max相比使用自适应截断阈值ϵ通常更鲁棒。可以从ϵ1e-5开始尝试。监控截断误差确保其远小于离散误差。非线性项的挑战Burgers方程会发展出陡峭梯度甚至激波。在激波附近场的变化剧烈关联长度变长需要更大的χ_max才能准确捕捉。如果资源有限可以考虑在激波区域使用局部网格细化虽然这与全局MPS框架不太兼容或者采用激波捕捉格式的思想在MPO构造中引入适应性。6.3 常见问题与排查实录在我实现和调试这个求解器的过程中遇到了不少典型问题这里分享给大家问题1结果完全不对出现NaN。排查首先检查时间步长Δt是否满足CFL稳定性条件。显式欧拉对Δt要求很苛刻。可以先将粘性系数ν设得大一些如0.1使方程以扩散为主更容易稳定。检查MPO-MPS收缩的实现是否正确一个简单的检验方法是对于初始正弦波用MPO作用后再解码与直接用矩阵D1乘以向量u的结果对比两者应完全一致在无截断的情况下。问题2演化后期解变得非常平滑激波特征被抹平。原因截断过于激进χ_max太小或ϵ太大。MPS无法表示激波所要求的高频成分和长程关联过度的截断相当于引入了额外的数值耗散。解决增大χ_max或减小ϵ。同时可以尝试在激波形成区域临时关闭截断或使用更宽松的截断阈值。问题3计算速度随演化步数增加越来越慢。原因键维数没有得到有效控制。检查截断步骤是否真的在执行以及截断后的键维数是否如预期般被限制在χ_max附近。如果每次截断后键维数都恢复到χ_max但下一步操作后又膨胀这是正常的。如果键维数持续增长说明截断逻辑可能有问题或者χ_max设置过大导致截断无效。优化使用更高效的张量收缩库如numpy.einsum或专门的张量网络库并注意收缩路径的优化。问题4周期性边界条件附近出现非物理振荡。排查检查MPO的边界张量W^[1]和W^[L]是否正确实现了周期性连接。一个验证方法是用MPO作用在一个常数向量MPS表示上结果应该接近零向量因为常数的导数为零。这个基于MPS/MPO的Burgers方程求解器虽然代码实现比传统FDM复杂但它为我们打开了一扇门一扇通往高维、多变量CFD问题高效模拟的新大门。它的价值不在于替代传统方法去解一维问题而在于其处理高维问题的潜力。当问题维度升高时传统方法的成本指数增长而MPS的成本仅与键维数χ的多项式相关。对于许多具有低秩特性的流动问题如某些湍流模态、参数化模拟这可能是突破维数诅咒的关键。

相关文章:

张量网络MPS/MPO求解粘性Burgers方程:突破CFD维度灾难的量子启发方法

1. 项目概述:当张量网络遇上流体方程在计算流体力学(CFD)领域,我们每天都在和维度灾难作斗争。想象一下,你要模拟一个三维湍流场,每个空间方向离散成100个点,时间再取100步,那么整个…...

量子机器学习实战:用变分量子电路对泰坦尼克数据集分类

1. 项目概述:当量子计算遇上经典分类难题量子机器学习(QML)听起来像是科幻小说里的概念,但如果你像我一样,在经典机器学习领域摸爬滚打多年,再一头扎进量子计算的海洋,你会发现它更像是一场激动…...

手机号码定位技术:从查询到地图可视化的完整解决方案

手机号码定位技术:从查询到地图可视化的完整解决方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirro…...

碧蓝航线Alas自动化脚本:解放双手的终极游戏助手

碧蓝航线Alas自动化脚本:解放双手的终极游戏助手 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你是否厌倦了每…...

别再只会用top了!Linux网络实时监控神器iftop保姆级教程(含常用快捷键与过滤技巧)

从top到iftop:Linux网络流量监控的终极实战指南如果你已经熟练使用top命令监控系统资源,却对网络流量分析感到无从下手,那么iftop将成为你工具箱中不可或缺的神器。就像top之于CPU和内存,iftop专为实时网络监控而生,它…...

告别折腾!用DKMS一劳永逸管理你的水星MW310UH在Ubuntu 22.04上的驱动

告别折腾!用DKMS一劳永逸管理你的水星MW310UH在Ubuntu 22.04上的驱动每次内核更新后都要重新编译无线网卡驱动?这种重复劳动该终结了。对于使用水星MW310UH这类Realtek芯片设备的用户来说,DKMS(Dynamic Kernel Module Support&…...

原神启动器打不开?手把手教你排查并修复Windows上Qt插件路径冲突问题(附环境变量管理技巧)

原神启动器故障排查:彻底解决Qt插件路径冲突的完整指南当您满心期待地双击原神启动器图标,却看到"no Qt platform plugin could be initialized"的错误提示时,这种挫败感我深有体会。作为一名同样热爱游戏的Windows用户&#xff0c…...

终极指南:三步解锁微信网页版完整访问权限

终极指南:三步解锁微信网页版完整访问权限 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾因无法在浏览器中使用微信网页版而苦恼…...

飞书文档批量导出技术解决方案:企业知识库迁移的工程化实践

飞书文档批量导出技术解决方案:企业知识库迁移的工程化实践 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 在数字化转型浪潮中,企业知识库的管理和迁移成为技术团队面临的…...

3分钟掌握猫抓扩展:浏览器资源嗅探的完整实用指南

3分钟掌握猫抓扩展:浏览器资源嗅探的完整实用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的视频无法保存而烦恼吗…...

fail2ban日志地理标签实战:MaxMind本地库+GeoLite2威胁溯源

1. 这不是“加个地图插件”那么简单:为什么地理标签是日志分析的临门一脚你有没有翻过服务器的/var/log/auth.log或 Nginx 的error.log?密密麻麻全是 IP 地址、时间戳、失败原因——Failed password for root from 192.168.3.11 port 54212 ssh2&#xf…...

电商App安全防护原理与合规开发实践指南

我不能提供任何绕过应用反抓包机制、破坏应用安全防护或违反平台服务协议的技术方案。 拼多多App作为一款合法合规运营的商业应用,其反抓包机制是保障用户数据安全、交易隐私和平台生态健康的重要技术手段。逆向分析、调试绕过、协议破解等行为不仅违反《中华人民共…...

工业控制系统安全:基于机器学习的数据融合异常检测实战

1. 项目概述与核心价值在工业控制系统(ICS)安全领域,我们面临着一个日益严峻的挑战:传统的“单点”防御策略越来越难以应对那些横跨网络层和物理过程层的复杂、隐蔽的攻击。想象一下,一个水处理厂的工程师,…...

工业控制系统安全:融合网络与过程数据的异常检测实践

1. 项目概述与核心思路在工业控制系统的安全防护领域,我们面临着一个日益严峻的挑战:攻击者不再满足于传统的网络渗透,而是将目标对准了物理过程本身。想象一下,一个水处理厂的阀门被恶意远程关闭,或者一个发电厂的涡轮…...

Godot与AI深度协作:重构游戏开发工作流的5步实践

1. 这不是“调用API”——Godot与AI助手协作的本质是重构工作流很多人看到“Godot集成AI助手”,第一反应是:找个HTTP客户端发个请求,把提示词塞进去,等JSON返回,再parse一下显示在UI里。我试过三次——第一次用GDScrip…...

探索 IwaraDownloadTool:从手动下载到智能嗅探的实践路径

探索 IwaraDownloadTool:从手动下载到智能嗅探的实践路径 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 你是否曾花费数小时在Iwara平台上一一保存心仪的视频内容&…...

探索NHSE:动物森友会存档编辑器的7个隐藏技巧

探索NHSE:动物森友会存档编辑器的7个隐藏技巧 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 你是否曾梦想在动物森友会中拥有无限资源?是否渴望打造完美岛屿却受限于游戏机…...

Kali Web渗透实战:从登录接口到管理员后台的完整链路

1. 这不是Kali的安装教程,而是Web渗透测试者的真实工作切片“精通 Kali Linux Web 渗透测试”——这个标题在各大技术社区里出现频率极高,但绝大多数内容要么是Kali系统安装基础命令罗列,要么是照搬OWASP Top 10概念空谈原理,真正…...

3分钟掌握ncmdump:专业级网易云音乐NCM格式解密方案

3分钟掌握ncmdump:专业级网易云音乐NCM格式解密方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在第三方播放器播放而困扰吗?ncmdump正是解决这一痛点的专业工具。…...

二进制量化技术如何优化大语言模型部署

1. 二进制量化技术在大语言模型中的革新应用在人工智能领域,大语言模型(LLM)的规模呈指数级增长,随之而来的是巨大的计算资源消耗和内存需求。传统FP16精度模型需要消耗数十GB甚至上百GB的显存,这使得在消费级硬件和边缘设备上部署变得异常困…...

机器学习加速辐照材料缺陷预测:从团簇动力学到神经网络代理模型

1. 项目概述:当机器学习遇见辐照材料缺陷预测在核能、航空航天以及先进反应堆材料的设计与安全评估中,有一个问题始终萦绕在材料科学家和工程师的心头:一块材料在长期、高强度的粒子辐照下,其内部究竟会发生什么?微观层…...

广义随机占优:多准则算法比较的稳健统计框架

1. 项目概述:当算法比较遇上决策理论在机器学习领域,我们常常面临一个看似简单、实则棘手的问题:如何科学地、令人信服地比较两个或多个算法?这个问题在学术论文、工业界选型和技术报告中无处不在。你可能会说,这还不简…...

Keil µVision中实现函数级编译时间戳追踪方案

1. 在Vision调试器中追踪函数编写时间的完整方案作为一名嵌入式开发老手,我经常需要回溯某个关键函数的最后修改时间。特别是在团队协作或维护遗留代码时,准确掌握函数级别的版本信息能大幅提升调试效率。今天要分享的正是如何在Keil Vision调试环境中实…...

简历离职原因避坑指南:HR直呼“加分”的标准答案(附反例吐槽)

前言:离职原因不是“坦白局”,是“情商测试题” “你为什么从上家公司离职?” 这句话堪称职场面试的“灵魂拷问”——比“你有什么缺点”更难回答,比“期望薪资多少”更易踩雷。就像网上吐槽的:说“公司不好”像吐槽前任的怨妇,说“薪资太低”像眼里只有钱的财迷,说“…...

京东自动购物系统:高效补货监控与智能下单终极指南

京东自动购物系统:高效补货监控与智能下单终极指南 【免费下载链接】Jd-Auto-Shopping 京东商品补货监控及自动下单 项目地址: https://gitcode.com/gh_mirrors/jd/Jd-Auto-Shopping 在电商购物场景中,错过心仪商品的补货时机是每个消费者都可能遇…...

Python安装文档

下载安装包 访问官方网站:https://www.python.org/ 注意:本人开发使用的事3.13.x。 查看自己的系统 安装 进入安装界面,记得勾选最后一项:"Add python.exe to PATH",然后选择自定义安装 "Customize installation"。 然后进入特性选择页面,什么都…...

Windows用户必看!终极免费的PDF处理工具Poppler快速安装指南

Windows用户必看!终极免费的PDF处理工具Poppler快速安装指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上处理P…...

将vCenter(VCSA)的默认证书替换为自己企业CA的证书

安装了vCenter之后访问其页面,默认的证书并不被Windows系统信任,浏览器提示不安全的网站;如果之前曾经给ESXi主机替换过合法证书,加入vCenter的数据中心之后,证书也被换为vCenter的不合法证书了。注:如果Ed…...

终极游戏翻译解决方案:XUnity.AutoTranslator完整指南

终极游戏翻译解决方案:XUnity.AutoTranslator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的对话和界面烦恼吗?语言障碍是否让你错过了无数精彩的游戏…...

iOS砸壳与反编译实战:从FairPlay解密到Swift逆向分析

1. 砸壳不是“破解”,而是理解iOS应用分发机制的第一道门很多人第一次听说“砸壳”,脑子里立刻浮现出“绕过App Store审核”“盗取商业逻辑”“窃取用户数据”这类词。这其实是个根深蒂固的误解。在我过去八年做iOS底层工具链开发、参与多个企业级MDM方案…...