Неотрицательная линейная задача для метода наименьших квадратов, основанная на решателе

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

minxCx-d2.

В этом случае ограничьте решение быть неотрицательными, x0.

Чтобы начаться, загрузите массивы C и d в вашу рабочую область.

load particle

Просмотрите размер каждого массива.

sizec = size(C)
sizec = 1×2

        2000         400

sized = size(d)
sized = 1×2

        2000           1

C матрица имеет 2 000 строк и 400 столбцов. Поэтому иметь правильный размер для умножения матриц, x вектор имеет 400 строк. Чтобы представлять ограничение неотрицательности, установите нижние границы нуля на всех переменных.

lb = zeros(size(C,2),1);

Решите задачу с помощью lsqlin.

[x,resnorm,residual,exitflag,output] = ...
    lsqlin(C,d,[],[],[],[],lb);
Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Чтобы видеть детали процесса оптимизации, исследуйте структуру output.

disp(output)
            message: '...'
          algorithm: 'interior-point'
      firstorderopt: 3.6717e-06
    constrviolation: 0
         iterations: 8
       linearsolver: 'sparse'
       cgiterations: []

Структура output показывает тот lsqlin использует разреженный внутренний линейный решатель для алгоритма внутренней точки и берет 8 итераций, чтобы достигнуть меры оптимальности первого порядка приблизительно 3.7e-6.

Измените алгоритм

Доверительная область отражающий алгоритм решает связано ограниченные проблемы. Смотрите, как хорошо это выполняет на этой проблеме.

options = optimoptions('lsqlin','Algorithm','trust-region-reflective');
[x2,resnorm2,residual2,exitflag2,output2] = ...
    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.
disp(output2)
         iterations: 10
          algorithm: 'trust-region-reflective'
      firstorderopt: 2.7870e-05
       cgiterations: 42
    constrviolation: []
       linearsolver: []
            message: 'Local minimum possible....'

На этот раз решатель берет больше итераций и достигает решения с более высокой (худшей) мерой оптимальности первого порядка.

Чтобы улучшить меру оптимальности первого порядка, попытайтесь установить SubproblemAlgorithm опция к 'factorization'.

options.SubproblemAlgorithm = 'factorization';
[x3,resnorm3,residual3,exitflag3,output3] = ...
    lsqlin(C,d,[],[],[],[],lb,[],[],options);
Optimal solution found.
disp(output3)
         iterations: 12
          algorithm: 'trust-region-reflective'
      firstorderopt: 5.5907e-15
       cgiterations: 0
    constrviolation: []
       linearsolver: []
            message: 'Optimal solution found.'

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

Измените решатель

Попытайтесь решить t задачу с помощью lsqnonneg решатель, который спроектирован, чтобы обработать неотрицательную линейную задачу для метода наименьших квадратов.

[x4,resnorm4,residual4,exitflag4,output4] = lsqnonneg(C,d);
disp(output4)
    iterations: 184
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lsqnonneg не сообщает мера оптимальности первого порядка. Вместо этого исследуйте нормы невязки. Чтобы видеть цифры более низкого значения, вычтите 22.5794 из каждой нормы невязки.

t = table(resnorm - 22.5794, resnorm2 - 22.5794, resnorm3 - 22.5794, resnorm4 - 22.5794,...
    'VariableNames',{'default','trust-region-reflective','factorization','lsqnonneg'})
t=1×4 table
     default      trust-region-reflective    factorization    lsqnonneg 
    __________    _______________________    _____________    __________

    7.5411e-05          4.9186e-05            4.9179e-05      4.9179e-05

lsqlin по умолчанию алгоритм имеет более высокую норму невязки, чем trust-region-reflective алгоритм. factorization и lsqnonneg нормы невязки являются четными ниже и являются тем же самым на этом уровне точности отображения. Смотрите, какой ниже.

disp(resnorm3 - resnorm4)
   6.7857e-13

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

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

|

Похожие темы