6

変数の形式で 2 つの行列があり、これAb私の matlab 関数への入力です (以下に掲載)。結果、行列から行列の逆演算(行列除算)で使用する有効数字を計算したいと思い ます。ただし、このアプローチを開始するために (matlab または数学的に) どこから始めればよいかわかりません。ヘルプ?Ab

より多くのコンテキスト、正方線形システムを使用して(Ax=b)、それが特異か非特異かを見て、解決策を見つけようとしています。

% x = answer
% y = 0 if no solution, 1 if nonsingular, 2 if many solutions
% z = p is number of sig figs
%
function [ x, y, z ] = squareLinSysSolv(A, b)


if det(A) == 0
    % Matrix is singular and therefor many solutions
    x = A\b;
    y = 0; % Used as place holder to compile
    z = 5; % Used as place holder to compile
elseif det(A) ~= 0
    % Matrix does not equal to zero (perhaps a number very close to it or
    % far from it) and therefor has a unique solution.
    x = A\b;
    y = 1; % Used as place holder to compile
    z = 5; % Used as place holder to compile
end
end

編集: 少し明確にするために、 z は、計算された有効数字の10進数に近似する(天井値または下限値)整数である必要があります。A\b

テスト ケース: 期待される内容のテスト/スペック シート。Aとは両方ともb行列であり、結果はそのようになるはずです。

A =
    1.5000    2.3000    7.9000
    6.1000    3.2000   13.0000
   13.0000   21.0000   76.0000

b =
     1
     3
     5
>> [x,y,z] = squareLinSysSolv(A,b)
% the result of x = A\b
x =

    0.8580
    3.0118
   -0.9132
% determinant is not equal to zero
y =

     1
% Amount of sig figs/precision in calculation
z =

     15
4

3 に答える 3

1

行列が特異であることにどれだけ近いかは、通常、「条件数」によって定量化されます。行列の条件数を推定する方法はいくつかあります。一般的な手法の1つは、最大と最小の大きさの固有値の比率を計算することです。

condMatlabには、行列の条件数(反転に関して)を与えると呼ばれる組み込み関数があります。1に近い値は「良い」です。これを、「有効数字」のような具体的なものに関連付ける方法がわかりません。

于 2012-10-25T20:57:04.473 に答える
1

私はここでダンと一緒です。質問がわかりません。また、z を計算する方法/場所もわかりません。まず第一に、答えの表示の桁数は、答えの計算における有効桁数とは無関係です。次に、det(A)==0 と det(A)~=0 の 2 つのケースがあります。どちらの場合も、z = 5 を設定しているように見えます (z = 15 を計算するために、表示されていない別の場所で何かを行っているに違いありません。どのように z を計算しましたか?)

また、有効桁数はデータのクラスの関数になることを認識してください。ダブル>シングル>整数...

そして...効率のために、私は A のサイズを知りません (また、その行列式の計算にどれだけのオーバーヘッドが伴うか)、それを2回計算する理由はありません:

if det(A)==0
    % case 1
else % NOT: elseif det(A)~=0
    % case 2
end

私も密集していると思います。:)

ブレット

于 2012-10-25T20:25:41.207 に答える
0

あなたが求めている質問が「浮動小数点数のmatlabの10進数表現を考えると、最初のz桁の後にすべての桁がゼロになるような最小の数値zは何ですか」という場合、次の関数は多かれ少なかれ仕事。

これを多数の数値でテストしましたが、ケースを見落としている可能性が非常に高いため、慎重にテストする必要があるという警告を追加します. これは、文字列を 1 回通過することでより効率的に実行できます。

function n = sig_decimal_digits(f)
    % get string representation, any decimal point, and any leading zeros
    str = num2str(f,20);

    % strip any exponent part
    loc = regexp(str, 'e');
    if ~isempty(loc)
        str = str(1:(loc-1));
    end

    % strip any decimal point
    str = strrep(str, '.', '');

    % strip any leading zeros (and minus sign!)
    loc = regexp(str, '[1-9]');
    if isempty(loc)
        %if *only* leading zeros, f is 0, so n = 1
        n = 1;
        return;
    else
        str = str(loc:end);
    end

    % count length of string, excluding trailing zeros
    loc = regexp(str, '0+$');
    if isempty(loc)
        n = length(str);
    else
        n = loc-1;
    end
end

ただし、次の 2 つのコメントを追加します。

  1. これは明らかに行列の乗算とは何の関係もないので、なぜそれを取り入れたのかわかりません。
  2. これは、計算したい奇妙な量です。ほとんどの浮動小数点数には短い 10 進展開がないため、行列に非常に特殊な数が含まれていない限り、答えはほぼ常に 17 になります。たとえば、質問で指定した A と b の場合、関数によると、x の 3 つの数字はすべて有効桁数が 17 桁です。
于 2012-10-25T21:15:57.407 に答える