调整解以进行分析
使用基于问题的方法时,您可以尝试不同的选项和方法来调整求解器并更快地产生结果。
尝试差异化选项
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;
另请参阅
fcn2optimexpr
| solve
| prob2struct