

量子计算 | 求解Navier-Stokes方程
©️ Copyright 2023 @ Authors
作者:
图灵算法
日期:2024-05-23
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
Note: 本 notebook 搬运自 DeepQuantum 网站
1. 算法背景
非线性微分方程组在自然科学和工程领域中扮演着关键的角色,用于描述一系列复杂的现象和问题,包括Navier-Stokes方程、等离子体流体动力学和流行病学等。这些方程组的求解对于理解自然现象、优化系统性能和解决实际问题至关重要。变分量子算法是一类利用经典优化器来训练含参量子线路的算法,它们可以用来求解哈密顿量的本征值、组合优化问题、机器学习问题等。变分量子算法的基本思想是,通过调整量子线路中的参数,使得某个损失函数达到最小值,从而得到问题的最优解或者近似解。变分量子算法的优势在于,它们只需要较少的量子资源,适合在带噪声的中型量子计算机上运行。这里我们基于DeepQuantum定制化开发了一个变分量子算法来求解非线性常微分方程组,并以Navier-Stokes方程的收敛-发散喷嘴问题作为一个具体例子进行了演示。
Navier-Stokes方程的基本形式
Navier-Stokes方程可以写作以下形式:
其中:
- 是流体的速度向量,依赖于时间 和空间位置。
- 是流体的密度。
- 是流体的压强。
- 是动力粘性系数,它描述了流体内部的粘滞性。
- 是作用在流体上的体积力(如重力)。
方程解释
- 时间导数 表示流体速度随时间的变化。
- 对流项 表示流体因其速度场的非均匀分布而导致的自身运动的影响。
- 压力梯度 说明压力的变化驱动流体运动。
- 粘性项 描述了流体内部的摩擦力对流体运动的影响。
- 体积力 是外部力如重力或电磁力的作用。
2. 收敛-发散喷嘴问题

这个问题即要求一维流体经过上图所示的结构,然后计算流体流动的密度、温度和速度分布,具体的方程组如下所示 [1]:
为了进一步简化问题,我们考虑稳态情况的解,即有:
这里的A(x)描述了喷嘴的形状。
3. 算法原理
将变量x通过角度编码加入参数化量子线路(parameterized quantum circuit,PQC)后,可以通过测量得到指定可观测量的期望值。这就实现了一个可变分的函数映射。并且当PQC对变量x进行角度编码时,可以通过参数位移法得到变量x的精确梯度,于是利用这种可微量子线路(differentiable quantum circuit,DQC),把函数项与导数项联系起来后,就可以自然地求解常微分方程。总体流程图包含确定输入、初始化量子线路、优化量子线路以及终止条件。
在输入方面,主要是确定要求解的微分方程(组)和边界条件。在初始化量子线路方面,可以选择不同的变分拟设(ansatz),选择不同的特征映射函数,选择不同的代价函数、损失函数以及选择不同的处理边界条件的方法。在优化量子线路方面,通过采用混合量子-经典的工作流,对DQC进行训练,以满足微分方程和指定的边界条件。最后当损失函数收敛到一定阈值或者训练轮数到达指定值时,结束训练。
具体到这个案例,我们利用经典的非线性激活函数设计了一个量子特征映射,使得对于输入而言相当于引入了Chebyshev多项式,直观理解就是量子比特越多,拟合函数所使用的Chebyshev多项式的阶数越高。该映射提供了一个强大的拟合多项式的基函数集合,并具有丰富的表达能力。对于边界条件的处理,通过floating boundary handling,即对期望值加一个常数来作为预测值,在每次迭代中都调整这个常数使得预测值满足边界条件,可以完美处理单边的边界条件。更多细节我们将结合代码进行说明。
总的来说,变分量子算法对于非线性特征映射、线路结构、测量期望值等选择是多种多样的,同时优化过程中,需要根据具体问题的特点选择合适的优化策略以及相关超参数,大家可以自行进行相关探索。
4. 代码实现
DQC类根据指定的量子比特数和层数来进行初始化,并且可以指定量子特征映射的形式,比如内置了"chebyshev"和"chebyshev_tower"两种,我们也可以将自定义的量子特征映射加入"nonlinear"。
"circuit"函数用于构建量子线路的结构,这里默认第一层Ry作为数据编码层(由encode参数指定),然后由一层Rz一层Rx一层Rz再加两层交错的CNOT作为变分层并且可以多次重复。用户也可以在这里构建自定义的量子线路。如果没有指定可观测量的个数,则默认对每个量子比特做z测量。
"get_observable"函数根据量子线路的比特数以及所需的可观测量的个数,返回一个包含一系列可观测量的列表。
"forward"函数实现前向计算过程,经典数据经过量子特征映射以及量子线路的演化,所得到的可观测量期望值之和即作为输出。
NavierStokes类实现对处理问题方式的建模,用户可以指定DQC的信息,以及Navier-Stokes方程的收敛-发散喷嘴问题中的单边边界条件,包括对边界条件的处理方法。这里的'float'即代表上面介绍的floating boundary的处理方式。"forward"函数实现具体的函数拟合,给定坐标x,返回密度、温度和速度。
"loss_ns_stationary_conv_div_nozzle" 函数实现根据要求解的常微分方程组来构建损失函数。具体而言,对于目前这个案例,所采用的喷嘴的形状为:
所要求解的常微分方程组为:
代码与方程是对应的.
"loss_reg_ns_stationary_conv_div_nozzle"函数实现根据指定的预期目标来返回正则项。
整个训练过程包含了两个阶段的训练。我们需要输入待训练的模型、训练集数据、正则项数据、损失函数和正则项的形式、要使用的优化器、迭代轮数、控制正则项衰减的超参数以及运行设备。训练完返回训练好的模型以及训练过程中记录的损失函数情况。
这里统一列出了与训练过程相关的一些参数。我们还可以修改模型、损失函数和正则项的形式以及优化器的相关信息。比如这里默认使用了6个量子比特和6层线路结构,默认的边界条件为:
确定好所有参数后运行
100%|██████████| 200/200 [02:01<00:00, 1.65it/s] 100%|██████████| 600/600 [09:58<00:00, 1.00it/s]
参考文献
[1] Kyriienko, O., Paine, A. E., & Elfving, V. E. (2021). Solving nonlinear differential equations with differentiable quantum circuits. Physical Review A, 103(5), 052416.