大数跨境
0
0

Schrödinger equation代码教程:物理信息深度学习求解非线性薛定谔方程代码

Schrödinger equation代码教程:物理信息深度学习求解非线性薛定谔方程代码 数据驱动与力学
2025-06-22
3


问题背景

非线性薛定谔方程(NLS)

非线性薛定谔方程是量子力学和非线性光学中的基本方程,描述了孤子波的传播:

其中:

  •  是复值波函数
  •  是实部,  是虚部
  •  是概率密度

传统数值方法的挑战

  1. 网格依赖性:有限差分/有限元方法需要细密网格
  2. 边界条件处理:复杂边界条件难以处理
  3. 计算成本:高维问题计算代价昂贵
  4. 数值耗散:长时间积分存在数值误差累积

应用领域

1. 量子力学

  • 波函数演化
  • 量子隧穿效应
  • 玻色-爱因斯坦凝聚态

2. 非线性光学

  • 光孤子传播
  • 光纤通信
  • 非线性介质中的光传播

3. 流体力学

  • 水波传播
  • 大气波动
  • 海洋内波

4. 等离子体物理

  • 朗缪尔波
  • 离子声波
  • 等离子体湍流

PINNs核心原理

1. 基本思想

Physics-Informed Neural Networks将物理定律直接嵌入到神经网络的损失函数中,通过同时最小化数据拟合误差和物理方程残差来训练网络。

2. 损失函数构成

总损失函数包含三个部分:

其中:

  • :初始条件损失
  • :边界条件损失
  • :物理方程残差损失

3. 自动微分

利用自动微分计算偏导数,无需手动推导差分格式:

代码实现详解

1. 环境配置与导入

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
from scipy.interpolate import griddata
from pyDOE import lhs

数学原理

  • torch:深度学习框架,提供自动微分功能
  • scipy.io:用于读取MATLAB数据文件
  • pyDOE:拉丁超立方采样,确保训练点均匀分布

2. 神经网络架构定义

class PhysicsInformedNN(nn.Module):
    def __init__(self, x0, u0, v0, tb, X_f, layers, lb, ub):
        super(PhysicsInformedNN, self).__init__()

维度分析

  • x0  - 初始条件空间点
  • u0, v0  - 初始条件值
  • tb  - 边界条件时间点
  • X_f  - 物理残差点
  • layers: 网络层配置,如

3. 边界条件初始化

X0 = np.concatenate((x0, 0*x0), 1)  # (x0, 0)
X_lb = np.concatenate((0*tb + lb[0], tb), 1)  # (lb[0], tb)
X_ub = np.concatenate((0*tb + ub[0], tb), 1)  # (ub[0], tb)

数学原理

  • X0 时刻的初始条件点
  • X_lb:左边界 的所有时间点
  • X_ub:右边界 的所有时间点

维度变换

  • 输入:
  • 输出:

4. 输入归一化

def forward(self, x, t):
    X = torch.cat([x, t], dim=1)
    H = 2.0 * (X - self.lb) / (self.ub - self.lb) - 1.0

数学原理: 将输入 归一化到

维度分析

  • X  - 输入坐标
  • H  - 归一化后的坐标

5. 网络前向传播

for i, layer in enumerate(self.network[:-1]):
    H = torch.tanh(layer(H))

output = self.network[-1](H)
u = output[:, 0:1]
v = output[:, 1:2]

数学原理: 激活函数 的选择基于:

  1. 光滑性:无限次可微
  2. 非线性:能够逼近复杂函数
  3. 有界性:输出范围

维度变换: 每层线性变换:

6. 自动微分计算偏导数

def net_uv(self, x, t):
    u, v = self.forward(x, t)
    
    u_x = torch.autograd.grad(u, x, grad_outputs=torch.ones_like(u), 
                              retain_graph=True, create_graph=True)[0]
    v_x = torch.autograd.grad(v, x, grad_outputs=torch.ones_like(v), 
                              retain_graph=True, create_graph=True)[0]
    
    return u, v, u_x, v_x

数学原理: 利用链式法则自动计算偏导数:

参数说明

  • retain_graph=True:保留计算图用于后续梯度计算
  • create_graph=True:创建高阶导数计算图

7. 物理方程残差

def net_f_uv(self, x, t):
    u, v, u_x, v_x = self.net_uv(x, t)
    
    u_t = torch.autograd.grad(u, t, grad_outputs=torch.ones_like(u), 
                              retain_graph=True, create_graph=True)[0]
    v_t = torch.autograd.grad(v, t, grad_outputs=torch.ones_like(v), 
                              retain_graph=True, create_graph=True)[0]
    
    u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), 
                               retain_graph=True, create_graph=True)[0]
    v_xx = torch.autograd.grad(v_x, x, grad_outputs=torch.ones_like(v_x), 
                               retain_graph=True, create_graph=True)[0]
    
    f_u = u_t + 0.5 * v_xx + (u**2 + v**2) * v
    f_v = v_t - 0.5 * u_xx - (u**2 + v**2) * u
    
    return f_u, f_v

数学推导: 非线性薛定谔方程:

,代入得:

分离实部和虚部:

  • 实部:
  • 虚部:

因此残差为:

8. 损失函数设计

