数值分析
文章目录
- 数值分析
-
- 全文目录
- 数值分析及其学习工具的作用
-
- 数值分析常用工具
- 具体的数值分析实例(多项简化求值)
- 计算机数值误差产生机制
-
- 计算机的数值存储模式
- 计算机误差产生原因
- 误差
-
- 误差限制和精度
- 模型误差
- 观测误差
- 截断误差
- 舍入误差
- 缺乏有效的数字
- 产生和避免误差
- 误差的传播
- 算法设计的稳定性和病态条件
-
- 病态问题
- 计算的稳定性
- 练习题
- Reference
- About Me
- 联系方式
- 全文目录
- 数值分析及其学习工具的作用
-
- 常用的数值分析工具
- 具体的数值分析实例(多项简化求值)
- 计算机数值误差产生机制
-
- 计算机的数值存储模式
- 计算机误差的原因
- 误差
-
- 误差限制和精度
- 模型误差
- 观测误差
- 截断误差
- 舍入误差
- 缺乏有效的数字
- 产生和避免误差
- 误差的传播
- 算法设计的稳定性和病态条件
-
- 病态问题
- 计算的稳定性
- 练习题
- Reference
- About Me
- 联系方式
全文目录
机器学习(博客园)
(Github)MachineLearning Math
数值分析及其学习工具的作用
数值分析方法是在解决科学研究和实践中遇到的各种奇怪而复杂的问题时,建立一个简单的数学物理模型,最终得到我们需要的解决方案。例如,对于无法获得原始函数的积分,我们可以使用足够的曲边梯形面积来解决。或者对于一个高级方程,我们不能直接得到它的零点,所以在这个时候建立相应的数值分析模型是非常必要的。
常用的数值分析工具
对于本系列课程,建议读者对以下三种语言有一定的了解: ,本系列文章将使用以下三种语言进行算法Coding同时,建议安装以下仓库和应用程序:
应用程序:
- Visual Studio Code:今天最强大的编辑器支持扩展,适合各种语言的开发。强烈建议安装。
- Visual Studio 2022:宇宙第一IDE,微软生产的最强开发套件与C#如果老虎事半功倍,建议使用C#的同学们安装
- Pycharm:JB公司出品的Python IDE,适合于大型Python项目开发使用。如果只是写写小算法小程序,此软件过于庞大,吃性能。
- Matlab:科学计算、建模第一开发工具,其中各种图书馆可以有效地支持您的需求,一个非常强大的工具软件,但软件费用和许多非专业的功能不能使用
- Octave:你可以理解为免费开源Matlab,没有商业用途的各种工具库,只留下最基本的科学计算和Matlab语言,科学计算很好,吴恩达也在机器学习教程中使用这个工具,推荐使用。
- GeoGebra全家桶:科学计算,2,3D绘图最好用的工具之一。
库及SDK:
- .NET 6(C#):微软最新的开发框架、性能速度和语法都达到了前几名,单论语言执行速度和效率都达到了前几名,支持U3d,web、ML等各种开发。单独拿出来是因为微软的库版很多,这里推荐最新的.NET6
- MathNet.Numerics:C#.NET最强大的科学计算工具,在nuget可下载。
- NPlot:C#.NET上一个优秀的绘图工具库
- Numpy:python上一个优秀的科学计算库
- Matplotlib:python用于绘制函数、数据等工具库。
具体的数值分析实例(多项简化求值)
对于复杂的多项计算,我们通常需要花费大量的人力来逐步计算,例如:
f ( x ) = 3 x 4 ? 2 x 3 4 x 2 5 x ? 1 , 求 f ( 1 2 ) f(x)=3x^4-2x^3 4x^2 5x-1,求f(\frac{1}{2}) f(x)=3x4?2x3+4x2+5x−1,求f(21)
最最直接的方法就是进行计算
3 × 1 2 × 1 2 × 1 2 × 1 2 − 2 × 1 2 × 1 2 × 1 2 + 4 × 1 2 × 1 2 + 5 × 1 2 − 1 3\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}-2\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}+4\times\frac{1}{2}\times\frac{1}{2}+5\times\frac{1}{2}-1 3×21×21×21×21−2×21×21×21+4×21×21+5×21−1
我们计算了10次的乘法,同时还计算了四次加减法运算,这实在是太复杂了,那么我们试着去优化一下,倘若我将 a = 1 2 × 1 2 a=\frac{1}{2}\times\frac{1}{2} a=21×21记录一下,那么式子就可以变成
3 × a × a − 2 × a × 1 2 + 4 × a + 5 × 1 2 − 1 3\times a\times a-2\times a\times\frac{1}{2}+4\times a+5\times\frac{1}{2}-1 3×a×a−2×a×21+4×a+5×21−1
这样,我们包含计算a在内大概需要计算7次乘法,四次加减法运算。很明显我们减少了不少的计算步骤,那么继续试试是否又其他的做法?
f ( x ) = 3 x 4 − 2 x 3 + 4 x 2 + 5 x − 1 = x ( 5 + 4 x − 2 x 2 + 3 x 3 ) − 1 = x ( 5 + x ( 4 − 2 x + 3 x 2 ) ) − 1 = x ( 5 + x ( 4 + x ( 3 x − 2 ) ) ) − 1 f(x)=3x^4-2x^3+4x^2+5x-1\\ =x(5+4x-2x^2+3x^3)-1\\ =x(5+x(4-2x+3x^2))-1\\ =x(5+x(4+x(3x-2)))-1 f(x)=3x4−2x3+4x2+5x−1=x(5+4x−2x2+3x3)−1=x(5+x(4−2x+3x2))−1=x(5+x(4+x(3x−2)))−1
通过这个变换(称为霍纳方法、嵌套乘法),我们只需要进行4次乘法和4次加法,计算的时候从内往外计算。一般而言,任意一个n次多项式都可以通过n次乘法和n次加法求得。
这个例子展示了科学计算的主题特征,简单计算的速度总是比复杂的计算快得多,同一个问题当我们采取不同的方法时可能可以有效的提升我们的效率和速度。这也是为什么数值分析(计算方法)显得尤为重要的原因。
计算机数值误差产生机理
计算机的数值存储方式
这里我们直接对计算机数值存储方式进行讲解而不作过多的展开。详细的内容可以参考我《.NET Guide》—— 基本数据类型及其存储方式 #5.2
计算机误差产生原因
数值分析是一门建立在计算机计算的基础上的学科,我们需要详细解释一下在计算机中,是什么导致了误差的出现。首先抛出一个问题,为什么计算机会存在精度问题?或者换句话说,任何非0、5结尾的小数在计算机中都不是一个精确值?
上述问题是一个非常有建设意义的问题,我们知道计算机时使用二进制进行数据的运算和存储的,那么根据二进制的计算法则,浮点数的二进制表示应当是 ∑ i ∗ 2 − n , i ∈ { 0 , 1 } , n ∈ N + \sum i*2^{-n},i \in \{0,1 \},n \in N^+ ∑i∗2−n,i∈{ 0,1},n∈N+,根据这个式子不难看出对于二进制而言,并不能用有限的位数表示所有的浮点数。举个浅显的例子,例如十进制数 ( 1 3 ) 10 = 0. 3 ˙ (\frac{1}{3})_{10}=0.\dot{3} (31)10=0.3˙,无论我们怎么写都无法用有限的十进制位数写出准确的数值,只能通过近似的值进行描述,当我们采用三进制数,我们就能用有限小数 ( 0.1 ) 3 (0.1)_3 (0.1)3 进行描述。
因此对于二进制存储信息的计算机来说,数据的存储位数总是有限度的,我们不可能准确的表述每一个浮点数,于是,对于那些无法表示的数值,我们只能采取近似的手段进行拟合,误差就出现了。
误差
误差限与精度
首先我们给出这样一个定义,设 x ∗ x^* x∗是某量的一个精确值,而 x x x 是此量的近似值,那么我们将 e = ∣ x ∗ − x ∣ e = |x^*-x| e=∣x∗−x∣ 定义为值的 ,也就是。
不过在工程实践中,我们往往是不知道实际值 x ∗ x^* x∗的,同时误差e也并不是已知量,我们只能设法在计算过程中采取某些手段,对误差进行一个估计。这个估计是一个区间范围,那么给出下面条件
∃ ϵ > 0 , ∣ e ∣ = ∣ x ∗ − x ∣ ≤ ϵ \exist \epsilon>0,\\ |e| = |x^*-x|\leq\epsilon ∃ϵ>0,∣e∣=∣x∗−x∣≤ϵ
若上式成立,我们则给出了 x − ϵ ≤ x ∗ ≤ x + ϵ , x ∈ [ x − ϵ , x + ϵ ] x-\epsilon\leq x^*\leq x+\epsilon,x\in[x-\epsilon,x+\epsilon] x−ϵ≤x∗≤x+ϵ,x∈[x−ϵ,x+ϵ],于是我们称 ϵ \epsilon ϵ为绝对误差限,又称为精度。它描绘了我们近似值与绝对值的相似程度,给出了误差的最大值。
通常,在同一范围或数量级内,误差限越小,也就是我们的数据越精确。当逾越这条线的时候,绝对误差限就显得心有余而力不足了。例如数字的近似值是9999,精确值是10000,它的误差限是1;若近似值是9,精确值是10,误差限也是1,很明显前者的拟合效果要好于后者。我们称前者是99.99%的吻合度,而后者的吻合度是90%。
上述式子很明显是因为比较的数量级不同而导致的,为了更好的描述,我们采用相对误差及相对误差限进行描述。相对误差定义为 e r = e x ∗ = 1 − x x ∗ e_r=\frac{e}{x^*}=1-\frac{x}{x^*} er=x∗e=1−x∗x,根据量纲的计算法则,很明显相对误差区别于绝对误差的地方就在于相对误差是一个无量纲常量,通常也采用百分比作为表示。
与绝对误差一样,我们通常无法直接得出 e r e_r er的值,精确值往往也是未知的,同样的,我们使用相对误差限去给出一个区间估计。