差分法求解 Burgers 方程(附完整MATLAB 及 Python代码)

Burgers 方程的数值解及误差分析

引言

Burgers 方程是一个非线性偏微分方程,在流体力学、非线性声学和交通流理论中有广泛应用。本文将通过数值方法求解带粘性的 Burgers 方程,并分析其误差。

方程模型

Burgers 方程的形式为:
u t + u u x = ϵ u x x , u_t + u u_x = \epsilon u_{xx}, ut+uux=ϵuxx,
其中, u u u 是待求函数, x x x 是空间变量, t t t 是时间变量, ϵ \epsilon ϵ 是黏性系数。

初始条件和边界条件

为了求解方程,我们需要指定初始条件和边界条件。在本文中,我们选择如下初始条件:
u ( x , 0 ) = − sin ⁡ ( π x ) , u(x, 0) = -\sin(\pi x), u(x,0)=sin(πx),
边界条件设定为常数边界条件:
u ( − 1 , t ) = 0 , u ( 1 , t ) = 0. u(-1, t) = 0, \quad u(1, t) = 0. u(1,t)=0,u(1,t)=0.

数值方法

我们使用向后欧拉法进行时间离散,并使用中心差分法进行空间离散。时间步长为 d t dt dt,空间步长为 d x dx dx

时间离散

向后欧拉法的时间离散形式为:
u n + 1 − u n d t + u n + 1 ∂ u n + 1 ∂ x = ϵ ∂ 2 u n + 1 ∂ x 2 \frac{u^{n+1} - u^n}{dt} + u^{n+1} \frac{\partial u^{n+1}}{\partial x} = \epsilon \frac{\partial^2 u^{n+1}}{\partial x^2} dtun+1un+un+1xun+1=ϵx22un+1

空间离散

中心差分法用于空间离散, u x u_x ux u x x u_{xx} uxx 的差分格式为:
∂ u ∂ x ≈ u i + 1 − u i − 1 2 d x . \frac{\partial u}{\partial x} \approx \frac{u_{i+1} - u_{i-1}}{2 dx}. xu2dxui+1ui1.
∂ 2 u ∂ x 2 ≈ u i + 1 − 2 u i + u i − 1 d x 2 . \frac{\partial^2 u}{\partial x^2} \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{dx^2}. x22udx2ui+12ui+ui1.

差分格式

综合时间离散和空间离散,得到差分格式:
u i n + 1 − u i n d t + u i n + 1 u i + 1 n + 1 − u i − 1 n + 1 2 d x = ϵ u i + 1 n + 1 − 2 u i n + 1 + u i − 1 n + 1 d x 2 . \frac{u_i^{n+1} - u_i^n}{dt} + u_i^{n+1} \frac{u_{i+1}^{n+1} - u_{i-1}^{n+1}}{2 dx} = \epsilon \frac{u_{i+1}^{n+1} - 2u_i^{n+1} + u_{i-1}^{n+1}}{dx^2}. dtuin+1uin+uin+12dxui+1n+1ui1n+1=ϵdx2ui+1n+12uin+1+ui1n+1.

数值求解过程

为了读者方便,下面我们先给出 Matlab 差分法解 Burgers 方程的代码实现:

