2

逆行列の計算を必要とする最適化アルゴリズムを実行しています。このアルゴリズムの目的は、行列 A から負の値を取り除き、新しい行列 B を取得することです。基本的に、同じサイズの既知の正方行列 B と C から始めます。

まず、次の行列 A を計算します。

A = B^-1 * C

またはMatlabで:

A = B\C;

私がこれを使用するのは、MatlabB\Cが よりも正確であると私に言ったからですinv(B)*C

次に、A の負の値が 2 で除算され、行の長さが 1 になるように A が正規化されます。この新しい A を使用して、新しい B を次のように計算します。

(1/N) * A * C' = B^-1

ここで、N は単なる倍率 (A の列数) です。この新しい B は最初のステップで再び使用され、これらの反復は A のネガがなくなるまで続きます。

私の問題は、2 番目の方程式から B を計算し、それを正規化する必要があることです。

invB = (1/N)*A*C';
B = inv(invB);

を使用して B を計算してきましたがinv(B^-1)、数回繰り返した後、B^-1「特異点に近いか、スケーリングが悪い」というメッセージが表示されるようになりました。

このアルゴリズムは、実際には小さなマトリックス (約 70x70) で機能しますが、約 500x500 になると、これらのメッセージが表示され始めます。

を計算するより良い方法はありますinv(B^-1)か?

4

2 に答える 2

3

特異行列については間違いなく警告を発する必要があります。数値線形代数の結果は、条件数の高い行列に向かって移動するにつれて崩壊する傾向があります。根底にある考えは

A*b_1 = c

そして、私たちは実際に問題を解決しています(コンピューターを使用するときに概数を使用しているため)

(A + matrix error)*b_2 = (c + vector error)

行列とベクトルの誤差の関数として、b_1とb_2はどれくらい近いですか?Aの条件数が小さい場合、b_1とb_2は近いです。Aの条件数が大きい場合、b_1とb_2は閉じていません。

アルゴリズムで実行できる有益な分析があります。各反復で、Bを見つけたら、Matlabを使用してその条件数を見つけます。これは

cond(B)

数が急速に増加するのがわかるでしょう。これは、アルゴリズムを反復するたびに、Bの結果をますます信頼する必要があることを示しています。

このような問題は、数値数学で常に発生します。数値アルゴリズムを頻繁に使用する場合は、フィールドでの条件数の役割と上記の前処理手法を理解するために時間をかける必要があります。このための私の好みのテキストは、ロイド・トレフェセンによる「数値線形代数」ですが、数値代数に関するテキストは、これらの問題のいくつかに対処する必要があります。

幸運を祈ります、アンドリュー

于 2012-03-09T20:37:23.857 に答える
1

主な問題は、行列の条件数が高いことです (つまり、あなたのケースでは rcond(B) が非常に小さい)。これは、アルゴリズムの反復構造によるものだと思います。各反復を行うと、小さな特異値がどんどん小さくなっていき、条件数が指数関数的に増加します。この種の動作を回避するには、前提条件を確認する必要があります。

于 2012-03-09T18:05:34.660 に答える