没有修过这门课程,不过迭代逼近的思想偶尔会用到。本文参考了知乎@青玉的数值分析专栏系列文章。
文章目录
数值计算原则
避免相近数相减,会损失有效数字。可以用对数化为除法,三角函数公式,平方差公式等避免减法。
避免大数吃小数,应从小到大计算。
避免除数过小,导致结果是大数,引发大数吃小数。
以等比数列递推公式为例,如果q大于1,误差会越来越大,反之则可控。这叫计算方法稳定性。
步骤简单也能减小误差。
精度与下溢、舍入误差的关系
在开发计算平台的时候,精度问题是重要问题。
https://zhuanlan.zhihu.com/p/103685761
scale 平移法解决下溢问题,不错的思路。
精度与舍入误差(以半精度,即float16为例)
精度与下溢
增加占据的存储空间,会使得一个浮点数能表示更大的范围,上限更大,下限更接近0。
减少存储空间时反之。向数轴右侧平移可以解决下溢问题。
什么是病态问题
https://www.cnblogs.com/RyanXing/p/10771083.html
病态问题是指ill-conditioned posed,与不适定问题ill posed不是一个意思。
函数值的相对误差除以自变量的相对误差,得到的结果非常大。
什么是插值法
已知几个(xi,f(xi))对,要拟合f(xi)。
n个相异点总能用n-1次多项式来拟合。
下图是拉格朗日插值法,可以看出所有的已知点(xi,yi)都满足下式。
其问题在于多加一个已知点就要全部重新计算,牛顿插值法可以解决这个问题。
Jacobi迭代法解线性方程组
想解Ax=b,令A=D-L-U,D为对角矩阵,则
Jacobi 迭代和 Gauss-Seidel 迭代形式几乎一样。但 Gauss-Seidel 及时利用了最新的迭代结果,直观上比 Jacobi 效率更高。
迭代法收敛的条件是,上面的B矩阵的谱半径小于1。
牛顿迭代法解根式
本节引自@马同学。
五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论。
以直线零点代替曲线零点。
另一个方法是二分法。
这两个方法都有初始点的问题,暂不清楚是怎么解决的。
按我理解,牛顿迭代法的初始点最好在零点附近,二分法两个初始点之间最好有且只有一个零点。
函数逼近
用简单函数去逼近给定区间上的连续函数。
平方逼近,是一种度量逼近误差的标准。
函数内积
这里的ρ是权函数。定义内积之后,范数(内积开根号)、正交(内积为0)也就有了。正交函数族适合做基底。
勒让德多项式和切比雪夫多项式是正交函数族的两个例子,它们可以用来做基底。
平方逼近的公式说明如下。Hn就是内积空间了,给基底配上系数,可以表示逼近函数s(x)。
数值积分
最朴素的,梯形公式,一次代数精度(可以精确计算一次函数的积分)。
Simpson公式有三次代数精度。
要使代数精度尽可能高,应选Gauss点作为求积结点。Gauss点可以用正交多项式的零点求得。
总结
这门学科主要解决的问题,多项式拟合,函数逼近,数值积分,常微分方程数值解(本文未讨论),解线性方程组。
附录
矩阵的条件数与病态矩阵
这个例子蛮有启发性的,表面上看,问题出在A和b的细小误差上。实际上是因为A中两个方程的系数非常接近。
矩阵的条件数:
计算上面的例子的第二范数,我们发现其条件数确实很大。条件数很大的A,就是病态矩阵,导致解出来的结果不可信。
LU分解解线性方程组
如果矩阵是上三角或者下三角,那么依次代入就可以解出。
先解LY=b,再解UX=Y。其中L、U都是三角矩阵。
如果矩阵是对称、正定的,还有Cholesky平方根分解法,将矩阵分解为下三角和其转置(当然是一个上三角)的乘积。