PINN解偏微分方程实例4

news2025/1/12 12:02:51

PINN解偏微分方程实例4

  • 一、正问题
    • 1. Diffusion equation
    • 2. Burgers’ equation
    • 3. Allen–Cahn equation
    • 4. Wave equation
  • 二、反问题
    • 1. Burgers’ equation
    • 3. 部分代码示例

  本文使用 PINN解偏微分方程实例1中展示的代码求解了以四个具体的偏微分方程,包括Diffusion,Burgers, Allen–Cahn和Wave方程,另外重新写了一个求解反问题的代码,以burger方程为例。

一、正问题

1. Diffusion equation

一维扩散方程:
∂ u ∂ t = ∂ 2 u ∂ x 2 + e − t ( − sin ⁡ ( π x ) + π 2 sin ⁡ ( π x ) ) , x ∈ [ − 1 , 1 ] , t ∈ [ 0 , 1 ] u ( x , 0 ) = sin ⁡ ( π x ) u ( − 1 , t ) = u ( 1 , t ) = 0 \begin{array}{l} \frac{\partial u}{\partial t}=\frac{\partial^{2} u}{\partial x^{2}}+e^{-t}\left(-\sin (\pi x)+\pi^{2} \sin (\pi x)\right), \quad x \in[-1,1], t \in[0,1] \\ u(x, 0)=\sin (\pi x) \\ u(-1, t)=u(1, t)=0 \end{array} tu=x22u+et(sin(πx)+π2sin(πx)),x[1,1],t[0,1]u(x,0)=sin(πx)u(1,t)=u(1,t)=0
其中 u u u 是扩散物质的浓度。精确解是 u ( x , t ) = s i n ( π x ) e − t u(x,t)=sin(\pi x)e^{-t} u(x,t)=sin(πx)et 表示。

请添加图片描述

2. Burgers’ equation

Burgers方程的定义为:
∂ u ∂ t + u ∂ u ∂ x = v ∂ 2 u ∂ x 2 , x ∈ [ − 1 , 1 ] , t ∈ [ 0 , 1 ] , u ( x , 0 ) = − sin ⁡ ( π x ) , u ( − 1 , t ) = u ( 1 , t ) = 0 , \begin{array}{l} \frac{\partial u}{\partial t}+u \frac{\partial u}{\partial x}=v \frac{\partial^{2} u}{\partial x^{2}}, \quad x \in[-1,1], t \in[0,1], \\ u(x, 0)=-\sin (\pi x), \\ u(-1, t)=u(1, t)=0, \end{array} tu+uxu=vx22u,x[1,1],t[0,1],u(x,0)=sin(πx),u(1,t)=u(1,t)=0,
其中, u u u 为流速, ν ν ν 为流体的粘度。在本文中, ν ν ν 设为 0.01 / π 0.01/\pi 0.01/π
请添加图片描述

3. Allen–Cahn equation

Allen–Cahn方程的形式如下:
∂ u ∂ t = D ∂ 2 u ∂ x 2 + 5 ( u − u 3 ) , x ∈ [ − 1 , 1 ] , t ∈ [ 0 , 1 ] , u ( x , 0 ) = x 2 cos ⁡ ( π x ) , u ( − 1 , t ) = u ( 1 , t ) = − 1 , \begin{array}{l} \frac{\partial u}{\partial t}=D \frac{\partial^{2} u}{\partial x^{2}}+5\left(u-u^{3}\right), \quad x \in[-1,1], t \in[0,1], \\ u(x, 0)=x^{2} \cos (\pi x), \\ u(-1, t)=u(1, t)=-1, \end{array} tu=Dx22u+5(uu3),x[1,1],t[0,1],u(x,0)=x2cos(πx),u(1,t)=u(1,t)=1,
其中,扩散系数 D = 0.001 D=0.001 D=0.001 .

请添加图片描述

4. Wave equation

