主要内容

本页采用了机器翻译。点击此处可查看英文原文。

比较 lsqnonlinfmincon 的约束非线性最小二乘法

此示例表明,在求解约束最小二乘问题时,lsqnonlin 通常比 fmincon 需要更少的函数计算。两个求解器都使用 fmincon "interior-point" 算法来求解问题。然而 lsqnonlin 通常可以用更少的函数计算来求解问题。原因是 lsqnonlin 有更多信息可供使用。fmincon 最小化 iFi2 给出的平方和,其中 F 是一个向量函数。相比之下,lsqnonlin 与整个向量 F 一起工作,这意味着它可以访问总和的所有分量。换句话说,fmincon 只能访问总和的值,但 lsqnonlin 可以分别访问每个分量。

本示例末尾列出的 runlsqfmincon 辅助函数创建了一系列缩放的 Rosenbrock 型问题,其中 N 的非线性约束从 1 到 50,其中问题变量的数量为 2N。有关 Rosenbrock 函数的描述,请参阅基于问题求解有约束非线性问题:。该函数还绘制了结果,显示:

  • 迭代次数

  • 函数计数数量

  • 残差结果

该图显示了有限差分导数估计(标记为 FD)和使用自动微分计算的导数之间的差异。有关自动微分的描述,请参阅自动微分背景

runlsqfmincon;

Figure contains an axes object. The axes object with title Iterations, xlabel N, ylabel Iterations contains 4 objects of type line. These objects represent lsqnonlin, lsqnonlin FD, fmincon, fmincon FD.

Figure contains an axes object. The axes object with title Function count, log-scaled, xlabel N, ylabel log(Function count) contains 4 objects of type line. These objects represent lsqnonlin, lsqnonlin FD, fmincon, fmincon FD.

Figure contains an axes object. The axes object with title Residual, xlabel N, ylabel Residual contains 4 objects of type line. These objects represent lsqnonlin, lsqnonlin FD, fmincon, fmincon FD.

图显示了以下典型结果。

  • 对于每个 Nfmincon 的迭代次数是 lsqnonlin 的两倍多,并且随着 N 近似线性增加。

  • 迭代次数不依赖于导数估计方案。

  • 有限差分 (FD) 估计的函数数量比自动微分的函数数量高得多。

  • 对于相同的导数估计方案,lsqnonlin 的函数计数低于 fmincon 的函数计数。

  • 残差与所有解方法相匹配,这意味着结果与求解器和导数估计方案无关。

结果表明,无论是迭代次数还是函数计数,lsqnonlin 都比 fmincon 更高效。然而,不同的问题可能有不同的结果,并且对于某些问题,fminconlsqnonlin 更有效。

辅助函数

以下代码创建 runlsqfmincon 辅助函数。

function [lsq,lsqfd,fmin,fminfd] = runlsqfmincon()
optslsq = optimoptions("lsqnonlin",Display="none",...
    MaxFunctionEvaluations=1e5,MaxIterations=1e4); % Allow for many iterations and Fevals
optsfmincon = optimoptions("fmincon",Display="none",...
    MaxFunctionEvaluations=1e5,MaxIterations=1e4);
% Create structures to hold results
z = zeros(1,50);
lsq = struct("Iterations",z,"Fcount",z,"Residual",z);
lsqfd = lsq;
fmin = lsq;
fminfd = lsq;
rng(1) % Reproducible initial points
x00 = -1/2 + randn(50,1);
y00 = 1/2 + randn(50,1);
for N = 1:50
    x = optimvar("x",N,LowerBound=-3,UpperBound=3);
    y = optimvar("y",N,LowerBound=0,UpperBound=9);
    prob = optimproblem("Objective",sum((10*(y - x.^2)).^2 + (1 - x).^2));
    x0.x = x00(1:N);
    x0.y = y00(1:N);
    % Include a set of nonlinear inequality constraints
    cons = optimconstr(N);
    for i = 1:N
        cons(i) = x(i)^2 + y(i)^2 <= 1/2 + 1/8*i;
    end
    prob.Constraints = cons;
    [sol,fval,exitflag,output] = solve(prob,x0,Options=optslsq);
    lsq.Iterations(N) = output.iterations;
    lsq.Fcount(N) = output.funcCount;
    lsq.Residual(N) = fval;

    [sol,fval,exitflag,output] = solve(prob,x0,Options=optslsq,...
        ObjectiveDerivative="finite-differences",ConstraintDerivative="finite-differences");
    lsqfd.Iterations(N) = output.iterations;
    lsqfd.Fcount(N) = output.funcCount;
    lsqfd.Residual(N) = fval;

    [sol,fval,exitflag,output] = solve(prob,x0,Options=optsfmincon,Solver="fmincon");
    fmin.Iterations(N) = output.iterations;
    fmin.Fcount(N) = output.funcCount;
    fmin.Residual(N) = fval;

    [sol,fval,exitflag,output] = solve(prob,x0,Options=optsfmincon,Solver="fmincon",...
        ObjectiveDerivative="finite-differences",ConstraintDerivative="finite-differences");
    fminfd.Iterations(N) = output.iterations;
    fminfd.Fcount(N) = output.funcCount;
    fminfd.Residual(N) = fval;
end

N = 1:50;    
plot(N,lsq.Iterations,"k",N,lsqfd.Iterations,"b--",N,fmin.Iterations,"g",N,fminfd.Iterations,"r--")
legend("lsqnonlin","lsqnonlin FD","fmincon","fmincon FD",Location="northwest")
xlabel("N")
ylabel("Iterations")
title("Iterations")

figure
semilogy(N,lsq.Fcount,"k",N,lsqfd.Fcount,"b--",N,fmin.Fcount,"g",N,fminfd.Fcount,"r--")
legend("lsqnonlin","lsqnonlin FD","fmincon","fmincon FD",Location="northwest")
xlabel("N")
ylabel("log(Function count)")
title("Function count, log-scaled")

figure
plot(N,lsq.Residual,"k",N,lsqfd.Residual,"b--",N,fmin.Residual,"g",N,fminfd.Residual,"r--")
legend("lsqnonlin","lsqnonlin FD","fmincon","fmincon FD",Location="southeast")
xlabel("N")
ylabel("Residual")
ylim([0,0.4])
title("Residual")

end

另请参阅

| |

主题