MATLAB:Cramer'中的残差;s规则

MATLAB:Cramer'中的残差;s规则,matlab,Matlab,我非常熟悉克拉默法则,我知道为什么它是“无用的”。然而,当使用下面代码的余数给出类似xxe-016的东西时,我感到好奇,其中xxxx表示数字。我用3到10个矩阵大小的浮动线性方程组尝试了下面的代码 为什么剩余误差最小 我是否缺少代码中disp(['norm of Cramer's rule remain='num2str(norm(A*x-b),4)])的正确语法来获得这样的最小错误 我提供的代码工作得很好,只是怀疑我用于规范的语法 function x=cramerr(A,b)

我非常熟悉克拉默法则,我知道为什么它是“无用的”。然而,当使用下面代码的余数给出类似xxe-016的东西时,我感到好奇,其中xxxx表示数字。我用3到10个矩阵大小的浮动线性方程组尝试了下面的代码

为什么剩余误差最小

我是否缺少代码中
disp(['norm of Cramer's rule remain='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];

谢谢

我不会说这本身就是个问题。当你使用克拉默法则时,你要做的是解线性方程组。在Matlab中,您只需使用
x=inv(A)*b
,它使用不同的算法来计算逆(LU分解)。在关于逆和行列式的Matlab页面中,它说:

如果A是平方且非奇异的,则方程AX=I和XA=I 同一个解,X。这个解叫做A的逆解 由A-1表示,由函数inv计算。行列式 在理论考虑和某些类型的 符号计算,但其缩放和舍入误差特性 使其远远不能满足数值计算的要求。然而 函数det计算平方矩阵的行列式

如果要检查两者的精度,可以执行以下操作:

format long
built_in=inv(A)*b
own_function=r(A,b)
并比较结果。我得到的是:

built_in=   [1.000000000000000;0.500000000000000]
own_function=    [1.000000000000054;0.500000000000000]
你可以看到小规范的来源。考虑到这一点,这种错误很可能是由于四舍五入错误造成的


至于
disp(['norm of Cramer's rule residence='num2str(norm(A*x-b),4)])的格式,我会跳过Cramer's中的撇号(
),因为这会导致错误。

你能修复缩进吗?你的代码很难读。在我这边,代码似乎很正常。不过,我会根据您的要求进行调整,因为方法不稳定并不意味着它总是给您错误的答案。这只是意味着它可能不会给你准确的答案,这足以避免它。您得到的小误差大致等于机器精度eps(1)
。这意味着对于您的情况,Cramer的规则在机器精度范围内是正确的。感谢@ptev提供您的所有建议。正如你所指出的,我已经看到了差距/错误。但是,我不完全理解你最后的发言。“至于disp的格式(['norm of Cramer's rule residence='num2str(norm(A*x-b),4)]),我会跳过Cramer's中的撇号('),因为这会导致错误。”哦,对不起,我的意思是你应该在
disp
的行中写
Cramers
,而不是
Cramer
。额外的
会打断字符串并导致Matlab给出错误。我的建议很简单:
disp(['Cramers规则残差的范数='num2str(范数(A*x-b),4)])