lsqnonneg

Решает неотрицательную линейную задачу методом наименьших квадратов

Описание

Решает неотрицательную задачу аппроксимации методом наименьших квадратов вида

minxCxd22, где x0.

Примечание

lsqnonneg применяется только к основанному на решателе подходу. Для обсуждения двух подходов оптимизации смотрите, Сначала Выбирают Problem-Based or Solver-Based Approach.

пример

x = lsqnonneg(C,d) возвращает векторный x это минимизирует norm(C*x-d) подвергните   x ≥ 0. Аргументы C и d mustBeReal.

пример

x = lsqnonneg(C,d,options) минимизирует с опциями оптимизации, заданными в структуре options. Используйте optimset установить эти опции.

x = lsqnonneg(problem) находит минимум для problem, где problem структура. Создайте problem аргумент путем экспорта проблемы из приложения Оптимизации, как описано в Экспорте работы.

пример

[x,resnorm,residual] = lsqnonneg(___), для любого предыдущего синтаксиса, дополнительно возвращает значение квадратичной 2-нормы невязки, norm(C*x-d)^2, и возвращает остаточный d-C*x.

[x,resnorm,residual,exitflag,output] = lsqnonneg(___) дополнительно возвращает значение exitflag это описывает выходное условие lsqnonneg, и структура output с информацией о процессе оптимизации.

пример

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___) дополнительно возвращает вектор множителей Лагранжа lambda.

Примеры

свернуть все

Найдем неотрицательное решение линейной задачи методом наименьших квадратов и сравним результат с решением задачи без ограничений.

Подготовьте C матрица и d вектор для проблемы min||Cx-d||.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];
 
d = [0.8587
     0.1781
     0.0747
     0.8405];

Вычислите ограниченные и неограниченные решения.

x = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

xunc = C\d
xunc = 2×1

   -2.5627
    3.1108

Все записи в x являются неотрицательными, но некоторые записи в xunc отрицательны.

Вычислите нормы остаточных значений для этих двух решений.

constrained_norm = norm(C*x - d)
constrained_norm = 0.9118
unconstrained_norm = norm(C*xunc - d)
unconstrained_norm = 0.6674

Неограниченное решение имеет меньшую норму невязки, потому что ограничения могут только увеличить норму невязки.

Установите Display опция к 'final' видеть выход когда lsqnonneg концы.

Создайте опции.

options = optimset('Display','final');

Подготовьте C матрица и d вектор для проблемы min||Cx-d||.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Вызовите lsqnonneg со структурой опций.

x = lsqnonneg(C,d,options);
Optimization terminated.

Вызовите lsqnonneg с выходными параметрами, чтобы получить решение, норму невязки и вектор невязок.

Подготовьте C матрица и d вектор для проблемы min||Cx-d||.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Получите решение и остаточную информацию.

 [x,resnorm,residual] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

Проверьте, что возвращенная норма невязки является квадратом нормы возвращенного вектора невязок.

 norm(residual)^2
ans = 0.8315

Запросите все выходные аргументы исследовать процесс решения и решения после lsqnonneg концы.

Подготовьте C матрица и d вектор для проблемы min||Cx-d||.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Решите задачу, запросив все выходные аргументы.

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

exitflag = 1
output = struct with fields:
    iterations: 1
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lambda = 2×1

   -0.1506
   -0.0000

exitflag 1, указание на правильное решение.

x(1) = 0, и соответствующий lambda(1) 0 , правильно указывание на двойственность. Точно так же x(2) > 0, и соответствующий lambda(2) = 0.

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

свернуть все

Линейный множитель в виде действительной матрицы. Представляет переменную C в задаче

minxCxd22.

Для совместимости, количества строк C должен равняться длине d.

Пример: C = [1,2;3,-1;-4,4]

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

Вектор свободных членов в виде вектора действительных чисел. Представляет переменную d в задаче

minxCxd22.

Для совместимости, длины d должен равняться количеству строк C.

Пример: d = [1;-6;5]

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

Опции оптимизации в виде структуры, такие как optimset возвращается. Можно использовать optimset установить или изменить значения этих полей в структуре опций. Дополнительную информацию см. в Ссылке Опций Оптимизации.

Display

Level of display:

  • 'notify' (значение по умолчанию) отображает вывод, только если функция не сходится.

  • 'off' или 'none' не отображает вывода.

  • 'final' отображения только окончательный результат.

TolX

Допуск завершения на x, положительная скалярная величина. Значением по умолчанию является 10*eps*norm(C,1)*length(C). Смотрите допуски и критерий остановки.

Пример: options = optimset('Display','final')

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

Структура задачи в виде структуры со следующими полями.

Имя поляЗапись

C

Действительная матрица

d

Вектор действительных чисел

solver

'lsqnonneg'

options

Структура опций такой, как возвращено optimset

Самый простой способ получить problem структура должна экспортировать проблему из приложения Оптимизации.

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

Выходные аргументы

свернуть все

Решение, возвращенное как вектор действительных чисел. Длина x совпадает с длиной d.

Квадрат нормы невязки, возвращенный как неотрицательный скаляр. Равный norm(C*x-d)^2.

Невязка, возвращенная как вектор действительных чисел. Невязкой является   d - C*x.

Обоснуйте lsqnonneg остановленный, возвращенный как целое число.

1

Функция сходилась к решению x.

0

Количество итераций превысило options.MaxIter.

Информация о процессе оптимизации, возвращенном как структура с полями:

iterations

Количество проделанных итераций

algorithm

'active-set'

message

Выходное сообщение

Множители Лагранжа, возвращенные как вектор действительных чисел. Записи удовлетворяют условию взаимозависимости x'*lambda = 0. Это означает lambda(i) < 0 когда x(i) приблизительно 0, и lambda(i) приблизительно 0 когда x(i) > 0.

Советы

  • Для проблем, где d имеет длину более чем 20, lsqlin может быть быстрее, чем lsqnonneg. Когда d имеет длину под 20, lsqnonneg обычно более эффективно.

    Преобразовывать между решателями когда C имеет больше строк, чем столбцы (значение, что система сверхопределяется),

    [x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)

    эквивалентно

    [m,n] = size(C);
    [x,resnorm,residual,exitflag,output,lambda_lsqlin] = ...
       lsqlin(C,d,-eye(n,n),zeros(n,1));

    Единственная разница - то, что соответствующие множители Лагранжа имеют противоположные знаки: lambda = -lambda_lsqlin.ineqlin.

Алгоритмы

lsqnonneg использует алгоритм, описанный в [1]. Алгоритм запускается с набора возможных базисных векторов и вычисляет связанный двойной векторный lambda. Это затем выбирает базисный вектор, соответствующий максимальному значению в lambda заменять его в базисе на другой возможный кандидат. Это продолжается до   lambda ≤ 0.

Ссылки

[1] Лоусон, C. L. и Р. Дж. Хэнсон. Решение задач наименьших квадратов. Верхний Сэддл-Ривер, NJ: Prentice Hall. 1974. Глава 23, p. 161.

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

Смотрите также

| | |

Представлено до R2006a