2

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

A = B^-1 * C

か、MATLABで

A = B\C; 

Iはに等しい行列Aを計算することによって開始します

Matlabが私にB\Cがより正確であると言ったので私はこれを使用します。

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

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

ここで、Nはスケーリング係数(Aの列数)です。この新しいBは、最初のステップで再び使用され、Aのネガがなくなるまでこれらの繰り返しが続きます。

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

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

私はinv(B^-1)を使用してBを計算してきたが、数回の反復の後、私はB^-1があるというメッセージを取得開始「単数または悪いスケールに近いです。」

このアルゴリズムは実際にはより小さい行列(約70x70)で動作しますが、約500x500になるとこれらのメッセージが表示され始めます。

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

+0

がそれに役立つのか? – Darhuuk

+0

'B = eye(N)\ invB'を使うと、私はもはやその方程式の誤差を得ることはできませんが、' A = B \ C'が計算されるたびにエラーが表示されます... – user1259832

答えて

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の結果をより少なく信用するべきであることを示しています。

このような問題は、数値計算では常に問題になります。数値アルゴリズムを頻繁に使用する場合は、フィールドでの条件番号の役割や上記の前処理の技術に慣れるために、しばらく時間を取る必要があります。私の好みのテキストはLloyd Trefethenの "数値線形代数"ですが、数値代数のテキストはこれらの問題のいくつかに対処する必要があります。運のベスト

、 アンドリューあなたは `B =アイ(N)\ invB`としてBを計算する場合

1

主な問題は、あなたの行列の条件番号が高いことです(つまり、あなたのケースでは本当に小さなrcond(B)です)。これはあなたのアルゴリズムの反復構造に起因すると思います。各反復を行うにつれて、小さい特異値が小さくなり、条件数が指数関数的に大きくなります。この種の動作を避けるには、preconditioningをチェックする必要があります。

関連する問題