Чтобы задать целевую функцию для основанных на проблеме наименьших квадратов, напишите цель явно как сумму квадратов. При явном использовании формулировки методом наименьших квадратов вы получаете наиболее подходящий и эффективный решатель для вашей задачи. Для примера,
t = randn(10,1); % Data for the example x = optimvar('x',10); obj = sum((x - t).^2); % Explicit sum of squares prob = optimproblem("Objective",obj); % Check to see the default solver opts = optimoptions(prob)
opts = lsqlin options: ...
Напротив, выражение цели как математически эквивалентного выражения дает задачу, которую программное обеспечение интерпретирует как общую квадратичную задачу.
obj2 = (x - t)'*(x - t); % Equivalent to a sum of squares, % but not interpreted as a sum of squares prob2 = optimproblem("Objective",obj2); % Check to see the default solver opts = optimoptions(prob2)
opts = quadprog options: ...
Точно так же записывайте нелинейные методы наименьших квадратов как явные суммы квадратов оптимизационных выражений.
t = linspace(0,5); % Data for the example A = optimvar('A'); r = optimvar('r'); expr = fcn2optimexpr(@(A,r)A*exp(r*t),A,r); ydata = 3*exp(-2*t) + 0.1*randn(size(t)); obj3 = sum((expr - ydata).^2); % Explicit sum of squares prob3 = optimproblem("Objective",obj3); % Check to see the default solver opts = optimoptions(prob3)
opts = lsqnonlin options: ...
Наиболее общей формой, которую программное обеспечение интерпретирует как задачу наименьших квадратов, является сумма выражений, Rn из этой формы:
en - любое выражение. Если многомерный, en должен быть квадратурным термином за терминами .^2
.
an является скалярным числовым значением.
Эти kj являются положительными скалярными числовыми значениями.
Каждый Rn выражения должен вычисляться скаляром, а не многомерным значением. Для примера,
x = optimvar('x',10,3,4); y = optimvar('y',10,2); t = randn(10,3,4); % Data for example u = randn(10,2); % Data for example a = randn; % Coefficient k = abs(randn(5,1)); % Positive coefficients % Explicit sums of squares: R1 = a + k(1)*sum(k(2)*sum(k(3)*sum((x - t).^2,3))); R2 = k(4)*sum(k(5)*sum((y - u).^2,2)); R3 = 1 + (fcn2optimexpr(@cos,x(1)))^2; prob = optimproblem('Objective',R1 + R2 + R3); options = optimoptions(prob)
options = lsqnonlin options: ...