1.1 误差的来源例1.1.1 用差商ha f h a f a f )()()(-+≈'求x x f ln )(=在3=x 处导数的近似值.取1.0=h ,1000.0=h ,h =0.000 000 000 000 001和h =0.000 000 000 000 000 1分别用MATLAB 软件计算,取十五位数字计算.解 在MATLAB 工作窗口输入下面程序>>a=3;h=0.1;y=log(a+h)-log(a);yx=y/h运行后得yx = 0.32789822822991 将此程序中h 改为0.000 1,运行后得yx = 0.33332777790385后者比前者好.再取h = 0.000 000 000 000 001,运行后得yx = 0.44408920985006不如前者好.取h = 0.000 000 000 000 000 1,运行后得yx = 0算出的结果反而毫无价值.例1.1.2 分别求方程组b AX =在下列情况时的解,其中A ⎪⎪⎭⎫⎝⎛=011111.. (1)⎪⎪⎭⎫ ⎝⎛=22b ;(2)⎪⎪⎭⎫⎝⎛=0122.b . 解 (1) 首先将方程组b AX =化为同解方程b A X 1-=,然后在MATLAB 工作窗口输入程序>> b=[2,2]';A=[1,1;1,1.01]; X=A\b运行后输出当⎪⎪⎭⎫ ⎝⎛=22b 时,b AX =的解为⎪⎪⎭⎫⎝⎛=02X ;(2)同理可得,当⎪⎪⎭⎫ ⎝⎛=0122.b 时,b AX =的解为⎪⎪⎭⎫⎝⎛=11X .例1.1.3 计算e 的近似值. 解 泰勒级数e +++++++=!!4!3!21432 n x x x x x n x)(∞<<-∞x , 取1=x ,得e +++++++=!1!41!31!2111 n . (1.2)这是一个无限过程,计算机无法求到精确值.只能在(1.2)取有限项时计算,再估计误差.如果取有限项!!!!)( n s n 1413121111++++++=作为e 的值必然会有误差,根据泰勒余项定理可知其截断误差为e !)1()1( +=-n e s n θ)10(<<θ.如果取(1.2)的前九项,输入程序>> n=8; s=1;S =1; fork=1:n s=s*k; S=S+1/s, end s, S,R=3/(s*(n+1)) 或>>S1=1+1+1/2+1/(1*2*3)+1/(1*2*3*4)+1/(1*2*3*4*5)+1/(1*2*3*4*5*6)+1/(1*2*3*4*5*6*7)+1/(1*2*3*4*5*6*7*8),R1=3/(1*2*3*4*5*6*7*8*9)运行后结果S = R =2.71827876984127 8.267195767195768e-006 因为截断误差为e ),10(101968.267!93!)18()1(6-8<<⨯≈<+=-θθ e s 所以e 的近似值e ≈≈++++++++=!81!71!61!51!41!31!2111)1(8 s 2.718 28.1.2 误差和有效数字例1.2.1 取282.718作为e 的四舍五入近似值时,求其绝对误差和相对误差. 解 在MATLAB 工作窗口输入程序>>juewu=exp(1)-2.71828运行后输出结果为juewu = 1.828 459 045 505 326e-006例1.2.2 计算⎰π20sin x xd x 的近似值,并确定其绝对误差和相对误差.解 因为被积函数xxsin 的原函数不是初等函数,故用泰勒级数求之.++-+-=!!!!sin 9 75 386x x x x x x 421 )(∞<<-∞x , (1.5) 这是一个无限过程,计算机无法求到精确值.可用(1.5)的前四项!!!75 36x x x -+-421代替被积函数xxsin ,得 ⎰π=20sin x x y d ⎰π≈20(x !!!14275 36x x x -+-)d x =!7)2(!5)2(!3)2(275375 3⋅π-⋅π+⋅π-π=y ˆ. 根据泰勒余项定理和交错级数收敛性的判别定理,得到绝对误差!99)2(ˆ9⋅<-=πyy R = WU , 在MA TLAB 命令窗口输入计算程序如下:syms xf=1-x^2/(1*2*3)+x^4/(1*2*3*4*5)-x^6/(1*2*3*4*5*6*7) y=int(f,x,0,pi/2),y1=double(y)y11=pi/2-(pi/2)^3/(3*3*2)+(pi/2)^5/(5*5*4*3*2)-(pi/2)^7/(7*7*6*5*4*3*2)inf=int(sin(x)/x,x,0,pi/2) ,infd=double(inf) WU =(pi/2)^9/(9*9*8*7*6*5*4*3*2), R =infd-y11因为运行后输出结果为: =y 1.370 762 168 154 49,yˆ=1.370 744 664 189 38,=R 1.750 396 510 491 47e-005, WU = 1.782 679 830 970 664e-005410-<.所以,yˆ的绝对误差为=ε410-,故⎰π=20sin x xy d 7 1.370≈x .yˆ的相对误差为 =r ε71.37010ˆ4-=y ε<0.007 3%.1.3 误差估计的基本方法例1.3.4 设计三种算法求方程01522=-+x x 在)3,2(的一个正根*x 的近似值,并研究每种算法的误差传播情况.解 为解已知方程,我们可以设计如下三种算法,然后将计算结果与此方程的精确解5.2*=x 比较,观察误差的传播.算法1 将已知方程化为同解方程=x 2215x -.取初值20=x ,按迭代公式21215k k x x -=+依次计算 ,,,,21n x x x ,结果列入表1–3中.算法2 将已知方程化为同解方程1215+=x x .取初值20=x ,按迭代公式 12151+=+k k x x依次计算 ,,,,21n x x x ,结果列入表1–3中.算法3 将已知方程化为同解方程141522+-+-=x x x x x .取初值20=x ,按迭代公式为1415221+-+-=+k k kk k x x x x x 依次计算 ,,,,21n x x x ,结果列入表1–3中.我们为这三种算法的计算编写两套MATLAB 程序如下: (1)MATLAB 主程序function [k,juecha,xiangcha,xk]= liti112(x0,x1,limax) % 输入的量--x0是初值, limax 是迭代次数和精确值x; % 输出的量--每次迭代次数k 和迭代值xk,% --每次迭代的绝对误差juecha 和相对误差xiangcha , x(1)=x0;for i=1:limaxx(i+1)=fl(x(i));%程序中调用的fl.m juecha = abs(x(i)-x1);xiangcha = juecha /( abs(x(i))+eps);xk=x(i);k=i-1;[(i-1),juecha,xiangcha,xk] end(2)MATLAB 调用函数程序及其计算结果 ①算法2的MATLAB 调用函数程序function y1=fl(x)y1=15/(2*x+1);② 将MATLAB 主程序和调用函数程序分别命名liti112.m 和fl.m ,分别保存为M 文件,然后在MATLAB 工作窗口输入命令>> [k,juecha,xiangcha,xk]= liti112(2,2.5,100) ③运行后输出计算结果列入表1–3和表 1-4中.④将算法2的MATLAB 调用函数程序的函数分别用y1=15-2*x^2和y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法1和算法3的调用函数程序,将其保存,运行后将三种算法的前8个迭代值821,,,x x x 列在一起(见表 1-3),进行比较.将三种算法的821,,,x x x 对应的绝对误差和相对误差的值列在一起(见表 1-4),进行比较.1.4 数值计算中应注意的问题例1.4.1 求数)181(71915-+⨯=-x 的近似值. 解 (1)直接用MATLAB 命令>> x=(7^15)*(sqrt(1+8^(-19))-1)运行后输出结果x = 0问题出现在两个相近的数1981-+与1相减时,计算机运行程序>>sqrt(1+8^(-19))-1运行后输出结果ans = 0由于计算机硬件只支持有限位机器数的运算,因此在计算中可能引入和传播舍入误差.因为有效数字的严重损失,导致输出18119-+-的结果为0,计算机不能再与数157继续进行真实的计算,所以,最后输出的结果与x 的精确值不符.(2)如果化为18187)181(71919151915++⨯=-+⨯=---x ,再用MATLAB 命令>> x=(7^15)*( (8^(-19))/(sqrt(1+8^(-19))+1))运行后输出结果x = 1.6471e-005 这是因为18119-+-化为18181919++--后,计算机运行程序>> x= (8^(-19))/(sqrt(1+8^(-19))+1)运行后的结果为x =3.4694e-018 由于有效数字的损失甚少,所以运算的结果-18103.4694⨯再与157继续计算,最后输出的结果与x 的精确值相差无几.例1.4.2 求数)13030ln(2--=y 的近似值. 解 (1)直接用MATLAB 程序>> x=30;x1= sqrt(x^2-1)运行后输出结果x1 = 29.9833 输入MATLAB 程序>> x=30; x1=29.9833;y=log(x-x1)运行后输出结果y = -4.0923(2)因为)13030ln(2--中的30=x 很大,如果采用倒数变换法111221-+=--=x x x x z ,即130301ln)13030ln(22-+=--)190030ln(-+-=.输入MATLAB 程序>> x=30;y=-log(x+sqrt(x^2-1))运行后输出结果y = -4.0941(3)输入MA TLAB 程序>> x=30; y=log(x-sqrt(x^2-1))运行后输出结果y = -4.0941 可见,(2)计算的近似值比(1)的误差小.参加计算的数,有时数量级相差很大.如果不注意采取相应的措施,在它们的加减法运算中,绝对值很小的那个数经常会被绝对值较大的那个数“吃掉”,不能发挥其作用,造成计算结果失真.例1.4.4 请在16位十进制数值精度计算机上利用软件MATLAB 计算下面的两个数0.30.1111111111111111*++=x 和0.30.11111111111111111*++=y将计算结果与准确值比较,解释计算结果.解 在MATLAB 工作窗口输入下面程序>> x=111111*********+0.1+0.3, y=1111111111111111+0.1+0.3运行后输出结果x = 1.111111*********e+014,y =1.111111*********e+015 从输出的结果可以看出,x *x =,而y *y ≠.为什么*y 仅仅比*x 多一位1,而y *y ≠呢?这是因为计算机进行运算时,首先要把参加运算的数写成绝对值小于1而“阶码”相同的数,这一过程称为数的“对阶”.在16位十进制数值精度计算机上利用软件MATLAB 计算这两个数,把运算的数*x 写成浮点规格化形式为,151515*103000**********.0001010000000000000.000100111111111111111.0⨯+⨯+⨯=x在16位十进制数值精度计算机上,三项的数都表示为小数点后面16位数字的数与1510之积,所以,计算机没有对数进行截断,而是按原来的三个数进行计算.因此,计算的结果x *x =.而161616*10030000000000000.00010010000000000000.000101111111111111111.0⨯+⨯+⨯=y三项的数都表示写成绝对值小于1而“阶码”都为1610的数以后,第一项的纯小数的小数点后面有16位数字.但是,后两项数的纯小数的小数点后面有17位数字,超过了16位十进制数值精度计算机的存储量,计算机对后两项的数都进行截断最后一位,即后两项的数都是16位机上的零,再进行计算,所以计算结果与实际不符.。