def loss_function(self, return_components=False):
    # 初始条件损失
    u0_pred, v0_pred, _, _ = self.net_uv(self.x0, self.t0)
    loss_ic = torch.mean((self.u0 - u0_pred)**2) + torch.mean((self.v0 - v0_pred)**2)
    
    # 边界条件损失
    u_lb_pred, v_lb_pred, u_x_lb_pred, v_x_lb_pred = self.net_uv(self.x_lb, self.t_lb)
    u_ub_pred, v_ub_pred, u_x_ub_pred, v_x_ub_pred = self.net_uv(self.x_ub, self.t_ub)
    
    loss_bc = torch.mean((u_lb_pred - u_ub_pred)**2) + torch.mean((v_lb_pred - v_ub_pred)**2) + \
              torch.mean((u_x_lb_pred - u_x_ub_pred)**2) + torch.mean((v_x_lb_pred - v_x_ub_pred)**2)
    
    # 物理残差损失
    f_u_pred, f_v_pred = self.net_f_uv(self.x_f, self.t_f)
    loss_physics = torch.mean(f_u_pred**2) + torch.mean(f_v_pred**2)
    
    total_loss = loss_ic + loss_bc + loss_physics
    
    return total_loss

数学表达

9. 训练过程

def train_model(self, nIter, X_star=None, u_star=None, v_star=None, h_star=None):
    optimizer = optim.Adam(self.parameters(), lr=0.001)
    
    for epoch in range(nIter):
        optimizer.zero_grad()
        total_loss, loss_ic, loss_bc, loss_physics = self.loss_function(return_components=True)
        total_loss.backward()
        optimizer.step()

优化算法: Adam优化器结合了动量法和RMSprop的优点:

数学原理与维度分析

1. 函数逼近理论

通用逼近定理:具有足够宽度的单隐层神经网络可以逼近任意连续函数。

2. 自动微分的数学基础

前向模式

反向模式

3. 维度一致性检查

变量
维度
物理意义
空间坐标
时间坐标
波函数实部/虚部
一阶空间导数
二阶空间导数
时间导数

4. 归一化的必要性

归一化将输入映射到 ,避免:

  1. 梯度消失/爆炸
  2. 数值不稳定
  3. 收敛困难

实验结果与分析

1. 误差度量

  • L2相对误差
  • L∞误差
  • 均方根误差

2. 收敛性分析

观察损失函数各分量的演化:

  • 初始条件损失快速下降
  • 边界条件损失稳定收敛
  • 物理残差损失指示方程满足程度

主要结果

总结与扩展

主要优势

  1. 无网格方法:避免传统数值方法的网格生成
  2. 自动满足物理定律:物理约束直接嵌入损失函数
  3. 处理不规则域:复杂几何边界容易处理
  4. 数据同化:可融合稀疏观测数据

局限性

  1. 训练时间长:需要大量迭代才能收敛
  2. 超参数敏感:网络结构和训练参数需要仔细调整
  3. 高频振荡:对高频解的逼近能力有限
  4. 缺乏理论保证:收敛性和精度缺乏严格理论分析

扩展方向

1. 算法改进

  • 多尺度网络:处理多尺度物理现象
  • 自适应权重:动态调整损失函数权重
  • 元学习:快速适应新的物理问题

2. 应用扩展

  • 多物理场耦合:电磁-热-力多场耦合
  • 不确定性量化:贝叶斯PINNs
  • 优化设计:逆问题求解

3. 理论研究

  • 逼近误差分析:网络容量与逼近精度关系
  • 收敛性证明:训练算法的收敛性保证
  • 泛化界估计:从训练误差到泛化误差的界

实际应用建议

  1. 数据预处理:确保输入数据的归一化和标准化
  2. 网络设计:根据问题复杂度选择合适的网络深度和宽度
  3. 训练策略:采用学习率衰减和早停机制
  4. 结果验证:通过多种误差指标评估模型性能

代码优化建议

  1. 并行计算:利用GPU加速训练过程
  2. 内存管理:合理设置批次大小避免内存溢出
  3. 数值稳定性:使用双精度浮点数提高计算精度
  4. 可视化:实时监控训练过程和结果质量

【完整教程+代码+结果绘图,留言:NLS-code(有偿),往期代码教程留言】

往期内容推荐
《Science》正刊:物理信息深度学习||一文概述物理信息深度学习,理论基础+代码实践+研究前沿!
CFD基础:一文概述NS方程建模与推导||NS方程建模、数值离散、代数求解、后处理可视化
物理信息深度学习与数据驱动研究,现在到底有多火爆?
【PINNs详细代码教程】物理信息神经网络求解Navier-Stokes方程反问题:稀疏数据重构和系统参数辨识,误差1e-3量级
【PINNs代码教程】物理信息深度神经网络求解偏微分方程:Allen-Cahn方程算例,高精度误差2e-4量级
【PINNs新手代码教程】物理信息深度神经网络求解微分方程:Burgers方程算例,误差精度5e-4量级
【NS方程代码教程】基于物理信息神经网络(PINNs)求解二维Navier-Stokes方程正问题:圆柱绕流
【PINNs顶盖驱动流代码教程】物理信息神经网络求解Navier-Stokes方程顶盖驱动流问题
代码教程:使用物理信息神经网络(PINNs)求解二维Helmholtz(亥姆霍兹)方程
【物理深度学习与计算力学代码教程】物理信息神经网络求解欧拉-伯努利梁方程,精度1e-4量级
PINNs模拟孤立波代码教程||物理信息神经网络求解量子场论基本方程Klein-Gordon
物理信息深度学习模拟Euler-Bernoulli梁代码教程
多尺度物理信息深度神经网络求解高频PDE,精度1e-3量级
Klein-Gordon方程的物理信息神经网络(PINNs)求解详细教程


【声明】内容源于网络
0
0
数据驱动与力学
本公众号主要用于分享数据驱动,人工智能,物理信息深度学习与力学交叉研究前沿热点,包括:前沿文献,开源代码,算法实现。
内容 28
粉丝 0
数据驱动与力学 本公众号主要用于分享数据驱动,人工智能,物理信息深度学习与力学交叉研究前沿热点,包括:前沿文献,开源代码,算法实现。
总阅读77
粉丝0
内容28