Много ситуаций дают начало разреженным проблемам линейного метода наименьших квадратов, часто с границами на переменных. Можно использовать алгоритм 'trust-region-reflective', чтобы решить разреженные связано ограниченные проблемы. Следующая проблема требует, чтобы переменные были неотрицательными. Эта проблема возникает из подбора кривой приближению функций к кусочному линейному сплайну. А именно, частицы рассеиваются на модульном квадрате. Функция, которая будет аппроксимирована, выполнена в этих точках, и кусочное линейное приближение сплайна создается при условии, что (линейные) коэффициенты не отрицательны. Существует 2 000 уравнений, чтобы соответствовать на 400 переменных:
load particle % Get C, d
lb = zeros(400,1);
options = optimoptions('lsqlin','Algorithm','trust-region-reflective');
[x,resnorm,residual,exitflag,output] = ...
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.
Диагональное предварительное создание условий по умолчанию работает довольно хорошо:
exitflag,resnorm,output
exitflag =
3
resnorm =
22.5794
output =
struct with fields:
iterations: 10
algorithm: 'trust-region-reflective'
firstorderopt: 2.7870e-05
cgiterations: 42
constrviolation: []
linearsolver: []
message: '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.'Для связанных ограниченных проблем оптимальность первого порядка является нормой бесконечности v.*g, где v задан как в Ограничениях Поля, и g является градиентом.
Можно улучшиться (уменьшают) меру по оптимальности первого порядка при помощи разреженной QR-факторизации в каждой итерации. Для этого установите SubproblemAlgorithm на 'factorization':
options = optimoptions(options,'SubproblemAlgorithm','factorization');
[x,resnorm,residual,exitflag,output] = ...
lsqlin(C,d,[],[],[],[],lb,[],[],options);Optimal solution found.
Оптимальность первого порядка измеряет уменьшения:
exitflag,resnorm,output
exitflag =
1
resnorm =
22.5794
output =
struct with fields:
iterations: 12
algorithm: 'trust-region-reflective'
firstorderopt: 5.5907e-15
cgiterations: 0
constrviolation: []
linearsolver: []
message: 'Optimal solution found.'