1

Ax=b次元がA、、、、、mn (m>n)ある次b mのシステム1を解きたい。Scilabで解決した後、ベクトルxの一部のコンポーネントが複雑であることがわかりました。ベクトルは実数でなければならないと言われたので、奇妙なことに気づきました。どのようにそれを説明できますか?x 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

私はこれらが何であるかわかりません:

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

これを解決するには、両側にA転置を事前に乗算し、LU分解と逆置換を使用してx(線形最小二乗)または特異値分解(SVD)を解きます。

于 2012-09-13T12:29:22.683 に答える