% The solution surface of Burgers Equations
% Variables:
% x-space variable, t-time variable.
% Output:
% Solution surface of u_{t}+uu_x=\epsilon u_{xx}% 参数设置  
epsilon = 0.05;  
dx = 5e-2; % 空间步长  
dt = 5e-3; % 时间步长  
x = -1:dx:1; % 空间网格  
t = 0:dt:1;  % 时间网格  
Nx = length(x);  
Nt = length(t);  % 初始条件  
u = -sin(pi * x);  % 边界条件函数(这里假设为常数边界条件)  
Leftbdry = @(t) 0;  
Rightbdry = @(t) 0;  % 初始化解矩阵  
U = zeros(Nx, Nt);  
U(:, 1) = u; % 初始条件  % 向后欧拉迭代求解  
for n = 1:Nt-1  u_n = U(:, n); % 当前时间步的解  u_np1 = u_n;   % 下一时间步的解,初始猜测为当前时间步的解  % 迭代求解隐式方程  max_iter = 100;  tol = 1e-6;  for iter = 1:max_iter  % 计算u_x和u_xx(这里使用简单的二阶中心差分,注意边界处理)  u_x = zeros(Nx, 1);u_xx = zeros(Nx, 1);% 中心差分u_x(2:end-1) = (u_np1(3:end) - u_np1(1:end-2)) / (2 * dx);u_xx(2:end-1) = (u_np1(3:end) - 2 * u_np1(2:end-1) + u_np1(1:end-2)) / (dx^2);% 边界处理u_x(1) = (u_np1(2) - u_np1(1)) / dx;u_x(end) = (u_np1(end) - u_np1(end-1)) / dx;u_xx(1) = (u_np1(2) - 2 * u_np1(1) + Leftbdry(t(n+1))) / (dx^2);u_xx(end) = (Rightbdry(t(n+1)) - 2 * u_np1(end) + u_np1(end-1)) / (dx^2);% 计算u*u_x  uu_x = u_np1 .* u_x;  % 向后欧拉方程  u_np1_new = u_n - dt * (uu_x - epsilon * u_xx);  % 检查收敛性  if norm(u_np1_new - u_np1, inf) < tol  break;  end  u_np1 = u_np1_new;  end  % 更新解矩阵  U(:, n+1) = u_np1;  % 边界条件修正(如果需要)  U(1, n+1) = Leftbdry(t(n+1));  U(end, n+1) = Rightbdry(t(n+1));  
end  % 使用 meshgrid 生成网格数据
[T, X] = meshgrid(t, x);% 绘图显示数值解
figure;
% 将 T, X, U 转换为列向量
% T_vec = T(:);
% X_vec = X(:);
% U_vec = U(:);
surf(T, X, U);hold on;
scatter3(T(:),X(:),U(:),'.' )
xlabel('t')  
ylabel('x')  
zlabel('u(x,t)')  
title('Burgers Equation Solution using Backward Euler Method')

求解结果:
在这里插入图片描述

考虑到 Python 用户较多,笔者也实现了 Python 版本的代码供大家参考:

import numpy as np
import matplotlib.pyplot as plt# 参数设置
epsilon = 0.05
dx = 5e-2  # 空间步长
dt = 5e-3  # 时间步长
x = np.arange(-1, 1 + dx, dx)  # 空间网格
t = np.arange(0, 1 + dt, dt)  # 时间网格
Nx = len(x)
Nt = len(t)# 初始条件
u = -np.sin(np.pi * x)# 边界条件函数(这里假设为常数边界条件)
def Leftbdry(t):return 0def Rightbdry(t):return 0# 初始化解矩阵
U = np.zeros((Nx, Nt))
U[:, 0] = u  # 初始条件# 向后欧拉迭代求解
for n in range(Nt - 1):u_n = U[:, n]  # 当前时间步的解u_np1 = u_n  # 下一时间步的解,初始猜测为当前时间步的解# 迭代求解隐式方程max_iter = 100tol = 1e-6for iter in range(max_iter):# 计算 u_x 和 u_xx(这里使用简单的二阶中心差分,注意边界处理)u_x = np.zeros(Nx)u_xx = np.zeros(Nx)# 中心差分u_x[1:-1] = (u_np1[2:] - u_np1[:-2]) / (2 * dx)u_xx[1:-1] = (u_np1[2:] - 2 * u_np1[1:-1] + u_np1[:-2]) / (dx**2)# 边界处理u_x[0] = (u_np1[1] - u_np1[0]) / dxu_x[-1] = (u_np1[-1] - u_np1[-2]) / dxu_xx[0] = (u_np1[1] - 2 * u_np1[0] + Leftbdry(t[n+1])) / (dx**2)u_xx[-1] = (Rightbdry(t[n+1]) - 2 * u_np1[-1] + u_np1[-2]) / (dx**2)# 计算 u * u_xuu_x = u_np1 * u_x# 向后欧拉方程u_np1_new = u_n - dt * (uu_x - epsilon * u_xx)# 检查收敛性if np.linalg.norm(u_np1_new - u_np1, np.inf) < tol:breaku_np1 = u_np1_new# 更新解矩阵U[:, n+1] = u_np1# 边界条件修正(如果需要)U[0, n+1] = Leftbdry(t[n+1])U[-1, n+1] = Rightbdry(t[n+1])# 使用 meshgrid 生成网格数据
T, X = np.meshgrid(t, x)# 绘图显示数值解
fig = plt.figure(figsize=(12, 12))# 第一个视角
ax1 = fig.add_subplot(221, projection='3d')
ax1.plot_surface(T, X, U, cmap='viridis', edgecolor='none')
ax1.set_title('View from angle 1')
ax1.set_xlabel('t')
ax1.set_ylabel('x')
ax1.set_zlabel('u(x,t)')
ax1.view_init(elev=30, azim=45)# 第二个视角
ax2 = fig.add_subplot(222, projection='3d')
ax2.plot_surface(T, X, U, cmap='viridis', edgecolor='none')
ax2.set_title('View from angle 2')
ax2.set_xlabel('t')
ax2.set_ylabel('x')
ax2.set_zlabel('u(x,t)')
ax2.view_init(elev=30, azim=135)# 第三个视角
ax3 = fig.add_subplot(223, projection='3d')
ax3.plot_surface(T, X, U, cmap='viridis', edgecolor='none')
ax3.set_title('View from angle 3')
ax3.set_xlabel('t')
ax3.set_ylabel('x')
ax3.set_zlabel('u(x,t)')
ax3.view_init(elev=60, azim=45)# 第四个视角
ax4 = fig.add_subplot(224, projection='3d')
ax4.plot_surface(T, X, U, cmap='viridis', edgecolor='none')
ax4.set_title('View from angle 4')
ax4.set_xlabel('t')
ax4.set_ylabel('x')
ax4.set_zlabel('u(x,t)')
ax4.view_init(elev=60, azim=135)plt.suptitle('Burgers Equation Solution from Multiple Angles')
plt.show()

