跳至主要內容
数值分析

数值分析

  • 2024研究生课程「数值分析」笔记&复习要点。

1. 绪论

1.1. 误差和误差限

  1. 绝对误差

    e=xx e^{*} = x^{*} - x

    即真实值和近似值的绝对差,一般情况我们不知道真实值,所以求不出绝对误差。但是可以求绝对误差限e<ε\vert e^{*}\vert < \varepsilon

  2. 相对误差

    erex=xxx e^{*}_r \approx \frac{e^{*}}{x^{*}} = \frac{x^{*} - x}{x^{*}}

    相对误差限为er<εr\vert e^{*}_r\vert < \varepsilon_r


Xenny原创大约 18 分钟笔记数值分析
论文写作(结课报告)

论文写作(结课报告)

  • 本篇博文为2024年研究生课程《论文写作》结题报告。

    本文从论文框架开始,按照总分结构,逐步分析论文写作中各类技巧以及注意事项。

论文框架

  1. 要写什么论文?

    找到工作的重心,例如对于目前大部分A+B工作,需要知道该重点写什么,大家都知道你有效果提升,但是提升了多少?为什么会提升?前人做错了?后续还能更好?

    当然这里更多是实验的工作,但是实验最终还是为了写作的,所以搞清楚要做什么,要写什么。当然,大部分的文章模仿lab/该领域内大家的叙事风格即可。

  2. 怎么写论文,先写什么,后写什么?

    对于一篇论文,摘要算是全文的缩写。总结算是核心的重复。而对于其他部分基本可以拆成下列内容

    1. Introducation
        引入问题、前人工作、具体方案
        现有挑战、本文方法、本文贡献
    2. Related Work
        领域综述、技术描述、技术细节
    3. Network
        模型细节、损失函数、算法细节
        训练方案
    4. Experiments
        数据介绍、数据处理、对比算法
        实验设置、实验结果、对比分析
    5. Discuss/Analysis
        提出问题、分析问题、消融实验
        开放探讨
    

    此时,可以考虑做了什么工作就写哪部分,以及注意每部分重心,例如Introducation中介绍某个算法时不应该把细节讲的太清楚,而重点要考虑为什么要介绍这个算法。例如

    1. 该领域内创先/转折点/开山之作,但是比较老我们该文不会再用到,这种作为一个阶段的代表作提一下就行。
    2. 该文近似领域内相关算法,里面用到的方法/组件很好,本文也(或者说大家都)使用了。那就重点是将里面的方法/组件。
    3. 某种方法/组件。在intro里面讲一下它的来历和好处就行了,计算细节/原因分析可以后面再讲。

    对于其他部分也是同理。

    同时对于摘要还是尽量先写好,这些写每个部分的时候不会偏题。而总结的话可以最后写,主要是写你要再次强调的部分,例如效果很好、方法很新之类的。


Xenny原创大约 10 分钟课程论文写作
最优化理论

最优化理论

例题

  1. 11

    import pulp
    prob = pulp.LpProblem("Binary_and_Continuous_LP", pulp.LpMinimize)
    
    x1 = pulp.LpVariable('x1', cat='Binary')
    x2 = pulp.LpVariable('x2', cat='Binary')
    x3 = pulp.LpVariable('x3', cat='Binary')
    
    prob += 4*x1 + 3*x2 + 2*x3
    prob += 2*x1 - 5*x2 + 3*x3 <= 4
    prob += 4*x1 + 1*x2 + 3*x3 >= 3
    prob += x2 + x3 >= 1
    
    prob.solve()
    print(f"Status: {pulp.LpStatus[prob.status]}")
    print(f"x1 = {pulp.value(x1)}")
    print(f"x2 = {pulp.value(x2)}")
    print(f"x3 = {pulp.value(x3)}")
    print(f"Objective = {pulp.value(prob.objective)}")
    
  2. xxx

    import pulp
    prob = pulp.LpProblem("Binary_and_Continuous_LP", pulp.LpMaximize)
    
    x1 = pulp.LpVariable('x1', cat='Binary')
    x2 = pulp.LpVariable('x2', cat='Binary')
    x3 = pulp.LpVariable('x3', cat='Binary')
    x4 = pulp.LpVariable('x4', cat='Binary')
    x5 = pulp.LpVariable('x5', cat='Binary')
    
    prob += 3*x1 + 2*x2 - 5*x3 - 2*x4 + 3*x5
    prob += x1 + x2 + x3 + 2*x4 + x5 <= 4
    prob += 7*x1 + 3*x3 - 4*x4 + 3*x5 <= 8
    prob += 11*x1 - 6*x2 + 3*x4 - 3*x5 >= 1
    
    prob.solve()
    print(f"Status: {pulp.LpStatus[prob.status]}")
    print(f"x1 = {pulp.value(x1)}")
    print(f"x2 = {pulp.value(x2)}")
    print(f"x3 = {pulp.value(x3)}")
    print(f"x4 = {pulp.value(x4)}")
    print(f"x5 = {pulp.value(x5)}")
    print(f"Objective = {pulp.value(prob.objective)}")
    
  3. xxx

    import pulp
    
    prob = pulp.LpProblem("Binary_and_Continuous_LP", pulp.LpMinimize)
    
    x1 = pulp.LpVariable('x1', lowBound=0)
    x2 = pulp.LpVariable('x2', lowBound=0)
    x3 = pulp.LpVariable('x3', lowBound=0)
    
    prob += 2*x1 + x2 + x3
    prob += x1 + 2*x2 + 2*x3 == 6
    prob += 2*x1 + x2 == 5
    
    prob.solve()
    print(f"Status: {pulp.LpStatus[prob.status]}")
    print(f"x1 = {pulp.value(x1)}")
    print(f"x2 = {pulp.value(x2)}")
    print(f"x3 = {pulp.value(x3)}")
    print(f"Objective = {round(pulp.value(prob.objective))}")
    

