Этот пример показов, как использовать несколько алгоритмов, чтобы решить линейный метод наименьших квадратов задачу с ограниченным ограничением, что решение неотрицательно. Линейный метод наименьших квадратов имеет вид
.
В этом случае ограничьте решение неотрицательным, .
Чтобы начать, загрузите массивы и в рабочую область.
load particle
Просмотрите размер каждого массива.
sizec = size(C)
sizec = 1×2
2000 400
sized = size(d)
sized = 1×2
2000 1
The C
матрица имеет 2000 строк и 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
алгоритм. The factorization
и lsqnonneg
нормы невязки еще ниже и одинаковы на этом уровне точности отображения. Посмотрите, какая из них ниже.
disp(resnorm3 - resnorm4)
6.7857e-13
The lsqnonneg
норма невязки самая низкая на незначительную величину. Однако lsqnonneg
принимает большинство итераций, чтобы сходиться.