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