古典迭代法整理
古典迭代法可以用于求解线性方程组,特点是格式简单,收敛性与迭代初值无关,与迭代矩阵的谱半径有关。 古典迭代法实质上是基于矩阵的近似逆设计的不动点迭代法,与此不同的,共轭梯度法等则是最优化在矩阵求解问题上的具体体现。 1. 迭代格式与收敛性 求解非奇异的线性方程组 \[ A x = b \] 将方阵\(A\)分解为三个部分 \[ A = D-L-U \] \(D\)为对角阵 \(L\)为下三角阵,对角线全零 \(U\)为上三角阵,对角线全零 以下的几类迭代法都有如下形式(实质即一种不动点迭代法) \[ x^{(k+1)} = B x^{(k)} + g \] 最终希望收敛到 \(Ax=b\) 的精确解 \(x\)(在向量范数意义下) \[ \lim_{k\to \infty} \Vert x^{(k)} - x \Vert = 0 \] 此时\(x\)满足如下等价形式 \[ x = B x + g \] 收敛的充要条件与 \(B\) 的谱半径有关: \[ \rho(B) < 1 \] 收敛的充分条件有很多,例如 \(B\) 的某个矩阵范数小于 1...
Burgers方程精确解
一维 Burgers 方程如下 \[ \left\{ \begin{aligned} u_t + \left(\frac{u^2}2\right)_x &= 0\\ u(x,0) &= u_0(x) \end{aligned} \right. \] 其中定义域\(x \in \mathbb{R}\),通常假定初值有周期性,精确解此时也具有周期性。 特征线方程 从\((\xi,0)\)发出的曲线记作 \(l_\xi\),曲线参数为 \(s\),方程为 \(x = x(s)\),其中 \(x(0)=\xi\)。沿着曲线 \(l_\xi\),\(u\) 的变化情况为 \[ \begin{aligned} \frac{d}{ds}u(x(s),s) = u_x(x(s),x) x'(s) + u_t(x(s),s)\\ = u_x(x(s),s)\, (x'(s) - u(x(s),s)) \end{aligned} \] 若曲线 \(l_\xi:x=x(s)\) 取为如下...
Cpp练习——MTest测试框架(gtest的模仿实现)
主要参考了Google test(gtest)和知乎上的一篇文章qtest: 一个单元测试库的从头实现以及作者提供的代码,尤其是宏的部分。一直不喜欢也没有学明白宏的各种用法,但是实现这种风格的测试框架也绕不开宏。 在其基础上进行了整理和重构,并且扩展和完善了一些细节的功能。 本文作为 C++ 学习中的小练习,若有疏漏,欢迎指正。 MTest 介绍 MTest 是一个 head-only 的简易框架,只包含两个头文件: mtest.hpp 负责 MTest 和 MTest::MTestMessage 两个类的实现,不含有任何的宏。 mtest_macro.hpp 负责对外提供相应的宏,可以在编译时使用-DUNUSE_MTEST关闭所有的宏,避免与 gtest 产生冲突。 测试文件需要 include 这两个文件,include顺序无所谓,也可以直接合并成一个文件,但是我个人的喜好是对宏敬而远之,因此单独仍在一个头文件中。主要功能实现在mtest.hpp,其中不含有任何的宏。 为什么重复造轮子? 我希望将 MTest 作为 gtest 的简易替代,尤其是它具有...
tmux学习笔记
这是一份简要的tmux笔记和速查手册,主要参考 Tmux 的 Github 文档 基本概念 tmux 为终端复用器,可以启动一系列终端会话,可以将会话和终端窗口分离:关闭终端窗口再打开,会话并不终止,而是继续运行在执行,这可以有效避免因网络波动等导致的会话中断,也便于开启多窗口任务。 tmux 在逻辑上主要有三层概念:session(会话)> window(窗口)> pane(窗格)。 session session 具有索引(默认从0开始),同时也有名称(默认名称是数字编号) 远程登录时开启 tmux client 客户端,然后可以 attach 到一个 session session 可以被一个或多个 client attach(相当于从多个设备同时登入),或者处于 detached 状态,此时 session 保持在后台运行 session 可以包含一组 window:一个屏幕装不下了,把所有东西暂移出去,新建一个空的 window。在同一时刻只能呈现一个 current window window window...
Linux bash 启动配置
bash是默认的shell,有必要了解一下它不同启动方式下的配置过程。 当执行bash命令或者用户登录系统时,会陆续加载各种bash配置文件,还会设置或清空一系列变量,有时还会执行一些自定义的命令,这些行为都算是启动bash时的过程。在不同的系统中具体的逻辑还是不同的,目前只关注Ubuntu和CentOS。 启动过程有两个维度的分类方式: 交互式和非交互式 交互式的标准情景:输入一个命令,然后输出user@host:path$,等待用户输入; 非交互式的标准情景:bash执行一个脚本,例如bash demo.sh。 登录和非登录:顾名思义,非登录情景可以加上--login或-l选项来伪装为登录情况。 可以通过下面的方法进行判断: 交互式的判断: 交互式环境下的$-变量会含有字母i; 交互式定义了提示符$PS1,但是非交互式会清空这个变量,因此echo $PS1可以区分。 登录和非登录的判断:shopt login_shell,返回on或off。 1echo $PS1;shopt...
Cpp构建和编译笔记——9.CMake库的开发
这个环节我们从库的使用者切换为库的开发者,假设我们开发了一个库 Abc,那么如何处理 Abc 库的安装和导入?在导入环节,如何按照 modern cmake 的规范提供 AbcConfig.cmake? 尤其在这部分内容,网上教程非常混乱,CMake 官方文档写的非常复杂难懂,似乎是为超复杂的大型库开发所准备的,而且早期语法和 modern cmake 语法混杂在一起,难以分辨。本文将从简单的示例开始,吸取各个教程的内容,逐渐完善。 方式一:直接安装 我们首先考虑一种最无脑的安装方式:直接把可执行文件,库文件和头文件放到需要的地方去,并且不考虑复用。(CMake 不会导出它的配置信息文件) CMake 支持这种直接无脑的安装,不需要我们真的在文件系统中进行手动拷贝。 示例如下 123install(TARGETS demo4lib1 demo4lib2 demo4exe1 demo4exe2)install(DIRECTORY include/Demo4 TYPE INCLUDE)install(FILES src/Demo4_b.h TYPE INCLUDE) 这里安装四个...
Cpp构建和编译笔记——8.CMake依赖管理
这一篇关注 CMake 的依赖管理,这是最重要的部分:由于 C++没有如 pip,npm 那样统一的包管理(既有历史原因,也是 C/C++的包管理需求太复杂导致的),在使用第三方库时通常需要使用源码编译安装,然后手动管理依赖,涉及到的 CMake 操作非常繁琐。 本文围绕以下内容展开: 项目安装命令 第三方库的使用: 库已经安装到本地,并且支持 CMake:需要导入库的信息 库并不在本地:需要从仓库拉取源码,合并到当前项目中 我们面临很多问题: 不同平台的影响:例如 Windows 平台下的安装位置等非常混乱,而 Linux 则比较统一,使得安装和第三方库的导入都非常规范化 不同的语法风格:例如 CMake 早期的语法风格需要如何导入库,Modern CMake 的语法风格需要如何导入库。CMake 为了适应不同的第三方库,提供了许多不同的接口,语法越来越混乱。 项目安装命令 单独的安装命令通常如下(当前位置是项目根目录,而非在 build 子文件夹中) 12345678(1)make install(2)cmake --build build --target...
Cpp构建和编译笔记——7.CMake语法结构
在上一篇已经学习了作为一门语言的最基本内容,接下来是进一步的内容 流程控制(条件语句,循环语句) 函数和宏 cmake 脚本/模块(不是 CMakeLists,而是.cmake 文件) 条件判断 if 语句 最完整的 if 语法结构如下 1234567if(<condition>) <commands>elseif(<condition>) # optional block, can be repeated <commands>else() # optional block <commands>endif() 其中的 elseif 和 else 都是可选的,例如 1234567if(WIN32) message(STATUS "Now is Windows")elseif(APPLE) message(STATUS "Now is Apple systens.")elseif(UNIX) message(STATUS "Now is...
Cpp构建和编译笔记——6.CMake基本语法
CMake 和 make,shell 脚本一样,本质是一种 DSL 语言。在了解 CMake 的基本概念和用法之后,作为一种编程语言,还是得从最基本的变量,流程控制(for 循环,if 条件),函数等开始学习。在最开始,我们强调一点——CMake 作为一门语言是区分大小写的!只是具体到通常使用的内置命令/自定义函数/自定义宏,不区分大小写。 不得不说,CMake 这一类文本化的语言语法都非常反人类,而且CMake 的官方文档写的真是垃圾中的垃圾。 本文的主要内容 调试输出(IO) 变量 字符串操作 列表操作 数学表达式 调试输出 在 CMakeLists 中,有着和 echo 类似的用于向控制台输出信息的 message 命令 1message([<mode>] "message text") 其中的 mode 通常为 NOTICE: 缺省时默认的选项,表示正常输出到控制台的重要提示信息 WARNING: 表示输出到控制台的警告信息,但不会中断 CMake 的运行 STATUS: 表示正常输出到控制台的一般提示性信息,和...
Cpp构建和编译笔记——5.CMake与CMakeLists
关于 CMake 的内容可能比较多,计划是分成以下几部分: Modern CMake 的基本使用 CMake 基本语法与变量 CMake 语法结构(条件,循环,函数,模块等) CMake 依赖管理(作为库的使用者) CMake 库的开发(作为库的开发者) CMake 命令速查 完全CMake风格的四步命令:构建+编译+测试+安装 1234cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/cmake --build buildcmake --build build --target testcmake --build build --target install 上述命令完全不依赖具体平台。 经典Linux风格的四步命令:构建+编译+测试+安装 123456mkdir buildcd buildcmake ..make -j8ctestmake...