В этом примере показано, как использовать несколько алгоритмов для решения линейной задачи наименьших квадратов с ограничивающим ограничением, что решение неотрицательно. Линейная задача наименьших квадратов имеет вид
.
В этом случае ограничьте решение неотрицательным, .
Для начала загрузите массивы и в рабочую область.
load particleПросмотр размера каждого массива.
sizec = size(C)
sizec = 1×2
2000 400
sized = size(d)
sized = 1×2
2000 1
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.
Для просмотра подробной информации о процессе оптимизации изучите структуру вывода.
disp(output)
message: '...'
algorithm: 'interior-point'
firstorderopt: 3.6717e-06
constrviolation: 0
iterations: 8
linearsolver: 'sparse'
cgiterations: []
Структура вывода показывает, что 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.'
Использование этой опции приводит измерение оптимальности первого порядка почти к нулю, что является наилучшим возможным результатом.
Попробуйте решить проблему с помощью 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 использует наибольшее количество итераций для сходимости.