MATLAB:Cramer规则

时间:2016-09-20 04:33:03

标签: matlab

我对Cramer的规则非常熟悉,我知道为什么它“没用”。但是,当我使用下面的代码得到类似于xxxxE-016的内容时,我很好奇,其中xxxx代表数字。我已尝试使用3到10个矩阵大小的线性方程浮动系统的代码。

为什么剩余误差最小?

我是否在代码中错过了disp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)])的正确语法以获得此类最小错误?

我提供的代码工作正常,只是怀疑我用于规范的语法

      function x=cramerr(A,b)
        A=input('matrix A =');
        b=input('vector b =');
        n=size(A,1);
        m=size(A,2);
        tic;
      if n~=m
           Error ('The matrix is not square!');
           x=[];
      else
          detA=det(A);
     if det(A)~=0
          x=zeros(n,1);
     for j=1:n
         if j~=1 & j~=n
             Ab=[A(:,1:j-1) b A(:,j+1:n)];
        elseif j==1
             Ab=[b A(:,2:n)];
        elseif j==n
             Ab=[A(:,1:n-1) b];
        end
            x(j)=det(Ab)/detA;
         end %for j=1:n
    else 
          Error('The matrix A has a zero determinant');
          x=[];
   end % if det(A)~=0
       toc;
        disp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)]);
  end % if n~=m

请你以此为例

    A =[0.373,0.296;0.326,0.260]; 
    b =[0.521;0.456];

由于

1 个答案:

答案 0 :(得分:1)

我不会说这本身就是一个问题。使用Cramer规则时所做的就是求解线性方程组。在Matlab中,您可以使用x=inv(A)*b来执行此操作,format long built_in=inv(A)*b own_function=r(A,b) 使用不同的算法来计算逆(LU分解)。在Inverses和Determinants的Matlab页面中,它说:

  

如果A是正方形且非奇异的,则方程AX = I和XA = I   同样的解决方案,X。这个解决方案被称为A的倒数,是   由A-1表示,并由函数inv计算。决定因素   矩阵的理论考虑和某些类型的矩阵是有用的   符号计算,但它的缩放和舍入误差属性   使它不太令人满意的数值计算。尽管如此,   函数det计算方阵的行列式。

如果你想检查两者的精确度,你可以这样做:

built_in=   [1.000000000000000;0.500000000000000]
own_function=    [1.000000000000054;0.500000000000000]

并比较结果。我得到的是:

disp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)])

你可以看到小规范的来源。考虑到这一点,这种错误很可能是由于四舍五入错误。

关于'的格式化,我会跳过Cramer中的撇号(export interface PatternDetails { ... } ),因为这会导致错误。