lu(A)
をMATLABに実装すると、L*U
が直接A
になり、実際のL
行列も得られますか?MATLABでピボットを使わないでLU分解を実行
[L,U] = lu(A)
を使用すると、MATLABは私に正しいL
行列を与えません。私は[L,U,P]
= LU(A)を使用すると、私はP*A = L*U
を実装する必要がありますが、私は唯一のA.を受信するL*U
を掛けたい
lu(A)
をMATLABに実装すると、L*U
が直接A
になり、実際のL
行列も得られますか?MATLABでピボットを使わないでLU分解を実行
[L,U] = lu(A)
を使用すると、MATLABは私に正しいL
行列を与えません。私は[L,U,P]
= LU(A)を使用すると、私はP*A = L*U
を実装する必要がありますが、私は唯一のA.を受信するL*U
を掛けたい
MATLABのlu
は常にデフォルトでピボット行います。たとえば、従来のLU分解アルゴリズムを実行しようとしたときに0に等しい対角係数があった場合、上三角行列U
を作成するためにガウス消去を実行するときに対角係数が必要になるため、機能しませんゼロで除算するエラー。分解が安定していることを確認するには、ピボットが必要です。
ただし、行列の対角係数がゼロでないことが保証されていれば、それは非常に簡単ですが、これはあなた自身で書く必要があります。あなたがしなければならないのは、マトリックス上のガウス消去を実行し、マトリックスを減少したエシェロン形式に減らすことだけです。その結果減じられたエシェロン形式行列はU
であるが、ガウス消去におけるL
の下三角部分を除去するために必要な係数は、下三角半分に配置されてU
となる。
あなたの行列がA
に格納されていると仮定すると、このようなことが起こる可能性があります。私はここで正方行列を仮定していることに注意してください。非ピボットLU分解アルゴリズムの実装は、MATLAB関数ファイルに配置されlu_nopivot
と呼ばれる:実行している例として
function [L, U] = lu_nopivot(A)
n = size(A, 1); % Obtain number of rows (should equal number of columns)
L = eye(n); % Start L off as identity and populate the lower triangular half slowly
for k = 1 : n
% For each row k, access columns from k+1 to the end and divide by
% the diagonal coefficient at A(k ,k)
L(k + 1 : n, k) = A(k + 1 : n, k)/A(k, k);
% For each row k+1 to the end, perform Gaussian elimination
% In the end, A will contain U
for l = k + 1 : n
A(l, :) = A(l, :) - L(l, k) * A(k, :);
end
end
U = A;
end
、我々は以下の3×3の行列があるとします。
>> rng(123)
>> A = randi(10, 3, 3)
A =
7 6 10
3 8 7
3 5 5
ランニングこのアルゴリズムは、私たちを与える:一緒にL
とU
を掛ける
>> [L,U] = lu_nopivot(A)
L =
1.0000 0 0
0.4286 1.0000 0
0.4286 0.4474 1.0000
U =
7.0000 6.0000 10.0000
0 5.4286 2.7143
0 0 -0.5000
が得られます。
>> L*U
ans =
7 6 10
3 8 7
3 5 5
...元の行列A
です。
ありがとう、私はすでにこれを私自身で書いていますが、これはlu(A)でも何らかの形で可能ではありませんか? – zer0kai
@ zer0kaiいいえありません。 MATLABは常に安定性を確保するためにピボットします。たとえば、対角係数が0に等しい場合、アルゴリズムは機能しません。 LU分解が安定していることを確認するには、ピボットが必要です。 – rayryeng
@ zer0kaiしたがって、既にピボットを使わずにLU分解を実行するアルゴリズムを作成していれば、それを使用する必要があります。ピボットを伴わないLU分解は実際上ほとんど見られません。これは、主に技術のアイデアを人々に紹介するために使用され、導入はピボットを導入することによって構築されます。 LUを使用したピボットは、最も頻繁に使用されるものです。 – rayryeng
したがって、行列を入力し、その行列の積が2つの行列を返すようにしたいですか? Aだけを知っていれば、LとUを返そうとします、ここでLxU = Aですか? Lを作ることができるLとUの組み合わせが複数存在するので、明確な答えはありません。 – AndyW
私は実際の下三角行列とL * U = Aを与える方法でlu(A)を実装したいと思います。 – zer0kai
"私はL * Uを掛けてAを受け取るだけです。"しかし 'lu()'はこれを行います。 'L'は置換された下三角です。 – TroyHaskin