main content

基于问题求解有约束非线性问题: -凯发k8网页登录

典型优化问题

此示例说明如何使用基于问题的方法来求解有约束非线性优化问题。该示例展示了典型的工作流:创建目标函数、创建约束、求解问题和检查结果。

注意:

如果目标函数或非线性约束不是由初等函数组成,则必须使用 将非线性函数转换为优化表达式。请参阅此示例的最后一部分,,或。

要了解如何通过基于求解器的方法处理此问题,请参阅使用优化实时编辑器任务或求解器的有约束非线性问题

问题表示:rosenbrock 函数

假设有以下在单位圆盘上最小化 rosenbrock 函数的问题

f(x)=100(x2-x12)2 (1-x1)2,

单位圆盘是以原点为圆心、半径为 1 的圆。也就是说,基于数据集 x12 x221,求使函数 f(x) 最小的 x。此问题是非线性约束下的非线性函数最小化问题。

rosenbrock 函数是优化中的标准测试函数。它在点 [1,1] 点达到唯一最小值 0。对于某些算法来说,求最小值是一个挑战,因为函数在深度弯曲的波谷中有一个浅最小值。此问题的解不在 [1,1] 点处,因为该点不满足约束。

以下图窗显示单位圆盘中 rosenbrock 函数的两个视图。垂直轴采用对数刻度;换句话说,绘图显示 log(1 f(x))。等高线位于曲面图下方。

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

figure contains 2 axes objects. axes object 1 contains 2 objects of type surface, contour. axes object 2 with title rosenbrock's function: two views contains 2 objects of type surface, contour.

rosenbrock 函数句柄一次在任意数量的二维点处计算 rosenbrock 函数。这种可加快函数的绘图速度,在用于加快在多个点的函数计算速度的其他环境中很有用。

函数 f(x) 称为目标函数。目标函数是您要进行最小化的函数。不等式 x12 x221 称为约束。约束限制求解器用于搜索最小值的 x 集。您可以使用任意数量的约束,约束可以是不等式,也可以是方程。

使用优化变量定义问题

基于问题的优化方法使用优化变量来定义目标和约束。使用这些变量创建表达式有两种方法:

  • 对于多项式或有理函数,直接使用变量编写表达式。

  • 对于其他类型的函数,使用 将函数转换为优化表达式。请参阅此示例末尾的使用 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。此问题需要一个初始点,它是给出优化变量初始值的结构体。创建初始点结构体 x0x 值为 [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'

有关支持的函数列表,请参阅。

相关主题

网站地图