资源描述:
《线性代数机算的速度和精度.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、线性代数机算的速度和精度机算中精度和速度的重要性在用笔算时,通常都用整数矩阵来演示和做题,几乎不涉及误差,也就没有精度问题。至于矩阵计算速度的低下,即使在二、三阶的低价矩阵中,就已暴露无遗,但那从来不是纯粹进行理论探讨的数学家所关心的内容,甚至很怕读者触及这个敏感问题,这是用笔算解矩阵方程的根本弱点。承认这个弱点必然导致计算机的引入和课程的改造。线性代数进入应用领域,必定要使用计算机,速度和精度两个现实问题就不可避免地摆在我们面前。在这里,我们将注重精度问题,并只着重于MATLAB命令中包含的、或会对计算精度作出提示的问题做一介绍。1.双
2、精度浮点数的精度按照IEEE标准,表达一个数需要8个字节,也就是64个二进制位。双精度浮点数η用下式表示其中M是一个小于一大于1/2的二进制分数,称为尾数,占用52个二进制位表示;而指数E是一个带符号的二进制整数。占11个二进制位,总共可表示2048个整数,即可以表示从-1023到+1024的数集,它决定了数的动态范围。数的正负号反映在S上,它只占一位。总计1+52+11=64位。MATLAB中数的精度浮点数的量化步长可以代表它的相对精度。它是由M的位数决定的。52位二进制数的量化步长是2-52=2.2204×10–16。该数的动态范围取
3、决于指数部分。因为2–1023≈10–307及21024≈10308。所以MATLAB中数的动态范围为2.2251×10-308~1.7977×10+308。在MATLAB命令窗中,键入eps,realmin,realmax,系统就会给出上面的几个数。MATLAB中运算的精度在做浮点加法、乘法、除法运算时,相对误差可以基本不变。由于多次运算造成误差的积累,MATLAB中的大部分运算结果的误差比eps要大一些。因此正常情况下(即系统不给出警告时),计算结果至少可以有12位十进制有效数字的可信度。但是减法有时会有问题,如果遇到两个很接近的大数
4、相减,把有效数位中的前N位都消掉了,那么数字的精度就减少了N位。比如12345-12344=1,这两个数具有5位有效数位,但它们的差只有一位有效。2.高斯消元法中的精度问题——主元交换法(partialPivoting)设方程组如下,写成矩阵形式:用消元法化简增广矩阵C=[A,B]由此得知x=10000/10001=0.9999;y=10000/10001=0.9999,这是手算的精确解。计算机舍入误差造成消元误差假如我们采用的是一个很粗糙的计算机,只能保持三位有效数字,那么它遇到10001时,只会四舍五入解读为10000。则上面的消元过
5、程将成为:这个结果将解读为x=0,y=1,x的误差达到了100%,完全不能采用。如果计算机的精度是N位,其结果虽然不至于完全无用,但也将使有效数位减少4位。主元太小是造成误差的根源从计算过程看,其实问题就出在回代过程中出现了相接近的两个大数相减。两个大数出现于把微小的主元0.0001化为1的消元过程中,主元太小是造成误差的根源。如果在做消元法的时候,检查主元行中各个元素,把最大的主元通过列交换放到主元的位置,那样这个问题就可以解决,例如上题中先交换第一行中的两列,可得:在rref函数中的换主元措施由此得知x=10000/10001=0.9
6、999;y=0.9999,这和精确解完全一致,说明只要进行主元最大的列交换。计算精度是可以保证的。在rref命令中,语句[p,k]=max(abs(A(i:m,j)));就是为了在第i行中,找到绝对值最大的元素A(i,k),以后再进行列交换。在MATLAB命令窗中键入:A=[0.0001,1;-1,1],B=[1;0],X=AB,得到X=[0.9999;0.9999]键入typerref得出的主要程序代码while(i<=m)&(j<=n)%Findvalueandindexoflargestelementintheremaindero
7、fcolumnj.[p,k]=max(abs(A(i:m,j)));k=k+i-1;if(p<=tol)%Thecolumnisnegligible,zeroitout.A(i:m,j)=zeros(m-i+1,1);j=j+1;else%Remembercolumnindexjb=[jbj];%Swapi-thandk-throws.A([ik],j:n)=A([ki],j:n);%Dividethepivotrowbythepivotelement.A(i,j:n)=A(i,j:n)/A(i,j);%Subtractmultiples
8、ofthepivotrowfromalltheotherrows.fork=[1:i-1i+1:m]A(k,j:n)=A(k,j:n)-A(k,j)*A(i,j:n);endi=i+1;j=j