В этом примере показано, как использовать несколько алгоритмов для решения задачи линейных наименьших квадратов с ограничивающим ограничением, что решение неотрицательно. Линейная задача наименьших квадратов имеет вид
.
В этом случае ограничьте решение неотрицательным, .
Для начала загрузите массивы и в рабочую область.
load particleПросмотр размера каждого массива.
sizec = size(C)
sizec = 1×2
2000 400
sized = size(d)
sized = 1×2
2000 1
Создание переменной оптимизации x соответствующего размера для умножения на C. Наложение нижней границы 0 по элементам x.
x = optimvar('x',sizec(2),'LowerBound',0);
Создайте выражение целевой функции.
residual = C*x - d; obj = sum(residual.^2);
Создать проблему оптимизации под названием nonneglsq и включить в проблему объективную функцию.
nonneglsq = optimproblem('Objective',obj);Найдите решатель проблемы по умолчанию.
opts = optimoptions(nonneglsq)
opts =
lsqlin options:
Options used by current Algorithm ('interior-point'):
(Other available algorithms: 'active-set', 'trust-region-reflective')
Set properties:
No options set.
Default properties:
Algorithm: 'interior-point'
ConstraintTolerance: 1.0000e-08
Display: 'final'
LinearSolver: 'auto'
MaxIterations: 200
OptimalityTolerance: 1.0000e-08
StepTolerance: 1.0000e-12
Show options not used by current Algorithm ('interior-point')
Решите проблему с помощью решателя по умолчанию.
[sol,fval,exitflag,output] = solve(nonneglsq);
Solving problem using lsqlin. 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.
Для просмотра подробной информации о процессе оптимизации изучите структуру вывода.
disp(output)
message: '...'
algorithm: 'interior-point'
firstorderopt: 9.9673e-07
constrviolation: 0
iterations: 9
linearsolver: 'sparse'
cgiterations: []
solver: 'lsqlin'
Структура вывода показывает, что lsqlin решатель использует разреженный внутренний линейный решатель для алгоритма внутренней точки и использует 9 итераций, чтобы получить меру оптимальности первого порядка около 1e-6.
Алгоритм, отражающий область доверия, обрабатывает связанные проблемы. Посмотрите, насколько хорошо он справляется с этой проблемой.
opts.Algorithm = 'trust-region-reflective'; [sol2,fval2,exitflag2,output2] = solve(nonneglsq,'Options',opts);
Solving problem using lsqlin. Local minimum possible. lsqlin stopped because the relative change in function value is less than the function tolerance.
disp(output2)
iterations: 14
algorithm: 'trust-region-reflective'
firstorderopt: 5.2187e-08
cgiterations: 54
constrviolation: []
linearsolver: []
message: 'Local minimum possible....'
solver: 'lsqlin'
На этот раз решатель принимает больше итераций и приходит к решению с более низкой (лучшей) мерой оптимальности первого порядка.
Чтобы получить еще лучшую меру оптимальности первого порядка, попробуйте установить SubproblemAlgorithm опция для 'factorization'.
opts.SubproblemAlgorithm = 'factorization'; [sol3,fval3,exitflag3,output3] = solve(nonneglsq,'Options',opts);
Solving problem using lsqlin. Optimal solution found.
disp(output3)
iterations: 11
algorithm: 'trust-region-reflective'
firstorderopt: 1.3973e-14
cgiterations: 0
constrviolation: []
linearsolver: []
message: 'Optimal solution found.'
solver: 'lsqlin'
Использование этой опции приводит меру оптимальности первого порядка почти к нулю, что является наилучшим возможным.
lsqnonneg решатель специально разработан для обработки неотрицательных линейных наименьших квадратов. Попробуйте этот решатель.
[sol4,fval4,exitflag4,output4] = solve(nonneglsq,'Solver','lsqnonneg');
Solving problem using lsqnonneg.
disp(output4)
iterations: 184
algorithm: 'active-set'
message: 'Optimization terminated.'
solver: 'lsqnonneg'
lsqnonneg не сообщает об оптимальности первого порядка. Вместо этого изучите остаточные нормы, которые возвращаются в fval выходы. Чтобы увидеть цифры низшей значимости, вычтите 22.5794 из каждой остаточной нормы.
t = table(fval - 22.5794, fval2 - 22.5794, fval3 - 22.5794, fval4 - 22.5794,... 'VariableNames',{'default','trust-region-reflective','factorization','lsqnonneg'})
t=1×4 table
default trust-region-reflective factorization lsqnonneg
__________ _______________________ _____________ __________
5.0804e-05 4.9179e-05 4.9179e-05 4.9179e-05
Решатель по умолчанию имеет несколько более высокую (худшую) остаточную норму, чем остальные три, остаточные нормы которых неотличимы при этом уровне точности отображения. Чтобы увидеть, что самое низкое, вычитайте lsqnonneg результат двух результатов.
disp([fval2 - fval4,fval3 - fval4])
1.0e-12 *
0.7070 0.6999
lsqnonneg остаточная норма является наименьшей почти на незначительную величину. Однако lsqnonneg использует наибольшее количество итераций для сходимости.