我想解决以下系统Ax=b
,其中A
的尺寸为m
,n
(m>n)
,b
m
,1
和x
n
,[ C0]。在Scilab下求解之后,我发现向量x的某些分量很复杂,我发现这很奇怪,因为有人告诉我向量1
必须是实数。您如何解释?
这是我的代码:
x
行
function [x] = sys_()
[fid1,err1] = mopen("D:\Documents\sys_surdet\Donnees_test_A.txt","r");
[fid2,err2] = mopen("D:\Documents\sys_surdet\Donnees_test_B.txt","r");
A = mfscanf(-1,fid1,'%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f');
b = mfscanf(-1,fid2,'%f');
A=10^(-A/10);
b=10^(b/10);
col = size(A);
j = zeros(col(1,1),1);
x = zeros(col(1,2),1);
if rank(A)==col(1,2) then
x=(A'*A)\(A'*b);
else
x=-1;
end
mclose(fid1);
mclose(fid2);
endfunction
似乎是将数据从分贝转换回标准单位。与Matlab等类似,这是一次在整个矢量或矩阵上完成的。您是否确定此时A和b不是复数值?
A=10^(-A/10);
b=10^(b/10);
这是用于求解方程组多于变量的方程组的标准正则方程。 (除其他事项外)它是最小二乘解x。在SCILAB中,只需使用
即可获得相同的结果x=(A'*A)\\(A'*b);
这通常与解决方案有所不同
x=A\b;
您的方程组可能在数值上接近奇异点(检查奇异值接近0),或者可能没有解。
在SCILAB中,您可以通过以下方式获取有关方程组的更多信息:>
x=pinv(A)*b;
或
cond(A'*A)
更多信息,请参见SCILAB关于线性代数的帮助部分。
我不知道这些是关于什么的: