lsqminnorm

Минимальное решение методом наименьших квадратов нормы к линейному уравнению

Описание

пример

X = lsqminnorm(A,B) возвращает массив X это решает линейное уравнение AX = B и минимизирует значение norm(A*X-B). Если несколько решений существуют к этой проблеме, то lsqminnorm возвращает решение, которое минимизирует norm(X).

пример

X = lsqminnorm(A,B,tol) дополнительно задает допуск это lsqminnorm использование, чтобы определить ранг A.

пример

X = lsqminnorm(___,rankWarn) задает дополнительный флаг, чтобы вывести предупреждение если A имеет низкий ранг. Можно использовать любую из комбинаций входных аргументов в предыдущих синтаксисах. rankWarn может быть 'nowarn' (значение по умолчанию) или 'warn'.

Примеры

свернуть все

Решите линейную систему, которая имеет бесконечно много решений с обратной косой чертой (\) и lsqminnorm. Сравните результаты с помощью 2-норм решений.

Когда бесконечные решения существуют к Ax=b, каждый из них минимизирует Ax-b. Команда обратной косой черты (\) вычисляет одно такое решение, но это решение обычно не минимизирует x. Решение вычисляется lsqminnorm минимизирует не только norm(A*x-b), но также и norm(x).

Рассмотрите простую линейную систему одним уравнением и двумя неизвестными, 2x1+3x2=8. Эта система является недоопределенной, поскольку существует меньше уравнений, чем неизвестные. Решите уравнение с помощью и обратной косой черты и lsqminnorm.

A = [2 3];
b = 8;
x_a = A\b
x_a = 2×1

         0
    2.6667

x_b = lsqminnorm(A,b)
x_b = 2×1

    1.2308
    1.8462

Эти два метода получают различные решения, потому что обратная косая черта только стремится минимизировать norm(A*x-b), тогда как lsqminnorm также цели минимизировать norm(x). Вычислите эти нормы и поместите результаты в таблицу для легкого сравнения.

s1 = {'Backslash'; 'lsqminnorm'};
s2 = {'norm_Ax_minus_b','norm_x'};
T = table([norm(A*x_a-b); norm(A*x_b-b)],[norm(x_a); norm(x_b)],'RowNames',s1,'VariableNames',s2)
T=2×2 table
                  norm_Ax_minus_b    norm_x
                  _______________    ______

    Backslash                0       2.6667
    lsqminnorm      8.8818e-16       2.2188

Этот рисунок иллюстрирует ситуацию и показывает, какие решения каждый из методов возвращает. Синяя линия представляет бесконечное число решений уравнения x2=-23x1+83. Оранжевый круг представляет минимальное расстояние от источника до линии решений и решения, возвращенного lsqminnorm находится точно в точке касательной между линией и кругом, указывая, что это - решение, которое является самым близким началу координат.

Покажите как, задав допуск к расчету ранга в lsqminnorm может помочь задать масштаб задачи так, чтобы случайный шум не повреждал решение.

Создайте матрицу низкого ранга ранга 5 и правый вектор стороны b.

rng default % for reproducibility
U = randn(200,5);
V = randn(100,5);
A = U*V';
b = U*randn(5,1) + 1e-4*randn(200,1);

Решите линейную систему Ax=b использование lsqminnorm. Вычислите нормы A*x-b и x проверять качество решения.

x = lsqminnorm(A,b);
norm(A*x-b)
ans = 0.0014
norm(x)
ans = 0.1741

Теперь добавьте небольшое количество шума к матричному A и решите линейную систему снова. Шум влияет на вектор решения x из линейной системы непропорционально.

Anoise = A + 1e-12*randn(200,100);
xnoise = lsqminnorm(Anoise,b);
norm(Anoise*xnoise - b)
ans = 0.0010
norm(xnoise)
ans = 1.1216e+08

Причина большой разницы в решениях состоит в том, что шум влияет на приближение низкого ранга A. Другими словами, lsqminnorm обрабатывает маленькие значения на диагонали R матрица в разложении QR A как являющийся более важным, чем они. Идеально, эти маленькие значения на диагонали R должен быть обработан как нули.

