В этом примере показано, как использовать несколько алгоритмов, чтобы решить задачу линейного метода наименьших квадратов со связанным ограничением, что решение является неотрицательным. Проблема линейного метода наименьших квадратов имеет форму
.
В этом случае ограничьте решение быть неотрицательными, .
Чтобы начаться, загрузите массивы и в вашу рабочую область.
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
берет большинство итераций, чтобы сходиться.