Main Content

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

调整解以进行分析

使用基于问题的方法时,您可以尝试不同的选项和方法来调整求解器并更快地产生结果。

尝试差异化选项

solve 函数通常使用最有效的自动微分方法。但是,使用不同的方法,您的问题可能会运行得更快,或者根本不需要自动区分。

为了获得更快的解,请尝试 solve 的不同自动微分选项。将 ObjectiveDerivative name-value 参量设置为非默认值。例如:

[sol,fval] = solve(prob,x0,ObjectiveDerivative="auto-forward")

尝试评估方法

当适用时,尝试直接评估优化表达式,而不使用 fcn2optimexpr。然后用 fcn2optimexpr 评估表达式并比较结果。类似地,除了使用默认设置 "on" 之外,还可以尝试使用 fcn2optimexpr 并将 Analysis 参量设置为 "off"。虽然默认设置可能是最有效的,但非默认设置可能最适合求解您的问题。

fcn2optimexpr 的拆分表达式

有时,当您将表达式分解为更小的部分并在每个部分上分别调用 fcn2optimexpr 时,solve 会运行得更有效。通过这种方法,fcn2optimexpr 将每个表达式的类型解释为所包含表达式中最通用的类型。例如,如果表达式包含二次项和指数项,则 fcn2optimexpr 将该表达式标记为一般非线性表达式。如果将表达式拆分为仅二次表达式和指数表达式,则 fcn2optimexpr 可以正确地将第一个表达式标记为二次,将第二个表达式标记为一般非线性。

例如:

expr1 = sum(x.^2 + y.^2,"all");
expr2 = sum(x.*exp(x).*(x.^2 + y.^2),"all");
express1 = fcn2optimexpr(expr1,x,y);
express2 = fcn2optimexpr(expr2,x);
prob.Objective = express1;
prob.Constraints.expconstr = express2 >= 1/10;

在这个示例中,目标和约束具有单独的表达式,使得求解器能够识别出目标是纯平方和。相反,以下表示不允许求解器识别目标是平方和。

expr1 = x.^2 + y.^2;
[express1,express2] = ...
    fcn2optimexpr([sum(expr1,"all),sum(x.*exp(x).*expr1,"all)],x,y);
prob.Objective = express1;
prob.Constraints.expconstr = express2 >= 1/10;

另请参阅

| |

相关主题