Xenny原创大约 1 分钟课程最优化理论
禁忌搜索算法

禁忌搜索算法

解决什么问题

  • 启发式搜索算法——求解近似值

    解决无法找到精确解的复杂优化问题,例如背包问题、神经网络训练、调度问题、工程设计问题。(引入)

    特点是利用过去的经验解决具体问题。 有时候不能保证问题一定结局,却常常能有效解决问题。

  • 分类

    1. 基于群体

      每次迭代搜索一组解,算法依赖于多个个体之间的信息交互。

    2. 基于个体

      关注单个解,从某个解出发迭代得到最优解。

  • 核心思想

    给出多个迭代方向、逃离局部最优解


Xenny原创大约 7 分钟笔记禁忌搜索
FISTA解决地震反演问题 [WIP]

FISTA解决地震反演问题 [WIP]

  • 迭代收缩阈值算法(Iterative shrinkage-thresholding algorithm, ISTA)是一种用于信号处理和图像重建的优化算法。

    本文将介绍ISTA算法原理和其处理地震反演问题的实际应用。

优化问题

梯度下降

  • 对于一个线性变换问题y=Ax+b\mathbf{y} = \mathbf{A}\mathbf{x} + \mathbf{b},其中A\mathbf{A}y\mathbf{y}已知,b\mathbf{b}为未知噪音,我们需要求解x\mathbf{x}

    本质上这就是一个线性回归问题,从线性回归可知我们可以使用梯度下降解决这个问题。

  • 梯度下降会带来新的问题,对于无约束的优化问题

    minx{F(x)f(x)}.(1) \underset{x}{\min}\{F(x)\equiv f(x)\}.\tag{1}

    若实函数F(x)F(x)在点aa处可微且有定义,梯度下降总是认为F(x)F(x)在点aa沿着梯度相反的方向F(a)-\nabla F(a)下降最快。

    所以当f(x)f(x)连续可微时,若存在一个足够小的数值t>0t>0使得

    x2=x1tF(a).(2) x_2 = x_1 -t\nabla F(a).\tag{2}

    则有F(x1)F(x2)F(x_1) \ge F(x_2)

    梯度下降核心便是通过式2找到序列{xk}\{x_k\},使得F(xk)F(xk1)F(x_k)\ge F(x_{k-1})

    显然,此时初值的选取成了关键,即梯度下降可能陷入局部最优,同时tkt_k的选取(机器学习中的学习率)也是关键,太小会导致迭代太慢,太大会导致无法收敛。


Xenny大约 5 分钟深度学习FISTA
CAUC: Combining Channel Attention U-Net and Convolution for Seismic Data Resolution Improvement

CAUC: Combining Channel Attention U-Net and Convolution for Seismic Data Resolution Improvement

  • DOI:10.1109/LGRS.2023.3322263

  • 地震分析和解释对数据分辨率很敏感。由于复杂的自然环境和有限的采集技术,原始地震数据分辨率通常较低。但地震子波的频率带宽是可调的,所以根据这些特征来提高数据的分辨率是可行的。本文提出了一种通道注意U-Net和物理卷积组合(CAUC)算法来增强地震数据的分辨率。


Xenny大约 4 分钟FWIFWIU-Net
地震反演基本知识

地震反演基本知识

基本概念

  1. 地震数据

    波向地下传播时,由于地下结构不同导致地震波会反射回地表,通过在地表设置检波器收集到的波数据即为地震数据。

  2. 速度模型

    在地震反演中,我们用速度模型来描述地下地质结构,不同的介质波的传播速度不一样,故而可以由速度模型反推介质成分。

  3. 波阻抗(Impedance)

    波阻抗等于速度乘密度,波阻抗越大代表要产生单位振动速度所需的应力越大。

  4. 反射系数

    反射系数代表地震波在地下不同介质界面上发生折射、反射的能量损失程度。计算公式为

    ri=AIi+1AIiAIi+1+AIi,(1) r_i = \frac{AI_{i+1} - AI_{i}}{AI_{i+1} + AI_i},\tag{1}

    其中AIAI代表波阻抗。

  5. 地震褶积

    其实就是子波和反射系数进行卷积运算,一般是在时间域进行运算。本质是把反射系数序列作为一个函数,是地震波传播的数字信号模拟。可以理解为地震波在地下垂直传播过程,在经过不同界面时和反射系数进行叠加。


Xenny原创大约 1 分钟FWIFWI