Постройте диагональные элементы R матрица в разложении QR Anoise. Большое количество диагональных элементов находится порядка 1e-10.

[Q,R,p] = qr(Anoise,0);
semilogy(abs(diag(R)),'o')

Figure contains an axes object. The axes object contains an object of type line.

Решение этой проблемы состоит в том, чтобы увеличить допуск, используемый lsqminnorm так, чтобы приближение низкого ранга Anoise с ошибкой меньше, чем 1e-8 используется в вычислении. Это делает результат намного менее восприимчивым к шуму. Решением с помощью допуска является очень близко к исходному решению x.

xnoise = lsqminnorm(Anoise, b, 1e-8);
norm(Anoise*xnoise - b)
ans = 0.0014
norm(xnoise)
ans = 0.1741
norm(x - xnoise)
ans = 1.0804e-14

Решите линейную систему, связавшую матрицу коэффициентов низкого ранга с включенными предупреждениями.

Создайте 3х3 матрицу, которая имеет ранг 2. В этой матрице можно получить третий столбец путем добавления вместе первых двух столбцов.

A = [1 2 3; 4 5 9; 6 7 13]
A = 3×3

     1     2     3
     4     5     9
     6     7    13

Найдите минимальное решение методом наименьших квадратов нормы к проблеме Ax=b, где b равно второму столбцу в A. Задайте 'warn' отметьте для lsqminnorm выводить предупреждение, если это обнаруживает тот A имеет низкий ранг.

b = A(:,2);
x = lsqminnorm(A,b,'warn')
Warning: Rank deficient, rank = 2, tol =  1.072041e-14.
x = 3×1

   -0.3333
    0.6667
    0.3333

Входные параметры

свернуть все

Матрица коэффициентов. Матрица коэффициентов появляется в системе линейных уравнений слева как Ax = B. Матрица коэффициентов может быть полной или разреженной.

Типы данных: single | double
Поддержка комплексного числа: Да

Входной массив в виде вектора или матрицы. B появляется в системе линейных уравнений справа как Ax = B. Если B матрица, затем каждый столбец в матрице представляет различный вектор для правой стороны.

Типы данных: single | double
Поддержка комплексного числа: Да

Оцените допуск в виде неотрицательного скаляра. Определение допуска может помочь препятствовать решению быть восприимчивым к случайному шуму в матрице коэффициентов. По умолчанию, lsqminnorm вычисляет tol на основе разложения QR A.

lsqminnorm вычисляет ранг A как количество диагональных элементов в R матрица разложения QR [Q,R,p] = qr(A,0) с абсолютным значением, больше, чем tol. Если ранг A k, затем функция формирует приближение низкого ранга A путем умножения первого k столбцы Q первым k строки R. Изменение допуска влияет на это приближение низкого ранга A.

Пример: X = lsqminnorm(A,B,1e-2)

Типы данных: double

Предупреждение переключателя для матриц низкого ранга в виде любого 'nowarn' или 'warn'. Задайте 'warn' указать на это lsqminnorm должен произвести предупреждения если матрица коэффициентов A имеет неполный ранг.

Пример: X = lsqminnorm(A,B,'warn')

Советы

  • Решение минимальной нормы, вычисленное lsqminnorm особенно интересно, когда несколько решений существуют. Уравнение Ax = b имеет много решений каждый раз, когда A является недоопределенным (меньше строк, чем столбцы) или низкого ранга.

  • lsqminnorm(A,B,tol) обычно более эффективно, чем pinv(A,tol)*B для вычислительных минимальных решений методом наименьших квадратов нормы к линейным системам. lsqminnorm использует полное ортогональное разложение (COD), чтобы найти приближение низкого ранга Aв то время как pinv использует сингулярное разложение (SVD). Поэтому результаты pinv и lsqminnorm не соответствуйте точно.

  • Для разреженных матриц, lsqminnorm использует различный алгоритм, чем для плотных матриц, и поэтому может привести к различным результатам.

Расширенные возможности

Введенный в R2017b