方程自己解(3)——deepXDE解Burgers方程

2023-12-13 16:10
文章标签 方程 burgers deepxde

本文主要是介绍方程自己解(3)——deepXDE解Burgers方程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. what‘s Burgers equation
    • 2. Solve Burgers equation by DeepXDE
    • 2. Burgers RAR
    • 4. summary

Cite:
【1】 维基百科.伯格斯方程
【2】 DeepXDE.伯格斯方程求解

1. what‘s Burgers equation

在这里插入图片描述

2. Solve Burgers equation by DeepXDE

Burgers equation:
d u d t + u d u d x = v d 2 u d x 2 , x ∈ [ − 1 , 1 ] , t ∈ [ 0 , 1 ] (1) \frac{du}{dt} + u\frac{du}{dx} = v\frac{d^2u}{dx^2} ,\; x\in [-1,1] , \; t \in [0,1] \tag{1} dtdu+udxdu=vdx2d2u,x[1,1],t[0,1](1)
Dirichlet boundary conditions and initial conditions
u ( − 1 , t ) = u ( 1 , t ) = 0 , u ( x , 0 ) = − s i n ( π x ) u(-1,t) = u(1,t) = 0, \; u(x,0) = -sin(\pi x) u(1,t)=u(1,t)=0,u(x,0)=sin(πx)
reference solution: here

import deepxde as dde
import numpy as np
import matplotlib.pyplot as plt 
def gen_testdata():""" generate test data with react synthetic result"""data = np.load("../deepxde/examples/dataset/Burgers.npz")t, x, exact = data["t"], data["x"], data["usol"].Txx, tt = np.meshgrid(x, t)X = np.vstack((np.ravel(xx), np.ravel(tt))).Ty = exact.flatten()[:, None]return X, ydef pde(x, y):dy_x = dde.grad.jacobian(y, x, i=0, j=0)dy_t = dde.grad.jacobian(y, x, i=0, j=1)dy_xx = dde.grad.hessian(y, x, i=0, j=0)return dy_t + y * dy_x - 0.01 / np.pi * dy_xx
geom = dde.geometry.Interval(-1, 1)
timedomain = dde.geometry.TimeDomain(0, 0.99)
# define Geometry and time domain,and we combine both the domain using GeometryXTime
geomtime = dde.geometry.GeometryXTime(geom, timedomain) 
bc = dde.DirichletBC(geomtime, lambda x: 0, lambda _, on_boundary: on_boundary)
ic = dde.IC(geomtime, lambda x: -np.sin(np.pi * x[:, 0:1]), lambda _, on_initial: on_initial
)
data = dde.data.TimePDE(geomtime, pde, [bc, ic], num_domain=2540, num_boundary=80, num_initial=160
)
net = dde.maps.FNN([2] + [20] * 3 + [1], "tanh", "Glorot normal")
model = dde.Model(data, net)
# Now, we have the PDE problem and the network. We bulid a Model and choose the optimizer and learning rate
model.compile("adam", lr=1e-3)# We then train the model for 15000 iterations:
model.train(epochs=15000)
# After we train the network using Adam, we continue to train the network using L-BFGS to achieve a smaller loss:
model.compile("L-BFGS")
losshistory, train_state = model.train()dde.saveplot(losshistory, train_state, issave=True, isplot=True)
X, y_true = gen_testdata()
y_pred = model.predict(X)
f = model.predict(X, operator=pde)
print("Mean residual:", np.mean(np.absolute(f)))
print("L2 relative error:", dde.metrics.l2_relative_error(y_true, y_pred))
np.savetxt("test.dat", np.hstack((X, y_true, y_pred)))
Mean residual: 0.033188015
L2 relative error: 0.17063112901692742
%matplotlib notebook
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot3D(X[:,0].reshape(-1),X[:,1].reshape(-1),y_true.reshape(-1),'red')
ax.plot3D(X[:,0].reshape(-1),X[:,1].reshape(-1),y_pred.reshape(-1),'blue',alpha=0.5)
plt.show()

2. Burgers RAR

函数定义和上面是一样的,这里地RAR地目的在于不断减小函数拟合地误差到一个指定地误差范围之下。控制误差的大小。

import deepxde as dde
import numpy as npdef gen_testdata():data = np.load("../deepxde/examples/dataset/Burgers.npz")t, x, exact = data["t"], data["x"], data["usol"].Txx, tt = np.meshgrid(x, t)X = np.vstack((np.ravel(xx), np.ravel(tt))).Ty = exact.flatten()[:, None]return X, ydef pde(x, y):dy_x = dde.grad.jacobian(y, x, i=0, j=0)dy_t = dde.grad.jacobian(y, x, i=0, j=1)dy_xx = dde.grad.hessian(y, x, i=0, j=0)return dy_t + y * dy_x - 0.01 / np.pi * dy_xxgeom = dde.geometry.Interval(-1, 1)
timedomain = dde.geometry.TimeDomain(0, 0.99)
geomtime = dde.geometry.GeometryXTime(geom, timedomain)bc = dde.DirichletBC(geomtime, lambda x: 0, lambda _, on_boundary: on_boundary)
ic = dde.IC(geomtime, lambda x: -np.sin(np.pi * x[:, 0:1]), lambda _, on_initial: on_initial
)data = dde.data.TimePDE(geomtime, pde, [bc, ic], num_domain=2500, num_boundary=100, num_initial=160
)
net = dde.maps.FNN([2] + [20] * 3 + [1], "tanh", "Glorot normal")
model = dde.Model(data, net)model.compile("adam", lr=1.0e-3)
model.train(epochs=10000)
model.compile("L-BFGS")
model.train()
X = geomtime.random_points(100000)
err = 1
while err > 0.005:f = model.predict(X, operator=pde)err_eq = np.absolute(f)err = np.mean(err_eq)print("Mean residual: %.3e" % (err))x_id = np.argmax(err_eq)print("Adding new point:", X[x_id], "\n")data.add_anchors(X[x_id])early_stopping = dde.callbacks.EarlyStopping(min_delta=1e-4, patience=2000)model.compile("adam", lr=1e-3)model.train(epochs=10000, disregard_previous_best=True, callbacks=[early_stopping])model.compile("L-BFGS")losshistory, train_state = model.train()
dde.saveplot(losshistory, train_state, issave=True, isplot=True)X, y_true = gen_testdata()
y_pred = model.predict(X)
print("L2 relative error:", dde.metrics.l2_relative_error(y_true, y_pred))
np.savetxt("test.dat", np.hstack((X, y_true, y_pred)))
L2 relative error: 0.009516824350586142
%matplotlib notebook
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot3D(X[:,0].reshape(-1),X[:,1].reshape(-1),y_true.reshape(-1),'red')
ax.plot3D(X[:,0].reshape(-1),X[:,1].reshape(-1),y_pred.reshape(-1),'blue',alpha=0.5)
plt.show()

4. summary

  1. 迭代更多的次数,在方程拟合的过程中可能会获得更好的结果,但是也可能陷入一些局部最优值,LR的影响还是挺大的
  2. 两次对比,第二次固定一个最大容忍误差值进行判断,最终得到一个误差非常小的模型。这对于PINN的训练而言似乎是一个可行的方案,因为一般不存在过拟合的问题。
  3. 注意我们的PINN方法是一个无监督学习过程。
  4. 对于二维的Burgers方程的训练和预测速度都还是非常快的,尽管我的GPU非常普通。暂时对于我是可以容忍的!!!

这篇关于方程自己解(3)——deepXDE解Burgers方程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/jerry_liufeng/article/details/120791199
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/489087

相关文章

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

R语言结构方程模型分析与实践技术应用

结构方程模型(Sructural Equation Model)是一种建立、估计和检验研究系统中多变量间因果关系的模型方法,它可以替代多元回归、因子分析、协方差分析等方法,利用图形化模型方式清晰展示研究系统中变量间的因果网络关系,是近年来地学、生态、进化、环境、医学、社会、经济领域中应用十分广泛的统计方法。然而,自Wright在1920年美国科学院院刊(PNAS)提出第一个通径/路径(Pa

解决ax+by=c,不定方程(扩展欧几里得)

首先有几个定理我们需要知道,在这里我也会一一证明。 —————————————————————————————————————— 定理1:gcd(a,b)==gcd(b,a%b);这个是欧几里得提出并证明的。 (%是取余的意思,在数学中 可用mod表示); 以下是证明过程 —————————————————————————————————————— 令a = k * b + r; (k

Python案例 | 使用四阶龙格-库塔法计算Burgers方程

使用四阶龙格-库塔法计算Burgers方程 引言求解过程完整代码 引言 Burgers方程产生于应用数学的各个领域,包括流体力学、非线性声学、气体动力学和交通流。它是一个基本的偏微分方程,可以通过删除压力梯度项从速度场的Navier-Stokes方程导出。对于黏度系数较小的情况( ν = 0.01 / π \nu = 0.01/ \pi ν=0.01/π),Burgers方程会

强化学习深入学习(一):价值函数和贝尔曼方程

文章目录 0. 引言1. 回报(Return)2. 价值函数(Value Function)3. 贝尔曼期望方程(Bellman Expectation Equation)4. 贝尔曼最优方程(Bellman Optimality Equation)总结 0. 引言 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过与环境的交互来学习如何

数论 - n元线性同余方程的解法

note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念:   形如:(a1*x1+a2*x2+....+an*xn)%m=b%m           ..................(1) 当然也有很多变形,例如:a1*x1+a2*x2+...+an*xn+m*x(n+1)=b.这两个都是等价的。 判断是否有解:

Ferrari求解四次方程

参考: 1) https://proofwiki.org/wiki/Ferrari’s_Method#google_vignette 2)https://blog.csdn.net/qq_25777815/article/details/85206702

[3.2] 机器人连杆变换和运动学方程

本节首先推导相邻两连杆坐标系之间的变换矩阵,然后将这些变换矩阵依次相乘,得到操作臂的运动学方程。该方程表示末端连杆相对于基座的位姿关系,是各关节变量的函数。 连杆坐标系{i}与{i-1}通过四个参数、、、联系起来,因此坐标系{i}相对于{i-1} 的齐次变换矩阵T,通常也是连

7-8 h0056. 不定方程求解

//23计科的同学们,能不能先学一下思路再自己写一下代码? 给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。 输入格式: 多行,每行包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。 输出格式: 多行,每行一个整数,即不定方程的非负整数解组数。 输入样例: 2 3 18 输出样例: 4 #include<bi