2016-12-14 13 views
4

Как реализовать функцию lu(A) в MATLAB, чтобы L*U был непосредственно A, и я также получил реальную матрицу L?Выполнение разложения LU без поворота в MATLAB

Когда я использую [L,U] = lu(A), MATLAB не дает мне права L матрицы. Когда я использую [L,U,P] = лу (A), мне нужно реализовать P*A = L*U, но я только хочу, чтобы умножить L*U получить A.

+0

Итак, вы хотите ввести матрицу и вернуть ее две матрицы, произведение которых является такой матрицей? Зная только A, вы хотите вернуть L и U, где LxU = A? Здесь нет однозначного ответа, потому что существует множество комбинаций L и U, которые могли бы сделать A. – AndyW

+0

Я хочу реализовать lu (A) так, чтобы он дал мне реальную нижнюю и верхнюю треугольную матрицу и L * U = A , – zer0kai

+1

«Я хочу только умножить L * U на получение A.» Но 'lu()' делает это. Просто «L» - это перестановочный нижний треугольник. – TroyHaskin

ответ

7

от Matlab lu всегда выполняет поворотное по умолчанию. Если у вас был, например, диагональный коэффициент, равный 0, когда вы пытались выполнить обычный алгоритм декомпозиции LU, он не будет работать, поскольку диагональные коэффициенты необходимы при выполнении исключения Гаусса для создания верхней треугольной матрицы 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] = 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 дает:

>> L*U 

ans = 

    7  6 10 
    3  8  7 
    3  5  5 

... который является исходной матрицей A.

+0

Спасибо, я уже написал это самостоятельно ... но разве это не возможно каким-то образом с lu (A)? – zer0kai

+0

@ zer0kai Нет, нет. MATLAB всегда поворачивается для обеспечения стабильности. Если бы у вас был, например, диагональный коэффициент, равный 0, алгоритм не будет работать. Для обеспечения стабильной LU-разложения требуется поворот. – rayryeng

+0

@ zer0kai Таким образом, если вы уже написали алгоритм для выполнения LU-декомпозиции без поворота, тогда вам придется использовать это. Разложение LU без поворота редко наблюдается на практике. Это прежде всего используется, чтобы ввести людей к идее техники, затем введение строит путем введения поворота. Поворот с помощью LU - это то, что используется чаще всего. – rayryeng

 Смежные вопросы

  • Нет связанных вопросов^_^