一维波动方程如下:
∂ 2 u ∂ t 2 − 4 ∂ 2 u ∂ x 2 = 0 , x ∈ [ 0 , 1 ] , t ∈ [ 0 , 1 ] , u ( 0 , t ) = u ( 1 , t ) = 0 , t ∈ [ 0 , 1 ] , u ( x , 0 ) = sin ⁡ ( π x ) + 1 2 sin ⁡ ( 4 π x ) , x ∈ [ 0 , 1 ] , ∂ u ∂ t ( x , 0 ) = 0 , x ∈ [ 0 , 1 ] , \begin{array}{l} \frac{\partial^{2} u}{\partial t^{2}}-4 \frac{\partial^{2} u}{\partial x^{2}}=0, \quad x \in[0,1], t \in[0,1], \\ u(0, t)=u(1, t)=0, \quad t \in[0,1], \\ u(x, 0)=\sin (\pi x)+\frac{1}{2} \sin (4 \pi x), \quad x \in[0,1], \\ \frac{\partial u}{\partial t}(x, 0)=0, \quad x \in[0,1], \end{array} t22u4x22u=0,x[0,1],t[0,1],u(0,t)=u(1,t)=0,t[0,1],u(x,0)=sin(πx)+21sin(4πx),x[0,1],tu(x,0)=0,x[0,1],
精确解为:
u ( x , t ) = sin ⁡ ( π x ) cos ⁡ ( 2 π t ) + 1 2 sin ⁡ ( 4 π x ) cos ⁡ ( 8 π t ) . u(x, t)=\sin (\pi x) \cos (2 \pi t)+\frac{1}{2} \sin (4 \pi x) \cos (8 \pi t) . u(x,t)=sin(πx)cos(2πt)+21sin(4πx)cos(8πt).

二、反问题

1. Burgers’ equation

Burgers方程的定义为:
∂ u ∂ t + u ∂ u ∂ x = v ∂ 2 u ∂ x 2 , x ∈ [ − 1 , 1 ] , t ∈ [ 0 , 1 ] , u ( x , 0 ) = − sin ⁡ ( π x ) , u ( − 1 , t ) = u ( 1 , t ) = 0 , \begin{array}{l} \frac{\partial u}{\partial t}+u \frac{\partial u}{\partial x}=v \frac{\partial^{2} u}{\partial x^{2}}, \quad x \in[-1,1], t \in[0,1], \\ u(x, 0)=-\sin (\pi x), \\ u(-1, t)=u(1, t)=0, \end{array} tu+uxu=vx22u,x[1,1],t[0,1],u(x,0)=sin(πx),u(1,t)=u(1,t)=0,
其中, u u u 为流速, ν ν ν 为流体的粘度。
  这里假设 v v v 未知,我们同时求解方程的解和v的值。

在这里插入图片描述

3. 部分代码示例

import torch
import numpy as np
import matplotlib.pyplot as plt

sin = torch.sin
cos = torch.cos
exp = torch.exp
pi = torch.pi

epochs = 50000    # 训练代数,要为1000的整数倍
h = 100    # 画图网格密度
N = 30    # 内点配置点数
N1 = 10    # 边界点配置点数
N2 = 5000    # 数据点

# error
L2_error = []
L2_error_data = []
L2_error_eq = []
# Training
u = MLP()
opt = torch.optim.Adam(params=u.parameters())
xt, u_real = test_data(x_inf=-1, x_sup=1, t_inf=0, t_sup=1, h=h)
print("**************** equation+data ********************")
for i in range(epochs):
    opt.zero_grad()
    l = l_interior(u) \
        + l_down(u) \
        + l_left(u) \
        + l_right(u) \
        + l_data(u)
    l.backward()
    opt.step()
    if (i+1) % 1000 == 0 or i == 0:
        u_pred = u(xt)
        error = l2_relative_error(u_real, u_pred.detach().numpy())
        L2_error.append(error)
        print("L2相对误差: ", error)


u1 = MLP()
opt = torch.optim.Adam(params=u1.parameters())
print("**************** data ********************")
for i in range(epochs):
    opt.zero_grad()
    l = l_data(u1)
    l.backward()
    opt.step()
    if (i+1) % 1000 == 0 or i == 0:
        u_pred = u1(xt)
        error = l2_relative_error(u_real, u_pred.detach().numpy())
        L2_error_data.append(error)
        print("L2相对误差: ", error)


u2 = MLP()
opt = torch.optim.Adam(params=u2.parameters())
print("**************** equation ********************")
for i in range(epochs):
    opt.zero_grad()
    l = l_interior(u2) \
        + l_down(u2) \
        + l_left(u2) \
        + l_right(u2)
    l.backward()
    opt.step()
    if (i+1) % 1000 == 0 or i == 0:
        u_pred = u2(xt)
        error = l2_relative_error(u_real, u_pred.detach().numpy())
        L2_error_eq.append(error)
        print("L2相对误差: ", error)


print("********************************")
print("PINN相对误差为: ", L2_error[-1])
print("equation相对误差为: ", L2_error_eq[-1])
print("data相对误差为: ", L2_error_data[-1])
print("********************************")

x = range(int(epochs / 1000 + 1))
plt.plot(x, L2_error, c='red', label='pinn')
plt.plot(x, L2_error_data, c='blue', label='only data')
plt.plot(x, L2_error_eq, c='yellow', label='only equation')
plt.scatter(x, L2_error, c='red')
plt.scatter(x, L2_error_data, c='blue')
plt.scatter(x, L2_error_eq, c='yellow')
plt.yscale('log')
plt.legend()
plt.show()

