差分法求解 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.rhkb.cn/news/386406.html

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

相关文章

如何快速获取全网精准客流?揭秘不为人知的5大运营策略!

有同行所在的地方&#xff0c;就一定拥有咱们需要的客户。客户看的是结果&#xff0c;搜索的是问题&#xff0c;寻找的是答案。 如果没有付费流量&#xff0c;单纯靠搞免费流量&#xff0c;很多大厂的运营也会变得一文不值。一个牛逼的运营&#xff0c;不仅是会做付费流量&…

Sentinel隔离、降级、授权规则详解

文章目录 Feign整合Sentinel线程隔离熔断降级授权规则自定义异常结果 上一期教程讲解了 Sentinel 的限流规则&#xff1a; Sentinel限流规则&#xff0c;这一期主要讲述 Sentinel 的 隔离、降级和授权规则 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还…

我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”

大家好&#xff0c;我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 &#xff0c;并且针对该项目做了一个官网&#xff1a; 很多同学表示官网很好看&#xff0c;还好奇是怎么做的&#xff0c;其实这个网站的背后还有个有趣的小故事。。。 鱼皮&#xff1a;我们要做个官…

Mastercam2020中文版安装教程许可证激活码教程附安装包【亲测成功】

软件简介 Mastercam是美国CNC Software Inc.公司开发的基于PC平台的CAD/CAM软件。它集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径模拟及真实感模拟等多种功能于一身。它具有方便直观的几何造型。Mastercam提供了设计零件外形所需的理想环境&#xff0c;其…

Sonatype Nexus Repository搭建与使用(详细教程3.70.1)

目录 一. 环境准备 二. 安装jdk 三. 搭建Nexus存储库 四. 使用介绍 一. 环境准备 主机名IP系统软件版本配置信息nexus192.168.226.26Rocky_linux9.4 Nexus Repository 3.70.1 MySQL8.0 jdk-11.0.23 2核2G&#xff0c;磁盘20G 进行时间同步&#xff0c;关闭防火墙和selinux…

1.Redis介绍

redis是一个键值型数据库。 是一种nosql数据库&#xff0c;非关系型数据库。 sql数据库 1.字段类型是固定的。 2.表的结构是固定的。表数据量特别大的时候&#xff0c;去修改表结构会出现问题。也会导致业务逻辑的修改。 3.每个字段有一定的约束&#xff0c;比如唯一约束&…

C/C++进阶 (8)哈希表(STL)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 本文着重于模拟实现哈希表&#xff0c;并非是哈希表的使用。 实现的哈希表的底层用的是线性探测法&#xff0c;并非是哈希桶。 目录 一、标准库中的哈希表 1、unordered_map 2、unordered_set 二、模…

Spring -- 使用XML开发MyBatis

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 MyBatis XML配置文件开发配置连接字符串和MyBatis写Mapper层代码添加mapper接口添加UserInfoXmLMapper.xml 操作数据库INSERTDELETE & UPDATE MyBatis XML配置文件开发 实际上,除…

【全面讲解下Docker in Docker的原理与实践】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👉目录 👉前言👉原理👉实践👉安全和最佳实践👉前言 🦛…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量&#xff0c;现在要学…

阿里云主机 安装RabbitMQ

一、操作系统 用的是Alibaba Cloud Linux release 3 (Soaring Falcon)系统&#xff0c;可以通过命令&#xff1a;lsb_release -a 查看系统信息。 二、安装RabbitMQ RabbitMQ 是基于 Erlang 语言构建的&#xff0c;要安装RabbitMQ&#xff0c;需先安装Erlang环境。通过Erlang V…

小众独立产品推荐 - 独立产品灵感周刊 DecoHack #063

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. Replypulse …

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12&#xff0c;开发者工具&#xff0c;网络 1、web基本概念 web服务器&#xff08;web server&#xff09;&#xff1a;也称HTTP服务器&#xff08;HTTP server&#xff09;&am…

备忘录系统

目录 一、 系统简介 1.简介 2需求分析 3 编程环境与工具 二、 系统总体设计 1 系统的功能模块图。 2 各功能模块简介 3项目结构 4 三、 主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#xff0…

信息安全技术解析

在信息爆炸的今天&#xff0c;信息技术安全已成为社会发展的重要基石。随着网络攻击的日益复杂和隐蔽&#xff0c;保障数据安全、提升防御能力成为信息技术安全领域的核心任务。本文将从加密解密技术、安全行为分析技术和网络安全态势感知技术三个方面进行深入探讨&#xff0c;…

基于Java的微博传播分析系统的设计与实现

1 项目介绍 1.1 摘要 本文致力于展示一项创新的微博传播分析系统设计与应用研究&#xff0c;该系统基于Java技术&#xff0c;巧妙利用大数据环境下的社交媒体——微博的庞大用户群及高度活跃特性&#xff0c;旨在深度探索信息传播的内在逻辑与社会影响机制。研究开篇明确定了…

2024非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输!

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#…

设计模式 之 —— 单例模式

目录 什么是单例模式&#xff1f; 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式&#xff1a;线程不安全 2.懒汉式&#xff1a;线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点&#xff1a; 缺点&#xff1a; 适用场景&#xff1a; 什么是单例模…

微前端概念

微前端作用 大型应用程序的拆分独立的前端子应用降低程序复杂性&#xff0c;提高开发效率 微前端能力 js隔离css隔离元素隔离生命周期预加载数据通信应用跳转多层嵌套… 微前端实现方案 IframeSingle-spaQiankunMicro-app Iframe <iframe src"https://www.examp…

684.美的集团六三二项目流程变革框架整体规划方案132页PPT

读者朋友大家好&#xff0c;最近有会员朋友咨询晓雯&#xff0c;关于集团公司流程变革框架整体规划的问题&#xff0c;晓雯查找到一份《美的集团632项目流程变革框架整体规划方案》&#xff0c;下面是部分内容分享&#xff0c;欢迎大家下载学习。 知识星球APP搜索【战略咨询文…