我对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];
由于
答案 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 {
...
}
),因为这会导致错误。