详细说明:

  • 参数设置:定义 epsilon、dx、dt、x 和 t.
  • 初始条件:设置初始条件为 u ( x , 0 ) = − sin ⁡ ( π x ) u(x, 0) = -\sin(\pi x) u(x,0)=sin(πx).
  • 边界条件:定义常数边界条件函数 Leftbdry 和 Rightbdry.
  • 初始化解矩阵:创建 U 矩阵,并设置初始条件。
  • 向后欧拉迭代求解:
    对每个时间步,初始猜测下一时间步的解。
    使用迭代方法求解隐式方程,计算 u_x 和 u_xx,并处理边界条件。
    计算 uu_x 和更新 u_np1.
    检查收敛性,如果满足收敛条件则跳出循环。
  • 更新解矩阵:将 u_np1 的值存储到解矩阵中,并处理边界条件。
  • 生成网格数据:使用 meshgrid 生成 T 和 X.
  • 绘图:
    创建一个包含四个子图的 3D 图像,每个子图展示从不同视角观察的解。设置各个子图的坐标轴标签、标题和视角。
    使用 plt.suptitle 为整个图像添加总标题,并显示图像。

数值结果如下:

在这里插入图片描述
效果不错!


本专栏致力于普及各种偏微分方程的不同数值求解方法,所有文章包含全部可运行代码。欢迎大家支持、关注!

作者 :计算小屋
个人主页 : 计算小屋的主页

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

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

相关文章

Jmeter下载、安装、永久汉化(Windows环境)

1、JDK下载 JDK8下载地址https://www.oracle.com/java/technologies/downloads/#java8-windows JDK8的Windows的64位&#xff1a; 2、Jmeter下载 jmeter下载地址https://jmeter.apache.org/download_jmeter.cgi 3、配置环境变量 安装好后&#xff0c;把jdk和jmeter都配置到…

Docker从入门到实践教程(电子版)

前言 Docker 是个伟大的项目&#xff0c;它彻底释放了虚拟化的威力&#xff0c;极大降低了云计算资源供应的成本&#xff0c;同时让应用的 分发、测试、部署和分发都变得前所未有的高效和轻松&#xff01; 本电子书既适用于具备基础 Linux 知识的 Docker 初学者&#xff0c;也…

隧道可视化:实时监控保障行车安全

通过图扑可视化实现隧道的实时监控、数据分析及智能报警系统&#xff0c;提供全面的隧道管理和决策支持&#xff0c;提升行车安全&#xff0c;优化维护策略&#xff0c;确保交通顺畅。

【b站-湖科大教书匠】6 应用层 - 计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 6 应用层 6.1 应用层概述 6.2 客户-服务器方式和对等方…

PsExec横向:IPCPTHPTT

一.IPC下的PsExec 二.PTH下的psexec&#xff08;CS操作&#xff09; 三.PTT下的psexec PsExec工具&#xff1a; psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口&#xff0c;只需要对方开启admin$共享和ipc$ (该共享默认开启&#…

Spring boot 后端向前端发送日期时间发现少了8小时

问题 数据库 后端的控制台输出 前端控制台输出 可以发现少了8小时 问题 springboot 向前端响应数据是默认 Json 格式&#xff0c;所以会有类型转换&#xff0c;springboot 就通过 Jackson 来对 data 类型数据进行转换&#xff0c;但是Jackson 类型的时区是 GMT&#xff0c;与…

