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. Команда backslash (\) вычисляет одно такое решение, но это решение обычно не минимизирует 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. The axes 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