基于问题求解有约束非线性问题: -凯发k8网页登录
典型优化问题
此示例说明如何使用基于问题的方法来求解有约束非线性优化问题。该示例展示了典型的工作流:创建目标函数、创建约束、求解问题和检查结果。
注意:
如果目标函数或非线性约束不是由初等函数组成,则必须使用 将非线性函数转换为优化表达式。请参阅此示例的最后一部分,,或。
要了解如何通过基于求解器的方法处理此问题,请参阅使用优化实时编辑器任务或求解器的有约束非线性问题。
问题表示:rosenbrock 函数
假设有以下在单位圆盘上最小化 rosenbrock 函数的问题
单位圆盘是以原点为圆心、半径为 1 的圆。也就是说,基于数据集 ,求使函数 最小的 。此问题是非线性约束下的非线性函数最小化问题。
rosenbrock 函数是优化中的标准测试函数。它在点 [1,1]
点达到唯一最小值 0。对于某些算法来说,求最小值是一个挑战,因为函数在深度弯曲的波谷中有一个浅最小值。此问题的解不在 [1,1]
点处,因为该点不满足约束。
以下图窗显示单位圆盘中 rosenbrock 函数的两个视图。垂直轴采用对数刻度;换句话说,绘图显示 。等高线位于曲面图下方。
rosenbrock = @(x)100*(x(:,2) - x(:,1).^2).^2 (1 - x(:,1)).^2; % vectorized function figure1 = figure('position',[1 200 600 300]); colormap('gray'); axis square; r = 0:.002:1; th = 2*pi*(0:.002:1); x = r'*cos(th); y = r'*sin(th); z = log(1 rosenbrock([x(:),y(:)])); z = reshape(z,size(x)); % create subplot subplot1 = subplot(1,2,1,'parent',figure1); view([124 34]); grid('on'); hold on; % create surface surf(x,y,z,'parent',subplot1,'linestyle','none'); % create contour contour(x,y,z,'parent',subplot1); % create subplot subplot2 = subplot(1,2,2,'parent',figure1); view([234 34]); grid('on'); hold on % create surface surf(x,y,z,'parent',subplot2,'linestyle','none'); % create contour contour(x,y,z,'parent',subplot2); % create textarrow annotation(figure1,'textarrow',[0.4 0.31],... [0.055 0.16],... 'string',{'minimum at (0.7864,0.6177)'}); % create arrow annotation(figure1,'arrow',[0.59 0.62],... [0.065 0.34]); title("rosenbrock's function: two views") hold off
rosenbrock
函数句柄一次在任意数量的二维点处计算 rosenbrock 函数。这种可加快函数的绘图速度,在用于加快在多个点的函数计算速度的其他环境中很有用。
函数 称为目标函数。目标函数是您要进行最小化的函数。不等式 称为约束。约束限制求解器用于搜索最小值的 集。您可以使用任意数量的约束,约束可以是不等式,也可以是方程。
使用优化变量定义问题
基于问题的优化方法使用优化变量来定义目标和约束。使用这些变量创建表达式有两种方法:
对于多项式或有理函数,直接使用变量编写表达式。
对于其他类型的函数,使用 将函数转换为优化表达式。请参阅此示例末尾的使用
fcn2optimexpr
的替代表示。
对于此问题,目标函数和非线性约束均为多项式,因此可以直接用优化变量来编写表达式。创建名为 'x'
的二维优化变量。
x = optimvar('x',1,2);
将目标函数创建为以优化变量表示的多项式。
obj = 100*(x(2) - x(1)^2)^2 (1 - x(1))^2;
以 obj
为目标函数,创建名为 prob
的优化问题。
prob = optimproblem('objective',obj);
将非线性约束创建为以优化变量表示的多项式。
nlcons = x(1)^2 x(2)^2 <= 1;
在问题中包含非线性约束。
prob.constraints.circlecons = nlcons;
检查此问题。
show(prob)
optimizationproblem : solve for: x minimize : ((100 .* (x(2) - x(1).^2).^2) (1 - x(1)).^2) subject to circlecons: (x(1).^2 x(2).^2) <= 1
求解问题
要求解优化问题,请调用 solve
。此问题需要一个初始点,它是给出优化变量初始值的结构体。创建初始点结构体 x0
, 值为 [0 0]
。
x0.x = [0 0]; [sol,fval,exitflag,output] = solve(prob,x0)
solving problem using fmincon. local minimum found that satisfies the constraints. optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
x: [0.7864 0.6177]
fval = 0.0457
exitflag = optimalsolution
output = struct with fields:
iterations: 24
funccount: 34
constrviolation: 0
stepsize: 6.9161e-06
algorithm: 'interior-point'
firstorderopt: 2.1625e-08
cgiterations: 4
message: 'local minimum found that satisfies the constraints....'
bestfeasible: [1x1 struct]
objectivederivative: "reverse-ad"
constraintderivative: "closed-form"
solver: 'fmincon'
检查解
该解显示 exitflag = optimalsolution
。此退出标志表示该解是局部最优值。有关尝试求更优解的信息,请参阅。
退出消息表明解满足约束。您可以从几个方面检查该解是否确实可行。
检查在
output
结构体的constrviolation
字段中报告的不可行性。
infeas = output.constrviolation
infeas = 0
不可行性为 0 表明该解可行。
计算在解处的不可行性。
infeas = infeasibility(nlcons,sol)
infeas = 0
同样,不可行性为 0 表明该解可行。
计算
x
的范数,以确保它小于或等于 1。
nx = norm(sol.x)
nx = 1.0000
output
结构体提供有关求解过程的详细信息,例如迭代次数(24 次)、求解器 (fmincon
) 和函数计算次数(84 次)。有关这些统计量的详细信息,请参阅。
使用 fcn2optimexpr
的替代表示
对于更复杂的表达式,请为目标函数或约束函数编写函数文件,并使用 将其转换为优化表达式。例如,非线性约束函数的基础代码位于在 disk.m
文件中:
type disk
function radsqr = disk(x) radsqr = x(1)^2 x(2)^2;
将此函数文件转换为优化表达式。
radsqexpr = fcn2optimexpr(@disk,x);
此外,您还可以将在绘图例程开始时定义的 rosenbrock
函数句柄转换为优化表达式。
rosenexpr = fcn2optimexpr(rosenbrock,x);
使用这些转换后的优化表达式创建优化问题。
convprob = optimproblem('objective',rosenexpr,'constraints',radsqexpr <= 1);
查看新问题。
show(convprob)
optimizationproblem : solve for: x minimize : ((100 .* (x(2) - x(1).^2).^2) (1 - x(1)).^2) subject to : (x(1).^2 x(2).^2) <= 1
求解新问题。解与以前的解基本相同。
[sol,fval,exitflag,output] = solve(convprob,x0)
solving problem using fmincon. local minimum found that satisfies the constraints. optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
x: [0.7864 0.6177]
fval = 0.0457
exitflag = optimalsolution
output = struct with fields:
iterations: 24
funccount: 34
constrviolation: 0
stepsize: 6.9161e-06
algorithm: 'interior-point'
firstorderopt: 2.1625e-08
cgiterations: 4
message: 'local minimum found that satisfies the constraints....'
bestfeasible: [1x1 struct]
objectivederivative: "reverse-ad"
constraintderivative: "closed-form"
solver: 'fmincon'
有关支持的函数列表,请参阅。