2

MATLABで次のように入力します

A = [0.1195952380, 0.2552619050, 0.3235000000,...
     0.1289285710, 0.6675476190, -0.0770000000,...
     0.1973809520];

and

b0 = 1.7250238100;

バックスラッシュ演算子をとして使用するA \ b0と、結果は次のようになります。

[0         0         0         0    2.5841         0         0]

そして私が使用する場合

pinv(A)*b0

答えは次のようになります。

0.2985    0.6370    0.8073    0.3217    1.6659   -0.1922    0.4926

しかし、バックスラッシュ演算子について説明している多くのドキュメントでは、両方の演算で同じ答えが得られるはずだと述べています。この場合、なぜそうではないのですか?

誰かがこの点で私を助けることができますか?

ありがとう、

バブ。

4

4 に答える 4

2

他の人が言っているように、このシステムは劣決定です(デニスが言ったように、終わりではありません)。いくつかのフォローアップの質問があったので、私はより深く入りましょう。

Aに1つの行がある場合、7つの未知数に本質的に1つの方程式があります。基本的に、これらの未知数の6つをゼロに設定してから、7番目を解くことができます。これはバックスラッシュが行うことです。結果がノイズからの寄与が最小になるように未知数を選択します。したがって、ここでは、A行列の絶対係数が最大の未知数を選択します。これが、5番目の未知数が結果でゼロ以外であった理由です。

実際、ソリューションは6次元のセットに存在します。Aのヌル行空間からその解にベクトルの線形結合を自由に追加し、線形システムに基づいて別の等しく(数学的に)有効な解を得ることができます。

A = [0.1195952380, 0.2552619050, 0.3235000000,...
     0.1289285710, 0.6675476190, -0.0770000000,...
     0.1973809520];

null(A)
ans =
   -0.3070   -0.3891   -0.1551   -0.8029    0.0926   -0.2374
    0.9176   -0.1044   -0.0416   -0.2155    0.0249   -0.0637
   -0.1044    0.8676   -0.0528   -0.2731    0.0315   -0.0808
   -0.0416   -0.0528    0.9790   -0.1089    0.0126   -0.0322
   -0.2155   -0.2731   -0.1089    0.4364    0.0650   -0.1666
    0.0249    0.0315    0.0126    0.0650    0.9925    0.0192
   -0.0637   -0.0808   -0.0322   -0.1666    0.0192    0.9507

null(A)の列は、null部分空間のこれらの基底ベクトルです。結局のところ、ゼロに設定する要素をいくらか任意に選択するため、バックスラッシュソリューションが好ましくない場合があります。別の解決策は、pinv(A)*b0を使用することです。

pinv(A)
ans =
    0.1730
    0.3693
    0.4680
    0.1865
    0.9657
   -0.1114
    0.2855

pinv(A)*b0
ans =
    0.2985
    0.6370
    0.8073
    0.3217
    1.6659
   -0.1922
    0.4926

pinv(A)は、Aのムーアペンローズ疑似逆行列です。特異値分解を使用してその結果を生成するため、一般にバックスラッシュよりも遅くなりますが、ここでは違いはわずかです。時々興味深いpinvソリューションの特徴は、そのようなすべての可能なソリューションの中で最小のノルムを持っていることです。

b0 = 1.7250238100;
norm(A\b0)
ans =
    2.5841

norm(pinv(A)*b0)
ans =
    2.0748

あるソリューションは別のソリューションよりも優れていますか?あまり。時々私たちは違いを気にします、そしてあなたはそれらのうちの1つを他のものより選ぶことを気にかけるかもしれません。ただし、方程式が1つしかない場合は、考えられる解決策のいずれかが他の解決策と同じくらい優れている可能性があることを受け入れる必要があります。

もちろん、私たちが選択する可能性のある悪い解決策があります。たとえば、この次の解決策は、理論的には、ばかげたものであれば、同様に有効な選択です。

x2 = x1 + null(A)*10*randn(6,1)
x2 =
         -4.09413481014061
          13.5483342562954
          13.4850200598594
          6.44121071558247
         -13.4923071847226
           7.3358845464619
           15.883243834012

Aの零空間ベクトルのランダムな線形結合を追加することを選択しました。同じ解A*x2が得られるようです。

A*x2
ans =
                1.72502381

しかし、b0を引くと、x2の係数が大きいことが問題であることがわかります。これらの係数は、これらの最下位ビットのノイズを誇張しており、微妙に悪い解を生成します。

A*x2 - b0
ans =
      6.66133814775094e-16

それを他のソリューションの残差と比較すると、間違いなく悪化していることがわかります。

A*x0 - b0
ans =
     0

A*x1 - b0
ans =
      2.22044604925031e-16

もちろん、epsは

eps
ans =
      2.22044604925031e-16

これは、この問題に対する私たちの希望の限界についてです。

もちろん、未知数よりも多くの方程式(ここではAの列よりも多くの行)があり、Aがフルランクである場合、2つの解は数値のゴミ箱内で同じである必要があります。これはあなたが読んだものですが、それは過剰決定問題にのみ当てはまります。あなたの問題は過剰決定ではなく、劣決定です。

于 2013-03-14T14:13:44.333 に答える
2

あなたのシステムは非常に劣決定です。

A\b0方程式の1つの解を見つけます。

pinv(A)*b0単に別の解決策を見つけます。

どちらも正しいですが、使用されているアルゴリズムが異なるため、明らかに異なる解決策が見つかります。

あなたはそれらが同じであることを確認することができます

A*(A\b0) - A*(pinv(A)*b0)

事実上ゼロです

于 2013-03-14T11:00:23.473 に答える
2

バックスラッシュに関しては、いつも混乱します。私の救済策は次のとおりです。解決しようとしている連立方程式を(少なくとも最小二乗の意味で)明示的に記述し、それをドキュメントに合わせてみてください。

あなたの例では、解決しようとしているシステムは

A * x = b0

このシステムでは、7 つの未知の方程式と 1 つの方程式しかありません (b0 はスカラーです)。したがって、あなたのシステムはDennisによって指摘されているように過小決定されており、いくつかの異なる (まだ同等の) ソリューションを期待するのは合理的です。

于 2013-03-14T11:02:49.590 に答える
1

あなたのシステムは過小決定されています。つまり、無限に多くの解があります。

行よりも列Aが多いとします。m

バックスラッシュ演算子はm、解のいくつかの未定コンポーネントをゼロに設定することにより、これらのシステムを扱います。このソース

反対に、異なるゼロ パターンを持つ可能性が最も高いpinvムーア-ペンローズA^+の逆数を返します。A

pinvそのため、劣決定システム内と劣決定システムに対して違いがあり\ます。過決定システムの場合、これらの演算子は確かに同じ解を与えます。

于 2013-03-14T11:14:10.867 に答える