Main Content

编写基于问题的最小二乘法的目标函数

要指定基于问题的最小二乘法的目标函数,请将目标明确写为平方和或表达式范数的平方。通过明确使用最小二乘表示,您可以获得最合适、最有效的求解器问题的方案。例如,

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
solver = solvers(prob)
solver = 
"lsqlin"

等效地,将目标写为平方范数。

obj2 = norm(x-t)^2;
prob2 = optimproblem(Objective=obj2);
solver2 = solvers(prob2)
solver2 = 
"lsqlin"

相反,将目标表示为数学上等价的表达式会产生一个问题,软件会将其解释为一般二次问题。

obj3 = (x - t)'*(x - t); % Equivalent to a sum of squares,
                         % but not interpreted as a sum of squares
prob3 = optimproblem(Objective=obj3);
solver3 = solvers(prob3)
solver3 = 
"quadprog"

类似地,将非线性最小二乘写为范数的平方或优化表达式的显式平方和。这个目标是一个明确的平方和。

t = linspace(0,5); % Data for the example
A = optimvar("A");
r = optimvar("r");
expr = A*exp(r*t);
ydata = 3*exp(-2*t) + 0.1*randn(size(t));

obj4 = sum((expr - ydata).^2); % Explicit sum of squares

prob4 = optimproblem(Objective=obj4);
solver4 = solvers(prob4)
solver4 = 
"lsqnonlin"

等效地,将目标写为平方范数。

obj5 = norm(expr - ydata)^2; % norm squared
prob5 = optimproblem(Objective=obj5);
solver5 = solvers(prob5)
solver5 = 
"lsqnonlin"

软件解释为最小二乘问题的最一般形式是范数的平方,或者是以下形式的表达式 Rn 的总和:

Rn=an+k1(k2(k3(kjen2)))

  • en 是任何表达式。如果是多维的,则应使用 .^2en 逐项进行平方。

  • an 是一个标量数值。

  • kj 是正标量数值。

  • 您可以除以 kj 而不是乘以 kj ,这等效于乘以 1/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 + cos(x(1))^2;
prob6 = optimproblem(Objective=R1 + R2 + R3);
solver6 = solvers(prob6)
solver6 = 
"lsqnonlin"

另请参阅

|

相关主题