完整代码目录如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期(上)第37课 - 变量的作用域与生命期(下)实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验小结 第40课 - C 语言中的宏定义实验小结…

基于STM32的智能农业灌溉系统

目录 引言环境准备智能农业灌溉系统基础代码实现:实现智能农业灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能农业管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系统通过使用ST…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin,这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具,官网链接:Thonny, Python IDE for beginners。 参考博客:用M…

AIGC时代算法工程师的面试秘籍(2024.5.27-6.9第十五式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky…

解析 flink sql 转化成flink job

文章目录 背景流程flink实例实现细节定义的规则定义的物理算子定义的flink exec node 背景 在很多计算引擎里,都会把sql 这种标准语言,转成计算引擎下底层实际的算子,因此理解此转换的流程对于理解整个过程非常重要 流程 flink实例 public…

绘制口罩maskTheFace数据源是300w_lp

官网下载mask the face 代码,增加代码draw_face.py import argparse import cv2 import scipy.io from tqdm import tqdm from utils.aux_functions_2 import *# 设置命令行输入参数 parser argparse.ArgumentParser(description"MaskTheFace - Python code…

C++的特殊类设计 饥饿汉模式

目录 特殊类设计 设计一个不能被拷贝的类 设计一个只能在堆上创建对象的类 设计一个只能在栈上创建对象的类 设计一个不能继承的类 设计模式 单例模式 饿汉模式 饥汉模式 特殊类设计 设计一个不能被拷贝的类 C98的设计方式:将该类的拷贝构造和赋值运算符…

OpenGL3.3_C++_Windows(17)

Demo演示 demo演示 绘制不同的图元(点,线…): 理解 glDrawArrays 和 glDrawElements的区别 glDrawArrays :渲染的图元模式mode(可以参考),起始位置,顶点数量glDrawElem…

昇思25天学习打卡营第2天|张量Tensor

一、张量的定义: 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构(也是所有深度学习模型的基础数据结构),下面将主要介绍张量和稀疏张量的属…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖,但依赖管理不当,会造成版本混乱冲突或者目标包臃肿。因此,我们以SpringBoot为例,从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的,依赖的依赖也会连带引入。例如在项目中…

大型企业网络DHCP服务器配置安装实践@FreeBSD

企业需求 需要为企业里的机器配置一台DHCP服务器。因为光猫提供DHCP服务的能力很差,多机器dhcp多机器NAT拓扑方式机器一多就卡顿。使用一台路由器来进行子网络的dhcp和NAT服务,分担光猫负载,但是还有一部分机器需要放到光猫网络,…

一、企业级架构设计-archimate基础概念

目录 一、标准 二、实现工具 1、Archimate 1、Archimate 基本概念 1、通用元模型 2、结构关系 3、依赖关系 1、服务关系 2、访问关系 3、影响关系 1、影响方式 2、概念 3、关系线 4、案例 4、关联关系 4、动态、节点和其他关系 1、时间或因果关系 2、信息流 …

ubuntu18.04 编译HBA 并实例运行

HBA是一个激光点云层级式的全局优化的程序,他的论文题目是:HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module,对应的github地址是:HKU-Mars-Lab GitHub 学习本博客,可以学到gtsam安装&am…

6.S081的Lab学习——Lab8: locks

文章目录 前言一、Memory allocator(moderate)提示:解析 二、Buffer cache(hard)解析: 三、Barrier (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081,将它的Lab逐一实现,并…

[数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):152 标注数量(xml文件个数):152 标注数量(txt文件个数):152 标注类别…

Django 模版过滤器

Django模版过滤器是一个非常有用的功能,它允许我们在模版中处理数据。过滤器看起来像这样:{{ name|lower }},这将把变量name的值转换为小写。 1,创建应用 python manage.py startapp app5 2,注册应用 Test/Test/sett…

ic基础|功耗篇03:ic设计人员如何在代码中降低功耗?一文带你了解行为级以及RTL级低功耗技术

大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是…

【计算机网络篇】数据链路层(13)共享式以太网与交换式以太网的对比

文章目录 🍔共享式以太网与交换式以太网的对比🔎主机发送单播帧的情况🔎主机发送广播帧的情况🔎多对主机同时通信 🛸使用集线器和交换机扩展共享式以太网的区别 🍔共享式以太网与交换式以太网的对比 下图是…

基于STM32的智能家居安防系统

目录 引言环境准备智能家居安防系统基础代码实现:实现智能家居安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能家居安防管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居安防系统通过使…