【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

1、误差的来源

  •      模型误差:数学模型与实际问题之间的误差
  •      观测误差:测量数据与实际数据的误差
  •      方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如
  •      舍入误差:对数据进行四舍五入后产生的误差

2、减少误差的几种方法

         现在,我们一般用计算机解决计算问题,使用最多的是Matlab软件。对实际问题进行数学建模时,可能存在模型误差,对数学模型进行数值求解时,我们使用的方法可能产生方法误差,我们输入计算机的数据一般是有测量误差的,计算机在运算过程的每一步又会产生舍入误差(十进制转化为二进制时可能产生舍入误差)。由此看来,解决一个问题,基本上会有以上四种四种误差。记得高中物理老师说过,错误是可以避免的,误差是不可避免的,我们只可以减少误差。下面我们就来介绍减少误差的几种方法:
  • 避免两个相近的数相减
                    eg:当x=10003时,计算 的近似值。
                    如果使用6位十进制浮点运算,运算时取6位有效数字,结果如下:
                 
            结果只有一位有效数字,与之前相比,损失了5位有效数字。
                    如果使用下面的方法:
                 
            则结果有6位有效数字,与精确值0.00499912523117984……较为接近。
  •  防止重要的小数被大数吃掉
            eg: 已知 ,求

            如果按照 的顺序来求的话,由于x远大于y,在计算机中可能导致x+y=x的情况,因此我们可以按照 的顺序计算得到正确的结果。
  • 避免除数的绝对值远小于被除数的绝对值
            eg:用消去法解线性方程组
            
                
           这个方程组的正确解为:
             
          当我们用(1)/0.00003-(2)时,可以得到下面的化简和计算结果:
             
            显然上述结果严重失真,产生了很大的误差。这就是由于除数的绝对值远小于被除数的绝对值造成的。
           为了避免上述情况,我们可以用第二个方程消去第一个方程中的x1,即(2)*0.00003-(1),得到如下表达式和结果:
           
            将结果与正确解相比发现,这是一组相当好的近似解。                    
  •  注意算法的稳定性
            所谓算法的稳定性是指,一个算法如果输入数据有误差,而在计算过程中误差不增长,那么称此算法是数值稳定的。
   
  
        上面的部分基本上都来源于《数值分析》一书,讲的挺好的,这些减小误差的方法,我们平时需要多注意,在用c进行编程实现时需要注意,而用Matlab实现时,上面的问题都不是问题了,不过我们要学习的是这种方法和技巧。 下面讲讲,在实现上述方法的Matlab的知识:1、精度控制;2、解线性方程组。

一、精度控制
     format  digits  vpa函数的使用
     format只用来控制显示精度的,并不控制计算精度,digits用来控制计算精度,vpa也是控制计算精度。
     digits必须与vpa配合使用,单独不起作用。
     vpa可单独控制计算精度
     
     具体操作如下图:
            1、format的操作
                

            2、digits的操作
               
            3、vpa的操作
               

     二、 解非齐次线性方程组
           

             可以通过以下四种方法求解该方程组:
              用矩阵表示上述的线性方程组如下:

  • 求逆矩阵法
            

  • 矩阵左除法
                   
  • 初等行变换
                     
  • 卡莱姆法则
                       
具体的程序实现如下:
clear all
clc
 
A=[ 6 2 3 4 5
    2 -3 7 10 13
    3 5 11 -16 21
    2 -7 7 7 2
    7 3 -5 3 10]
b=[80 59 90 22 85]'
 
x1=inv(A)*b%逆矩阵法
x2=A\b%矩阵左除法
x3=rref([A b])%初等行变换
 
%克拉姆法则
for i=1:length(A)
    B=A;
    B(:,i)=b;
    x(i)=det(B)/det(A);
end
x'

运行结果如下图:

注意事项:当系数矩阵A不是方阵,或A的行列式为0时,逆矩阵法和克拉姆法则无法使用,而初等行变换能适用于各种线性方程组的求解。

MATLAB技术论坛原创,原帖参见http://www.matlabsky.com/viewthread.php?tid=3093 该教程详细介绍了MATLAB的舍入误差原理和计算,并给出实例验证。 由于涉及很多数学公式和图形,帖中不方便展示,下面给出了大概的内容提要,具体参见本帖pdf附件http://www.matlabsky.com/viewthread.php?tid=3093! 舍入误差是计算机进行实数计算是所产生的。之所以产生舍入误差是因为机器中进行的算术运算所涉及的数是有限位的,从而导致计算只能用实际数值的近视表示式来完成。在典型的计算机中,仅实数系统的一个相对小的子集用来表示所有的实数。这个子集包含了正负有理数,且存储了小数和指数部分。 IEEE754-1985二进制浮点运算标准 MATLAB中所有数值都是使用64bit表示的。根据754-1985规定,第一位是符号指示位(S),接下来的11位是指数部分(C),最后称为尾数的52位为小数部分(F),指数的基是2。 X64表示的区间范围 x64=0 10000000011 1011100100010000000000000000000000000000000000000000 y64=0 10000000011 1011100100001111111111111111111111111111111111111111 z64=0 10000000011 1011100100010000000000000000000000000000000000000001 这意味着,二进制机器数x64不仅仅代表十进制的x,还表示x临域内的所有实数,也就是说十进制区间(注意是左闭右开的区间) [(y+x)/2, (x+z)/2)= [15518507114430463/562949953421312, 15518507114430465/562949953421312) 内所有数据都是使用机器数x64表示的。这样机器的截断误差就出现了! 如何确定XMIN和XMAX 从IEEE754-1985的规定,我们容易知道64位机器数能够表示的最小正数,此时第64位为1其它为0,故 xmin=2^(-1023)*(1+0.5^52)≈10^(-308) 在计算小于xmin的数据的时候,MATLAB直接当0处理 同理最大的正数则第1位为0其它为1,故 xmax=2^1024*(2-0.5^52)≈10^308 在计算大于xmax数据时,MATLAB视为Inf X的精度范围求解 二进制数x64的前后一个数,相当于在x64尾数的最后一位加1或减1,故x64与最近的数之间的距离为0.5^52 ,另外指数位会将尾数放大了2^n倍,故最终x的精度为0.5*2^(n-52)(注意必须乘以0.5,原因如上)。故在±0.5*2^(n-52)范围内的数据,MATLAB都用x64表示,也就是认为都是x
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值