1

我想解决以下系统,其中, , ,和,Ax=b的尺寸。在 Scilab 下解决后,我发现我的向量 x 的某些分量很复杂,我觉得很奇怪,因为我被告知向量必须是真实的。你怎么解释?Amn (m>n)b m1x n1x

这是我的代码:

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
4

2 回答 2

3

线条

A=10^(-A/10);

b=10^(b/10);

似乎正在将数据从分贝转换回标准单位。这与 Matlab 等类似,一次在整个向量或矩阵上完成。您是否确认此时 A 和 b 不是复数值?

x=(A'*A)\\(A'*b);

这是用于求解方程组多于变量的方程组的标准正规方程。它(除其他外)是最小二乘解 x。在 SCILAB 中,您只需

x=A\b;

这通常与解决方案不同

x=pinv(A)*b;

您的方程组可能在数值上接近奇异值(检查接近 0 的奇异值),或者可能没有解。

在 SCILAB 中,您可以通过以下方式获取有关您的方程组的更多信息

cond(A'*A)

或者

[x,kerA]=linsolve(A,-b);

有关更多详细信息,请参阅有关线性代数的 SCILAB 帮助部分。

于 2012-09-14T19:16:36.990 回答
1

I have no idea what these are about:

A=10^(-A/10);
b=10^(b/10);

I'd solve this either by premultiplying both sides by A transpose and using LU decomposition and back substitution to solve for x (linear least squares) or Singular Value Decomposition (SVD).

于 2012-09-13T12:29:22.683 回答