Google AI非坦途

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Pytorch框架之神经网络

一、全连接神经网络的整体结构 二、全连接神经网络的单元结构 找出一组w,b使得结果最优 三、常见激活函数 四、前向传播 学习率是指训练模型时每次迭代更新模型参数的步长。 五、梯度下降法 六、反向传播计算 七、总结 1、准备数据 2、搭建模型 3、开始训练(设置学习率、…

【TS】TypeScript中的接口(Interface):对象类型的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript中的接口(Interface):对象类型的强大工具引言1. 接口的基本概念1.1 什…

【基于PSINS】UKF/SSUKF对比的MATLAB程序

UKF与SSUKF UKF是&#xff1a;无迹卡尔滤波 SSUKF是&#xff1a;简化超球面无迹卡尔曼滤波 UKF 相较于传统的KF算法&#xff0c;UKF能够更好地处理非线性系统&#xff0c;并且具有更高的估计精度。它适用于多种应用场景&#xff0c;如机器人定位导航、目标跟踪、信号处理等。…

【人工智能】深度剖析:Midjourney与Stable Diffusion的全面对比

文章目录 &#x1f34a;1 如何选择合适的AI绘画工具1.1 个人需求选择1.2 比较工具特点1.3 社区和资源 &#x1f34a;2 Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 2.1 使用费用对比 2.2 使用便捷性与系统兼容性对比 2.3 开源与闭源对比 2.4 图片质量对比 2.5 上…

19145 最长无重复子数组

这个问题可以使用滑动窗口的方法来解决。我们可以使用两个指针&#xff0c;一个指向子数组的开始&#xff0c;一个指向子数组的结束。然后我们使用一个哈希表来记录每个元素最后出现的位置。当我们遇到一个已经在子数组中出现过的元素时&#xff0c;我们就将开始指针移动到这个…

Mac文件拷贝到移动硬盘怎么做Mac拷贝之后Win电脑里看不到

在日常使用mac电脑的过程中&#xff0c;我们经常需要将一些重要的文件备份到外部硬盘上&#xff0c;以防止数据丢失或电脑故障。传输文件到硬盘可以通过多种方法实现&#xff0c;比如拖拽或者复制至移动硬盘&#xff0c;但有时也会遇到移动硬盘无法粘贴&#xff0c;或拷贝后无法…

SSRF (服务端请求伪造)

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比&#xff08;Peak Signal-to-Noise Ratio&#xff0c;简称PSNR&#xff09;是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量&#xff0c;可以用来评…

Python酷库之旅-第三方库Pandas(051)

目录 一、用法精讲 186、pandas.Series.is_monotonic_increasing属性 186-1、语法 186-2、参数 186-3、功能 186-4、返回值 186-5、说明 186-6、用法 186-6-1、数据准备 186-6-2、代码示例 186-6-3、结果输出 187、pandas.Series.is_monotonic_decreasing属性 187…

嵌入式人工智能(34-基于树莓派4B的红外传感器、紫外传感器、激光传感器)

这三种光传感器都是不可见光传感器&#xff0c;光是由电场和磁场交替传播而形成的波动现象。光是一种电磁辐射&#xff0c;属于电磁波的一种。下图是电磁波的频谱范围&#xff0c;生活中多数光是看不到的&#xff0c;但是确真实存在&#xff0c;本文介绍几种光传感器&#xff0…

C++从入门到起飞之——友元内部类匿名对象对象拷贝时的编译器优化 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、友元 2、内部类 3、 匿名对象 4、对象拷⻉时的编译器优化 5、完结散花 1、友元 • 友元提供…

基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台

在现代招聘领域&#xff0c;数据驱动的决策已成为提升招聘效率和质量的关键因素。基于爬虫技术和机器学习算法&#xff0c;结合Django框架和Bootstrap前端技术&#xff0c;我们开发了一套完整的招聘数据分析与可视化系统。该系统旨在帮助企业从海量招聘信息中提取有价值的数据&…

学习Numpy的奇思妙想

学习Numpy的奇思妙想 本文主要想记录一下&#xff0c;学习 numpy 过程中的偶然的灵感&#xff0c;并记录一下知识框架。 推荐资源&#xff1a;https://numpy.org/doc/stable/user/absolute_beginners.html &#x1f4a1;灵感 为什么 numpy 数组的 shape 和 pytorch 是 tensor 是…