数值分析
- 2024研究生课程「数值分析」笔记&复习要点。
1. 绪论
1.1. 误差和误差限
-
绝对误差
即真实值和近似值的绝对差,一般情况我们不知道真实值,所以求不出绝对误差。但是可以求绝对误差限。
-
相对误差
相对误差限为。
绝对误差
e∗=x∗−x
即真实值和近似值的绝对差,一般情况我们不知道真实值,所以求不出绝对误差。但是可以求绝对误差限∣e∗∣<ε。
相对误差
er∗≈x∗e∗=x∗x∗−x
相对误差限为∣er∗∣<εr。
本篇博文为2024年研究生课程《论文写作》结题报告。
本文从论文框架开始,按照总分结构,逐步分析论文写作中各类技巧以及注意事项。
要写什么论文?
找到工作的重心,例如对于目前大部分A+B工作,需要知道该重点写什么,大家都知道你有效果提升,但是提升了多少?为什么会提升?前人做错了?后续还能更好?
当然这里更多是实验的工作,但是实验最终还是为了写作的,所以搞清楚要做什么,要写什么。当然,大部分的文章模仿lab/该领域内大家的叙事风格即可。
怎么写论文,先写什么,后写什么?
对于一篇论文,摘要算是全文的缩写。总结算是核心的重复。而对于其他部分基本可以拆成下列内容
1. Introducation
引入问题、前人工作、具体方案
现有挑战、本文方法、本文贡献
2. Related Work
领域综述、技术描述、技术细节
3. Network
模型细节、损失函数、算法细节
训练方案
4. Experiments
数据介绍、数据处理、对比算法
实验设置、实验结果、对比分析
5. Discuss/Analysis
提出问题、分析问题、消融实验
开放探讨
此时,可以考虑做了什么工作就写哪部分,以及注意每部分重心,例如Introducation中介绍某个算法时不应该把细节讲的太清楚,而重点要考虑为什么要介绍这个算法。例如
对于其他部分也是同理。
同时对于摘要还是尽量先写好,这些写每个部分的时候不会偏题。而总结的话可以最后写,主要是写你要再次强调的部分,例如效果很好、方法很新之类的。
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)}")
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)}")
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))}")
启发式搜索算法——求解近似值
解决无法找到精确解的复杂优化问题,例如背包问题、神经网络训练、调度问题、工程设计问题。(引入)
特点是利用过去的经验解决具体问题。 有时候不能保证问题一定结局,却常常能有效解决问题。
分类
基于群体
每次迭代搜索一组解,算法依赖于多个个体之间的信息交互。
基于个体
关注单个解,从某个解出发迭代得到最优解。
核心思想
给出多个迭代方向、逃离局部最优解
迭代收缩阈值算法(Iterative shrinkage-thresholding algorithm, ISTA)是一种用于信号处理和图像重建的优化算法。
本文将介绍ISTA算法原理和其处理地震反演问题的实际应用。
对于一个线性变换问题y=Ax+b,其中A和y已知,b为未知噪音,我们需要求解x。
本质上这就是一个线性回归问题,从线性回归可知我们可以使用梯度下降解决这个问题。
梯度下降会带来新的问题,对于无约束的优化问题
xmin{F(x)≡f(x)}.(1)
若实函数F(x)在点a处可微且有定义,梯度下降总是认为F(x)在点a沿着梯度相反的方向−∇F(a)下降最快。
所以当f(x)连续可微时,若存在一个足够小的数值t>0使得
x2=x1−t∇F(a).(2)
则有F(x1)≥F(x2)。
梯度下降核心便是通过式2找到序列{xk},使得F(xk)≥F(xk−1)。
显然,此时初值的选取成了关键,即梯度下降可能陷入局部最优,同时tk的选取(机器学习中的学习率)也是关键,太小会导致迭代太慢,太大会导致无法收敛。
地震分析和解释对数据分辨率很敏感。由于复杂的自然环境和有限的采集技术,原始地震数据分辨率通常较低。但地震子波的频率带宽是可调的,所以根据这些特征来提高数据的分辨率是可行的。本文提出了一种通道注意U-Net和物理卷积组合(CAUC)算法来增强地震数据的分辨率。
地震数据
波向地下传播时,由于地下结构不同导致地震波会反射回地表,通过在地表设置检波器收集到的波数据即为地震数据。
速度模型
在地震反演中,我们用速度模型来描述地下地质结构,不同的介质波的传播速度不一样,故而可以由速度模型反推介质成分。
波阻抗(Impedance)
波阻抗等于速度乘密度,波阻抗越大代表要产生单位振动速度所需的应力越大。
反射系数
反射系数代表地震波在地下不同介质界面上发生折射、反射的能量损失程度。计算公式为
ri=AIi+1+AIiAIi+1−AIi,(1)
其中AI代表波阻抗。
地震褶积
其实就是子波和反射系数进行卷积运算,一般是在时间域进行运算。本质是把反射系数序列作为一个函数,是地震波传播的数字信号模拟。可以理解为地震波在地下垂直传播过程,在经过不同界面时和反射系数进行叠加。
深度残差网络表现出很好的分类准确率,该文是作者在原始ResNet的基础上分析了残差块背后的数学原理。