主要内容

createOptimProblem

创建优化问题结构体

说明

problem = createOptimProblem(solverName)solverName 求解器创建一个空的优化问题结构体。

problem = createOptimProblem(solverName,Name,Value) 使用一个或多个名称-值参量指定其他选项。

示例

示例

全部折叠

使用以下设定创建一个问题结构体:

  • fmincon 求解器

  • "interior-point" 算法

  • 随机二维初始点 x0

  • 罗森布罗克函数作为目标

  • 下界为 -2

  • 上界为 2

适用于二维变量 x 的罗森布罗克函数是 f(x)=100(x2-x12)2+(1-x1)2(有关详细信息,请参阅使用优化实时编辑器任务或求解器的有约束非线性问题)。要指定 "interior-point" 算法,请使用 optimoptions 创建选项。

anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
opts = optimoptions(@fmincon,Algorithm="interior-point");
rng default % For reproducibility
problem = createOptimProblem("fmincon",...
    x0=randn(2,1),...
    objective=anonrosen,...
    lb=[-2;-2],...
    ub=[2;2],...
    options=opts);

通过调用 fminconproblem.x0 开始求解问题。

[x,fval] = fmincon(problem)
Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.

<stopping criteria details>
x = 2×1

    1.0000
    1.0000

fval = 
2.0603e-11

通过调用 GlobalSearch 寻找更优解。

gs = GlobalSearch;
[x2,fval2] = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points.

All 16 local solver runs converged with a positive local solver exit flag.
x2 = 2×1

    1.0000
    1.0000

fval2 = 
2.1093e-11

在本例中,fminconGlobalSearch 得到相同的解。

输入参数

全部折叠

优化求解器,指定为以下项之一。

  • 对于 GlobalSearch,指定 "fmincon"@fmincon

  • 对于 MultiStart,请指定 "fmincon"@fmincon"fminunc"@fminunc"lsqnonlin"@lsqnonlin 或者 "lsqcurvefit"@lsqcurvefit

示例: "fmincon"

数据类型: char | string | function_handle

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: createOptimProblem("fmincon","x0",x0,"objective",fun,"lb",zeros(size(x0)))

线性等式约束,指定为实矩阵。AeqMe×nvars 矩阵,其中 Me 是等式的数目。

Aeq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)beq 是具有 Me 个元素的列向量。

例如,要指定

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

提供以下约束:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定控制项变量总和为 1,请给出约束 Aeq = ones(1,N)beq = 1

数据类型: double

线性不等式约束,指定为实矩阵。AineqM×nvars 矩阵,其中 M 是不等式的数目。

Aineq 以如下形式编写 M 个线性不等式

Aineq*x <= bineq,

其中,x 是由 nvars 个变量组成的列向量 x(:)bineq 是具有 M 个元素的列向量。

例如,要指定

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

提供以下约束:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

示例: 要指定控制项变量总和等于或小于 1,请给出约束 Aineq = ones(1,N)bineq = 1

数据类型: double

线性等式约束,指定为实数向量。beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。如果将 beq 作为行向量传递,求解器会在内部将 beq 转换为列向量 beq(:)

beq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)Aeq 是大小为 Meq×N 的矩阵。

例如,要指定

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

提供以下约束:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定控制项变量总和为 1,请给出约束 Aeq = ones(1,N)beq = 1

数据类型: double

线性不等式约束,指定为实数向量。bineq 是与 Aineq 矩阵相关的包含 M 个元素的向量。如果将 bineq 作为行向量传递,求解器会在内部将 bineq 转换为列向量 bineq(:)

bineq 以如下形式编写 M 个线性不等式

Aineq*x <= bineq,

其中,x 是由 N 个变量组成的列向量 x(:)Aineq 是大小为 M×N 的矩阵。

例如,要指定

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

提供以下约束:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

示例: 要指定控制项变量总和等于或小于 1,请给出约束 Aineq = ones(1,N)bineq = 1

数据类型: double

下界,指定为实数向量或双精度数组。lb 表示 lb x ub 中元素的下界。

createOptimProblem 在内部将数组 lb 转换为向量 lb(:)

示例: lb = [0;-Inf;4] 表示 x(1) ≥ 0x(3) ≥ 4

数据类型: double

非线性约束,指定为函数句柄或函数名称。nonlcon 函数接受数组 x,并返回两个数组 c(x)ceq(x)

  • c(x) 是由 x 处的非线性不等式约束组成的数组。对于 c 的所有条目,求解器尝试满足 c(x) <= 0

  • ceq(x) 是由 x 处的非线性等式约束组成的数组。对于 ceq 的所有条目,求解器尝试满足 ceq(x) = 0

例如,nonlcon 是一个 MATLAB® 函数,如下所示:

function [c,ceq] = nonlcon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

有关详细信息,请参阅非线性约束

数据类型: char | string | function_handle

目标函数,指定为函数句柄或函数名称。

  • 对于除 lsqnonlinlsqcurvefit 之外的所有求解器,目标函数必须接受数组 x 并返回标量。如果 SpecifyObjectiveGradient 选项为 true,则目标函数必须返回第二个输出,即表示目标梯度的向量。有关详细信息,请参阅 fun

  • 对于 lsqnonlin,目标函数必须接受向量 x 并返回一个向量。如果 SpecifyObjectiveGradient 选项为 true,则目标函数必须返回第二个输出,即表示目标的雅可比矩阵。有关详细信息,请参阅 fun

  • 对于 lsqcurvefit,目标函数必须接受两个输入(即 xxdata),并返回一个向量。如果 SpecifyObjectiveGradient 选项为 true,则目标函数必须返回第二个输出,即表示目标的雅可比矩阵。有关详细信息,请参阅 fun

示例: @sin

示例: "sin"

数据类型: char | string | function_handle

优化选项,指定为 optimoptions 的输出。

示例: optimoptions("fmincon","SpecifyObjectiveGradient",true)

上界,指定为实数向量或双精度数组。ub 表示 lb x ub 中元素的上界。

createOptimProblem 在内部将数组 ub 转换为向量 ub(:)

示例: ub = [Inf;4;10] 表示 x(2) ≤ 4x(3) ≤ 10

数据类型: double

初始点,指定为实数向量或实数数组。求解器使用 x0 中的元素数量和 x0 的大小来确定 fun 接受的变量数量和大小。

示例: x0 = [1,2,3,4]

数据类型: double

模型的输入数据,指定为实数向量或实数数组。模型是

ydata = fun(x,xdata),

其中,xdataydata 是固定数组,xlsqcurvefit 寻求最小平方和时要更改的参数所组成的数组。

示例: xdata = [1,2,3,4]

数据类型: double

模型的响应数据,指定为实数向量或实数数组。模型是

ydata = fun(x,xdata),

其中,xdataydata 是固定数组,xlsqcurvefit 寻求最小平方和时要更改的参数所组成的数组。

ydata 数组的大小和形状必须与 fun(x0,xdata) 数组相同。

示例: ydata = [1,2,3,4]

数据类型: double

输出参量

全部折叠

优化问题,以结构体形式返回。使用 problem 作为 run 的第二个输入参量,如以下示例所示:

x = run(gs,problem)
x = run(ms,problem,k)

您也可以通过对问题调用指定求解器来求解问题。例如,如果 problem 是为 fmincon 创建的,请输入

x = fmincon(problem)

版本历史记录

在 R2010a 中推出