MPDE 方法以及 Mathematica 实现
MPDE方法是一类用来分析数值格式的耗散色散性质的方法,它的思路为: 对于求解问题PDE(a),我们通过离散设计得到了数值格式, 现在反过来,找出一个与数值格式最契合的PDE(b),通常是原本的PDE(a)加上一些高阶余项,分析PDE(b)的耗散和色散性质,尤其关注它相比于PDE(a)多出来的高阶项,就可以得到数值格式的耗散和色散性质。 准备 MPDE的分析依赖于下面的结论:对于PDE \[ 0 = u_t - P u = u_t - \sum_{j=1}^n a_j \frac{\partial^j u}{\partial x^j} \] 其中 \(a_i \in \mathbb{R}\) 。一般性的结论如下: \(u_x\):不会对耗散和色散做出任何贡献 \(u_{xx}\) 或者更高的偶数阶导数项:对耗散性有贡献,对色散性无贡献 \(u_{xxx}\) 或者更高的奇数阶导数项:对色散性有贡献,对耗散性无贡献 低阶项的贡献是主要的,因此通常可以忽略高阶项,只关注最低阶的系数非零的一个偶数阶导数项和一个奇数阶导数项(不含 \(u_x\)...
数值格式的色散耗散分析
考虑数值格式的色散耗散性质分析,我们希望数值格式所表现出的性质尽可能与精确满足PDE的波函数一致。下面的基本概念是针对一般的数值格式的,但是例子主要是对流方程的数值格式,因为对它的分析非常典型。 基本概念 取一个离散的谐波解 \[ v_j^n = e^{i(k x_j + \widetilde{w} t^n)} = e^{i( k j \Delta x + \widetilde{w} n \Delta t)} \] 代入离散后的差分系统,可以得到差分系统所对应的广义色散关系(复值) \[ \widetilde{w} = \widetilde{w}(k) \] 实部对应的是波数,虚部对应的是振幅,即 \[ \widetilde{w} = \text{Re} \widetilde{w}(k) + i\, \text{Im} \widetilde{w}(k) \Rightarrow \left\{ \begin{aligned} w(k) &= \text{Re} \widetilde{w}(k)\\ A &= e^{- \text{Im}...
波函数基础
写一点基础的关于简谐波的基础知识,这部分的内容和记号很混乱,有必要整理一下。 这里不涉及到数值格式的色散耗散分析。 波函数 称定义在时空中的函数 \[ u(x,t) = A e^{i\phi(x,t)} \] 为波函数,其中\(\phi=\phi(x,t)\)是定义在时空中的相位函数:\(\phi: \mathbb{R}\times \mathbb{R}^+ \to \mathbb{R}\)。 对于一般的相位函数,我们关注它对时空的偏导数: \(k=k(x,t) := \phi_x \in \mathbb{R}\)称为波数,反映的是波在空间中的周期规律,可能与\((x,t)\)有关 \(w=w(x,t) := \phi_t \in \mathbb{R}\)称为相位速度,反映的是波在时间中的周期规律,可能与\((x,t)\)有关 \(c=c(x,t) := -\phi_t/\phi_x = - w/k \in \mathbb{R}\)称为波速,反应的是波在时空中的传播规律,可能与\((x,t)\)有关 \(A=A(x,t)\)是定义在时空中的复值函数:\(A:...
八皇后问题与回溯法
问题介绍 八皇后问题是以国际象棋为背景的经典问题: 如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?(皇后可以攻击与它处于同一条横行,纵列或者斜线上的其它棋子) 我们考虑的是一般化的\(n\times n\)的棋盘上放置\(n\)个皇后的问题(\(n > 1\)),理论分析表明当且仅当\(n \ge...
Hanoi塔问题求解(递归与非递归算法)
Hanoi塔是经典的递归算法的应用,但是有意思的是我之前学习的算法或数据结构的课都漏掉了这个例子,补一下吧,包括两类三种算法实现。 问题介绍 Hanoi塔问题为:考虑三根杆子A,B,C,A杆上有 N 个 (N>1) 穿孔圆盘,圆盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 问:如何移动?最少要移动多少次? 递归分析 重点关注最大的圆盘,它是整个任务的核心:虽然它在最底层不会影响别的圆盘的操作,但是将它从A移动到C时,必然其他N-1个盘都处于B。 据此可以把问题分解为三个子任务: 将N-1个圆盘从A移动到B,此时C可以用作临时存放区 将最大的圆盘从A直接移动到C 将N-1个圆盘从B移动到C,此时A可以用作临时存放区(和第一步的任务是等价的) 记\(f(n)\)为n个圆盘时最少的移动次数,显然有初值\(f(1)=1\),以及递推关系 \[ f(n) = 1 + 2f(n-1) \]...
线性常系数扩散方程整理
问题模型 考虑周期边界的线性常系数扩散方程的求解 \[ u_t = c u_{xx} \] 其中\(c > 0\)为常数,记网格比\(\mu = \frac{\Delta t}{(\Delta x)^2}\)并固定。 显格式 FTCS 直接显式离散可得 \[ v_j^{n+1} = v_j^n + a \mu (v_{j+1}^n - 2 v_j^n + v_{j-1}^n) \] FTCS格式的局部截断误差为\(O(\Delta t + (\Delta x)^2)\)。最大模稳定性要求:\(\mu a \le \frac12\)。 Richardson格式(CTCS,反面示例) 对时间采用中心差分可以得到三层显格式——Richardson格式 \[ v_j^{n+1} = v_j^{n-1} + 2 a \mu (v_{j+1}^n - 2v_j^n + v_{j-1}^n) \] CTCS格式的局部截断误差为\(O((\Delta t)^2+(\Delta...
线性常系数对流方程整理
问题模型 考虑周期边界的线性常系数对流方程的求解 \[ u_t + a u_x = 0 \] 其中风向\(a \neq 0\)为常数,记网格比\(\lambda = \frac{\Delta t}{\Delta x}\)并固定。 显格式 迎风格式(FTFS/FTBS) 对\(u_x\)采用单侧离散可以得到 FTFS(左偏心格式) \[ v_j^{n+1} = v_j^n - a \lambda(v_{j+1}^n - v_j^n) \] FTBS(右偏心格式) \[ v_j^{n+1} = v_j^n - a \lambda(v_{j}^n - v_{j-1}^n) \] 两种格式都具有\(O(\Delta t + \Delta x)\)的局部截断误差。 根据\(a\)的正负性: \(a>0\):风向从左往右,FTBS是迎风格式,FTFS是逆风格式 \(a<0\):风向从右往左,FTFS是迎风格式,FTBS是逆风格式 其中迎风格式是有条件\(L^2\)模稳定的,要求:\(|\lambda a|...
GDB学习笔记
关于GDB调试工具的学习笔记,学会了纯命令行的调试操作,才能更好地理解例如VSCode提供的图形界面的调试功能等,GDB在WSL2 Ubuntu上进行操作。 调试信息 可执行程序可以被调试的前提就是编译时加上了调试信息,通常是debug模式下,加上-g选项。 如果强行调试一个没有调试信息的可执行程序,将不能看见程序中的函数名或变量名等,而只是内存地址,并且会显示一条警告 1(No debugging symbols found in <program>) 加载程序 正常情况下可以通过调试器来加载程序 1gdb <program> 也可以先启动gdb,然后加载可执行文件 12gdb(gdb) file <program> 加载的程序并不会直接执行,需要使用start或run命令来启动程序。 如果是需要调试一个生成core文件并异常终止的程序,可以加上core文件来恢复现场 1gdb <program> <core dump...
Git学习笔记——4. 底层原理
仓库配置信息 .git/logs/和.git/info/,顾名思义是一些日志和辅助信息。 .git/hooks/ 存储一些 Git 提供的钩子脚本的模板,例如(pre-push.sample),可以创建名为pre-push的钩子脚本,这个脚本在特定行为(push 之前)会自动执行,其他名称的钩子也是类似的。 .git/config 是仓库级的 Git 配置文件,优先级最高,但是配置只是局限在当前仓库中,可能包括如下内容: 123456789101112[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true ignorecase = true[remote "origin"] url = git@github.com:xxx.git fetch = +refs/heads/*:refs/remotes/origin/*[branch "main"] remote = origin merge =...