一般来说,解决实际问题的第一步是将实际问题转换为数学问题,接着建立数学模型来解决这个数学问题,而理论解或者解析解通常难以求得,于是数值计算的方法应运而生
首先我们要将一个数学问题转化成数值问题
数值问题是指输入数据与输出数据之间函数关系的一个确定而无歧义的描述
按照建立数值问题的基本形式,数学问题可以分为两大类
这一本书面向数值计算的三大类计算任务
数学与科学,工程中的大量问题,最后归结为数值线性代数问题,这一大类问题通常和矩阵有关,故又称为矩阵计算 数值线性代数包括
构造数值计算方法的基本途径是近似
由于是导论,故不深入探讨,这里列出几种思想
数值计算的几种方法
数值方法的评价标准
数值计算的误差是指数学模型的真解和由数值方法得到的近似解之间的偏差
误差按来源可以这样分类
这里引入绝对误差,相对误差和有效数字的概念
首先是绝对误差 ![](http://www.forkosh.com/mathtex.cgi? $$e(x)=x-\tilde {x}$$) , 其中![](http://www.forkosh.com/mathtex.cgi?$$\tilde x$$)为x的近似值,我们可以得到绝对误差界 ![](http://www.forkosh.com/mathtex.cgi? $$\begin{vmatrix} e(x) \end{vmatrix} =\begin{vmatrix} x-\tilde x \end{vmatrix} \le \Delta (x) =\Delta $)
然而绝对误差并不能很好的表现数的近似程度,引出相对误差 ![](http://www.forkosh.com/mathtex.cgi?$$\epsilon ^ =\epsilon ^ * (x) = \frac{e(x)}{x} =\frac{x-\tilde x}{x} $$) 自然也有相对误差界* ![](http://www.forkosh.com/mathtex.cgi? $$\begin{vmatrix} \epsilon ^ * \end{vmatrix} = \begin{vmatrix} \epsilon ^ * (x) \end{vmatrix} = \begin{vmatrix} \frac{e(x)}{x} \end{vmatrix}=\begin{vmatrix}\frac{x-\tilde x}{x}\end{vmatrix} \le \delta *(x)=\delta*$$) 注意到分母为x,而实际当中我们经常用![](http://www.forkosh.com/mathtex.cgi?$$\tilde x$$)来代替分母,即![](http://www.forkosh.com/mathtex.cgi? $$\begin{vmatrix}\epsilon\end{vmatrix}= \begin{vmatrix} \epsilon (x) \end{vmatrix}= \begin{vmatrix} \frac{e(x)}{\tilde x} \end{vmatrix}=\begin{vmatrix} \frac{x-\tilde x}{\tilde x} \end{vmatrix} \le \delta(x)=\delta $$)
接下来给出有效数字的定义 如果近似值的误差界是某一位的半个单位,且该位到近似值的第一位有n个非零数,那么该近似值就有n位有效数字
使用四舍五入法可以使绝对误差最小,并且利用四舍五入法来计算近似值,每一位数值都是有效可靠的
可进一步探寻近似值和相对误差之间的某种联系,记 ![](http://www.forkosh.com/mathtex.cgi?$$\tilde x = \pm 0.a_1a_2\cdots a_n \times 10^m = \pm a_1a_2\cdots a_n \times 10^{m-1} $$) 通过简单的放缩可得 ![](http://www.forkosh.com/mathtex.cgi?$$a_1 \times 10^{m-1} \le \tilde x \le (a_1+1) \times 10^{m-1}$$) 那么当近似值的有效数字为n时,相对误差的上界为 ![](http://www.forkosh.com/mathtex.cgi?$$\begin{vmatrix} \epsilon (x) \end{vmatrix}= \begin{vmatrix} \frac{e(x)}{\tilde x} \end{vmatrix}=\begin{vmatrix} \frac{x-\tilde x}{\tilde x} \end{vmatrix} \le \frac{0.5 \times 10^{m-n}}{a_1 \times 10^{m-1} }=\frac{1}{2a_1}\times 10^{1-n}$$)
由此可以引申出一个定理 如果x的有效数字位数为n,则有 ![](http://www.forkosh.com/mathtex.cgi?$$\delta \le \frac{1}{2a_1}\times 10^{1-n}$$) 反之,如果![](http://www.forkosh.com/mathtex.cgi?$$\delta \ge \frac{1}{2(a_1+1)}\times 10^{1-n}),则有效数字位数至少有n
讨论一下函数的误差 其中绝对误差为
相对误差为
![](http://www.forkosh.com/mathtex.cgi?$$\epsilon(y)=\frac{e(y)}{\tilde y}=\frac{f^(\tilde x)e(x)}{\tilde y} =\frac{\tilde xf^
(\tilde x)e(x)}{\tilde y \tilde x}=\frac{\tilde x f^(\tilde x)}{\tilde y}\epsilon (x)$$) 相对误差界为 ![](http://www.forkosh.com/mathtex.cgi?$$\begin{vmatrix}\epsilon(y)\end{vmatrix}\le\frac{\begin{vmatrix}\tilde x \end{vmatrix}\begin{vmatrix}f^
(\tilde x)\end{vmatrix}}{\begin{vmatrix}\tilde y\end{vmatrix}}\delta(x)$$)
从而
![](http://www.forkosh.com/mathtex.cgi?$$Def : \delta(y)=\frac{\begin{vmatrix}\tilde x \end{vmatrix}\begin{vmatrix}f^(\tilde x)\end{vmatrix}}{\begin{vmatrix}\tilde y\end{vmatrix}}\delta(x) = A_{f}\delta(x)$$) ![](http://www.forkosh.com/mathtex.cgi?$A_{f}$)即函数的相对误差界放大系数 ![](http://www.forkosh.com/mathtex.cgi?$$A_{f}=\frac{\begin{vmatrix}\tilde x \end{vmatrix}\begin{vmatrix}f^
(\tilde x)\end{vmatrix}}{\begin{vmatrix}\tilde y\end{vmatrix}}$$)
进一步推广至多元函数 利用Tayor展开可知其中绝对误差为
给出绝对误差界
得相对误差界
即多元函数的相对误差界放大系数
接下来介绍减少误差的计算法则
关于数值稳定的定义
如果一个算法经过多次计算,将初始的误差变大了,陈该算法为数值不稳定的,反之为数值稳定的
关于病态问题的定义
如果一个数值问题,对输入做出轻微的扰动会对输出产生较大的影响,称该问题为病态的
一个算法的复杂度有两种,分别为
计算复杂度取决于被求解问题的规模大小,输入数据和算法本身,计算复杂度用算法的基本运算次数与基本操作量来测量
数学上用时间复杂度为问题规模的多项式函数或者指数函数来作为区分算法好与坏的分水岭,如果时间复杂度为问题规模的多项式函数那么这个算法是好的,而如果是指数函数则被称为不好的算法
由于输入数据的不同,时间复杂度也不同,我们引入复杂度的期望作为平均时间复杂度
我们利用算法复杂度来度量那些使用直接法的算法,对于迭代的算法我们使用收敛率来评价
由于这里没有对向量,矩阵等给出其大小的“测度”,故先讨论下迭代法产生的实数的序列![](http://www.forkosh.com/mathtex.cgi?$$\lbrace x_k\rbrace_{k=0}^\infty$$) 收敛率的高低使用收敛阶的大小衡量
Def:如果上述实数序列收敛于x,即![](http://www.forkosh.com/mathtex.cgi?$$\lim_{k\to \infty}x_k=x$$),假定存在某个正数![](http://www.forkosh.com/mathtex.cgi?$r\in [1,\infty$),使得极限 ![](http://www.forkosh.com/mathtex.cgi?$$ \lim_{k\to \infty}\frac{e_{k+1}}{e_k^r}=\lim_{k\to \infty}\frac{\begin{vmatrix} x_{k+1}-x\end{vmatrix}}{\begin{vmatrix} x_{k}-x\end{vmatrix}^r}=c_r>0$$) 存在,称该迭代法是r阶收敛
需要注意的是,若有 ![](http://www.forkosh.com/mathtex.cgi?$$\lim_{k\to \infty}\frac{\begin{vmatrix} x_{k+1}-x\end{vmatrix}}{\begin{vmatrix} x_{k}-x\end{vmatrix}}=c_r=0$$) 也称为超线性收敛 收敛阶如果比较小,则需要加速,这是数值计算的重要研究课题