数值微分与数值积分

微积分学提供了求函数导数与定积分的解析方法,但在实际问题中,函数往往以离散数据形式给出,或虽具有解析表达式却难以求导或原函数无法用初等函数表示。因此,需要建立基于离散点上的函数值来近似计算导数与积分的数值方法,分别称为数值微分与数值积分。一、数值微分数值微分的基本思想是利用函数在若干点上的值,通过差商或插值多项式来近似函数的导数。1、差商型求导公式由导数的定义$$ f'(x)=\lim_{h\to0}\frac{f(x+h)-f(x)}{h} $$当步长 $h$ 充分小时,可用差商近似导数。常用的差商公式有:向前差商公式$$ f'(x…
函数逼近

在前几章中,我们讨论了插值法,其核心要求是近似函数必须严格通过所有给定的数据节点。然而,在实际工程与科学实验中,观测数据往往带有测量误差,且数据点数量庞大。若强行要求近似曲线穿过每一个点,不仅计算复杂,还可能因过度拟合而放大噪声,导致曲线剧烈振荡,反而无法反映被研究现象的整体变化规律。为此,我们需要另一类数值方法——曲线拟合(又称函数逼近)。它不要求近似函数在节点处与函数值完全相等,即不要求近似曲线过已知点,只要求它尽可能反映给定数据点的基本趋势,在某种意义下与原始函数最“逼近”。设给定一组观测数据 $(x_i, y_i)\ (i=0,1,\cdots,…
插值法

在生产实践中,由于给出的通常是一批离散的样点,为了满足设计和理论分析的需要,我们需要寻求函数的分析表达式。解决这类问题主要有两类方法:一类是要求近似函数严格通过给定的已知样点,这称为插值法;另一类则不要求严格通过已知点,只要求总偏差最小,称为曲线拟合法。本文详细梳理插值法(特别是多项式插值)的理论、公式推导及误差分析。一、拉格朗日 (Lagrange) 插值1、多项式插值原理代数插值的基本问题是:已知函数 $f(x)$ 在区间 $[a,b]$ 上的 $n+1$ 个互异点 $x_0, x_1, \dots, x_n$ 处的函数值为 $y_i = f(x_i…
MATLAB基础语法

[!NOTE]下面的内容主要来自于上课 PPT + AI 生成Lec 1:MATLAB 入门、数组、数值精度1. 课程基本信息1.1 课程名称Introduction to Scientific Computing科学计算导论本课程围绕 MATLAB 展开,学习科学计算中常用的编程、矩阵运算、可视化、数值方法和工程应用。2. Course outline & schedule 课程安排周次内容Week 1Lec 1:Course Introduction, Machine Model, Intro to MATLAB, Built-in function…
矩阵特征值与特征向量的计算

一、幂法和反幂法1、幂法由于求解特征方程$|\boldsymbol{I}-\lambda\boldsymbol{A}|=0$的计算量巨大,所以在求解特征值时,要从特征值的定义$$ \boldsymbol{Ax}=\lambda\boldsymbol{x} $$入手。设 $n \times n$ 阶实矩阵 $A$ 的特征值 $\lambda_i \ (i=1,2,\cdots,n)$ 满足:$$ |\lambda_1| > |\lambda_2| \geq \cdots \geq |\lambda_n| $$且与 $\lambda_i\ (i=1,2…
求线性方程组解的直接方法

线性方程组具有一般形式:$$ \begin{cases}&a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=b_1\\&a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n=b_2\\&\vdots\\&a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n=b_n\end{cases} $$其中,$a_{ij}, b_i$为常数,$x_1, x_2, \cdots, x_n$为未知量。上式也可写成矩阵形式:$$ \boldsymbol{A}x=b $$如果线性…
误差

一、误差的基本概念由数学方法解决实际问题时,通常按照以下过程:$$ 实际问题\xrightarrow{抽象、简化}数学模型\xrightarrow{数值计算}问题近似解 $$引起误差的原因有很多:模型误差:实际问题的解与数学模型解的之差。观测误差:数学问题的一些参量的值往往由观测得到,但是观测不可能绝对准确,由此产生的误差称为“观测误差”。截断误差:一般数学问题难以求出精确解,需要简化为较易求解的问题,以简化问题的解作为原问题解的近似,例如泰勒展开后省略后面的无穷多项。舍入误差:计算过程中,受到机器字长的限制,无穷小数和位数很多的数必须舍入成一定的位数,…
对抗搜索

一、引言1、为什么需要对抗搜索在过去,我们讨论的搜索问题都发生在一个“静态”或“可预测”的环境中。例如,在路径规划问题中,从城市A到城市B的道路成本是固定的,环境不会主动与我们作对。然而,在许多现实世界的问题中,我们必须面对一个或多个会做出反应、并试图阻碍我们达成目标的对手。这类问题被称为对抗搜索问题,最典型的例子就是博弈,如棋类游戏。在这些博弈环境中,我们的每一个决策不仅取决于我们自己的目标,还必须考虑到对手的可能反应。对手的目标通常与我们的目标相反。例如,在二人零和游戏中,一方的收益就是另一方的损失。本文将探讨在这种对抗性环境中进行决策的算法。我们将…
启发式搜索

一、贪婪最佳优先搜索算法1、引言无信息搜索算法,如广度优先搜索(BFS)和深度优先搜索(DFS),这些算法在探索状态空间时,除了问题定义本身提供的状态转移规则外,没有任何额外的信息来判断一个非目标节点比另一个“更有希望”接近目标。因此,它们通常是盲目地进行搜索。为了提高搜索效率,我们引入了启发式搜索算法,也称为有信息搜索。这类算法利用与问题相关的启发式信息来引导搜索方向,优先选择那些看起来最接近目标的节点进行扩展。贪婪最佳优先搜索算法是启发式搜索中最简单、最直观的一种。它的核心思想非常朴素:在每一步选择中,都选择那个离目标估计最近的节点进行扩展,而完全忽…
因果推理

一、因果推理的基本概念1、因果推理哲学上把现象和现象之间那种“引起和被引起”的关系,叫做因果关系,其中引起某种现象产生的现象叫做原因,被某种现象引起的现象叫做结果。因果推理是一种重要的推理手段,是人类智能的重要组成。2、辛普森悖论辛普森悖论是统计学中的一种反直觉现象,指的是在分组数据中,某种趋势在各子组中都存在,但当把所有数据合并后,趋势却发生了逆转。例如,某药物在男性和女性两个子组都有提高治愈率的效果,但合并数据后可能反而显示总体治愈率下降。这是因为分组比例不同或其他潜在变量影响了整体结果。辛普森悖论提醒我们,在分析数据时,要注意分组情况和潜在的混杂因…
逻辑与推理

[!NOTE]这份文章主要涉及命题逻辑、谓词逻辑和知识图谱推理,有关因果推理的内容,点击链接因果推理。一、命题逻辑1、相关概念与定理命题逻辑是应用一套形式化规则对以符号表示呃描述性陈述进行推理的系统。命题是一个能够确定为真或者假的陈述句,通常使用小写符号$p$或者$q$来表示。命题总有一个“值”,称为真值,为真或者假,只有确定真值的陈述句才是命题,无法判断正确性的描述性句子不能作为命题。原子命题指不包括其他命题或者作为其组成部分的命题,又称为简单命题。复合命题指包含其他命题作为其组成部分的命题。在命题逻辑中,一个或真或假的描述性陈述被称为原子命题,对原子…
模拟退火

〇、爬山算法(Hill Climbing)在介绍模拟退火之前,先简单介绍一下爬山算法。爬山算法(Hill Climbing, HC)是一种简单直接的优化方法。它的核心思想是:从一个初始解出发,不断寻找更好的解。如果找不到更好的解,就停止。对于最小化问题,我们可以把目标函数记为 $f(x)$,算法的基本流程如下:在当前解的邻域中寻找一个更优解。如果找到更优解,就移动到这个解。如果找不到更优解,就停止(说明已经达到局部最优)。公式表示如下:$$ x_{k+1} = \begin{cases} \displaystyle \arg\min_{x'\i…
Taichi的可视化

一、关于 print 语句Taichi 内可以像 Python 一样使用 print 来输出信息。例如:import taichi as ti ti.init(arch=ti.cpu) # 或 ti.cuda @ti.kernel def foo(): m = ti.Matrix([[2, 3, 4], [5, 6, 7]]) print('m =', m) # 在 kernel 内部打印矩阵 foo()并行执行时(尤其在 GPU 上),同一 kernel 内来自不同线程的 print 输出顺序通常是不可预期的(可能乱序),因此不要依…
Taichi的计算核

一、Taichi计算核(Kernel)在函数定义上一行加上 @ti.kernel 装饰器,该函数会被编译为高性能 Taichi 计算核。只能在 Python 域调用 Kernel,不能在 Kernel 内再调用另一个 Kernel。1、正确示例@ti.kernel def foo(): print("foo") # 输出 "foo" @ti.kernel def bar(): print("bar") # 输出 "bar" foo() # 在 Python 域调用 bar()…
Taichi的数据类型

一、Taichi的架构初始化Taichi支持多种硬件后端,初始化时通过ti.init(arch=...)指定运行平台。import taichi as ti ti.init(arch = ti.cuda) # 指定CUDA后端, 用于NVIDIA GPU加速ti.cpu:在CPU上运行。ti.gpu:在GPU上运行,自动选择CUDA或OpenGL/Metal。ti.cuda:显式选择CUDA后端。ti.arm:ARM架构支持。ti.x64:x86架构支持。二、变量作用域:Python域与Taichi域Taichi @ti.kernel修饰的函数与普通Py…