Линейный метод наименьших квадратов со связанными ограничениями

Много ситуаций дают начало разреженным проблемам линейного метода наименьших квадратов, часто с границами на переменных. Можно использовать алгоритм 'trust-region-reflective', чтобы решить разреженные связано ограниченные проблемы. Следующая проблема требует, чтобы переменные были неотрицательными. Эта проблема возникает из подбора кривой приближению функций к кусочному линейному сплайну. А именно, частицы рассеиваются на модульном квадрате. Функция, которая будет аппроксимирована, выполнена в этих точках, и кусочное линейное приближение сплайна создается при условии, что (линейные) коэффициенты не отрицательны. Существует 2 000 уравнений, чтобы соответствовать на 400 переменных:

load particle   % Get C, d
lb = zeros(400,1);
options = optimoptions('lsqlin','Algorithm','trust-region-reflective');
[x,resnorm,residual,exitflag,output] = ...
              lsqlin(C,d,[],[],[],[],lb,[],[],options);
Local minimum possible.

lsqlin stopped because the relative change in function value is less than the square root of the function tolerance and the rate of change in the function value is slow.

Диагональное предварительное создание условий по умолчанию работает довольно хорошо:

exitflag,resnorm,output

exitflag =
     3

resnorm =
   22.5794

output = 
  struct with fields:

         iterations: 10
          algorithm: 'trust-region-reflective'
      firstorderopt: 2.7870e-05
       cgiterations: 42
    constrviolation: []
       linearsolver: []
            message: 'Local minimum possible.↵↵lsqlin stopped because the relative change in function value is less than the square root of the function tolerance and the rate of change in the function value is slow.'

Для связанных ограниченных проблем оптимальность первого порядка является нормой бесконечности v.*g, где v задан как в Ограничениях Поля, и g является градиентом.

Можно улучшиться (уменьшают) меру по оптимальности первого порядка при помощи разреженной QR-факторизации в каждой итерации. Для этого установите SubproblemAlgorithm на 'factorization':

options = optimoptions(options,'SubproblemAlgorithm','factorization');
[x,resnorm,residual,exitflag,output] = ... 
              lsqlin(C,d,[],[],[],[],lb,[],[],options);
Optimal solution found.

Оптимальность первого порядка измеряет уменьшения:

exitflag,resnorm,output

exitflag =
     1

resnorm =
   22.5794

output =
  struct with fields:
         iterations: 12
          algorithm: 'trust-region-reflective'
      firstorderopt: 5.5907e-15
       cgiterations: 0
    constrviolation: []
       linearsolver: []
            message: 'Optimal solution found.'

Похожие темы