MATLAB:Cramer'中的残差;s规则
我非常熟悉克拉默法则,我知道为什么它是“无用的”。然而,当使用下面代码的余数给出类似xxe-016的东西时,我感到好奇,其中xxxx表示数字。我用3到10个矩阵大小的浮动线性方程组尝试了下面的代码 为什么剩余误差最小 我是否缺少代码中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)
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)])