主要内容

prob2struct

将优化问题或方程问题转化为求解形式

描述

使用prob2struct将优化问题或方程问题转化为求解形式。

例子

问题= prob2struct (概率返回一个适合于基于求解器的解决方案的优化问题结构。对于非线性问题,prob2struct为目标函数创建文件,如果需要,也为非线性约束函数和支持文件创建文件。金宝app

例子

问题= prob2struct (概率x0也转换了初始点结构x0并把它包含在问题

例子

问题= prob2struct (___名称,值,对于任何输入参数,使用一个或多个名称-值对参数指定其他选项。例如,对于一个非线性优化问题,问题= prob2struct(概率、“ObjectiveFunctionName”、“objfun1”)指定prob2struct创建名为objfun1.m在当前文件夹中。

例子

全部折叠

将优化问题对象转换为问题结构。

输入基本的MILP问题混合整数线性规划基础:基于问题

锭= optimvar (“锭”、4、1、“类型”“整数”下界的,0,“UpperBound”1);合金= optimvar (“合金”、4、1、下界的, 0);weightIngots =(5、3、4、6);costIngots = weightIngots。* [350330310280];costAlloys = [500450400100];成本=成本锭*锭+成本合金*合金;steelprob = optimproblem;steelprob。目标=成本;totalweight = weight gots*锭+ sum(合金);carbonIngots =(5、4、5、3)/ 100; molybIngots = [3,3,4,4,]/100; carbonAlloys = [8,7,6,3]/100; molybAlloys = [6,7,8,9]/100; totalCarbon = (weightIngots.*carbonIngots)*ingots + carbonAlloys*alloys; totalMolyb = (weightIngots.*molybIngots)*ingots + molybAlloys*alloys; steelprob.Constraints.conswt = totalweight == 25; steelprob.Constraints.conscarb = totalCarbon == 1.25; steelprob.Constraints.consmolyb = totalMolyb == 1.25;

把问题转化成intlinprog问题的结构。

问题= prob2struct (steelprob);

检查产生的线性等式约束矩阵和向量。

Aeq =问题。Aeq
Aeq =(1,1) 1.0000(2, 1) 0.0800(3,1) 0.0600(1、2)1.0000(2,2)0.0700(2)0.0700(1、3)1.0000(2、3)0.0600(3、3)0.0800(1、4)1.0000(2、4)0.0300(3,4)0.0900(1、5)5.0000(2、5)0.2500(3、5)0.1500(1,6)3.0000(2,6)0.1200(3、6)0.0900(7)4.0000(2、7)0.2000(3、7)0.1600 (8)6.0000 (2,8)0.1800 (3 8)0.2400
说真的= problem.beq
说真的=3×125.0000 1.2500 1.2500

检查范围。

problem.lb
ans =8×10 0 0 0 0 0 0
problem.ub
ans =8×1Inf Inf Inf Inf 1 1 1 1 1

通过打电话来解决问题intlinprog

x = intlinprog(问题)
LP:最佳目标值为8125.60万。切割生成:应用3个mir切割。下界是8495000000。相对差距为0.00%。找到最优解。Intlinprog在根节点停止,因为客观值在最优值options的间隙公差范围内。AbsoluteGapTolerance = 0(默认值)。intcon变量是在公差选项内的整数。IntegerTolerance = 1e-05(默认值)。
x =8×17.2500 0 0.2500 3.5000 1.0000 1.0000 0 1.0000

在基于问题的框架中创建一个非线性问题。

x = optimvar (“x”2);Fun = 100*(x(2) - x(1)²)²+ (1 - x(1))²;概率= optimproblem (“目标”、有趣的);Mycon = dot(x,x) <= 4;prob.Constraints.mycon = mycon;x0。x =[-1;1.5];

转换概率为优化问题结构。命名生成的目标函数文件“。”和约束函数文件“circle2”

问题= prob2struct (x0,概率“ObjectiveFunctionName”“。”...“ConstraintFunctionName”“circle2”);

prob2struct在当前文件夹中创建非线性目标和约束函数文件。要在不同的文件夹中创建这些文件,请使用“FileLocation”名称-值对。

解决这个问题。

[x, fval] = fmincon(问题)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
x =2×11.0000 - 1.0000
fval = 4.6187 e-11

输入参数

全部折叠

最优化问题或方程问题,指定为OptimizationProblem对象或一个EquationProblem对象。通过使用optimproblem;通过使用eqnproblem

警告

基于问题的方法不支持目标函数、非线性等式或非线性不等式中的复值。金宝app如果函数计算具有复值,即使是中间值,最终结果也可能是不正确的。

例子:概率= optimproblem;概率。目标= obj;prob.Constraints。cons1 = cons1;

例子:概率= eqnproblem;概率。公式=方程式;

初始点,指定为字段名等于中的变量名的结构概率

对于一些全局优化工具箱解决,x0可以是一个表示多个初始点的结构数组。这些解决方案是:

  • 遗传算法(全局优化工具箱)particleswarm(全局优化工具箱).这些求解器接受多个起始点作为初始总体的成员。

  • surrogateopt(全局优化工具箱).此求解器接受多个初始点,以帮助创建初始代理。

举个例子x0对于命名索引变量,请参见用命名索引变量创建优化初始点

例子:如果概率有变量命名xyx0。x =[3,2,17]; x0.y = [pi/3,2*pi/3]

数据类型:结构体

名称-值参数

指定可选的逗号分隔的对名称,值参数。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:问题= prob2struct(概率、“FileLocation”、“文件C: \ \ myproblem”)

表示对非线性约束函数使用自动微分(AD),指定为逗号分隔对组成“ConstraintDerivative”“汽车”(如果可能,请使用AD)“auto-forward”(如果可能,使用前向广告),自动翻转的(如果可能的话,使用反向AD),或者有限差分的(请勿使用AD)。选择包括汽车在满足约束函数支持的情况下,使生成的约束函数文件使用梯度信息来解决问题,如金宝app金宝app支持优化变量和表达式的操作.例如,请参见基于问题的工作流中的供应衍生品

请注意

在由。转换的问题中使用自动导数prob2struct,传递指定这些衍生品的选项。

选择= optimoptions (“fmincon”“SpecifyObjectiveGradient”,真的,...“SpecifyConstraintGradient”,真正的);问题。选择=选项;

例子:有限差分的

数据类型:字符|字符串

所创建的非线性约束函数文件的名称prob2struct对于优化问题,指定为逗号分隔的对,由“ConstraintFunctionName”和文件名。这个论点适用于fminconfminunc问题;看到问题.不包括文件扩展名.m在文件名中。prob2struct在创建文件时附加文件扩展名。

如果没有指定ConstraintFunctionName,然后prob2struct覆盖“generatedConstraints.m”.如果没有指定FileLocation,然后prob2struct在当前文件夹中创建文件。

返回的问题结构引用这个函数文件。

例子:“mynlcons”

数据类型:字符|字符串

所创建的非线性方程函数文件的名称prob2struct对于方程问题,指定为逗号分隔的对,由“EquationFunctionName”和文件名。这个论点适用于fsolvefzero,或lsqnonlin方程;看到问题.不包括文件扩展名.m在文件名中。prob2struct在创建文件时附加文件扩展名。

如果没有指定EquationFunctionName,然后prob2struct覆盖“generatedEquation.m”.如果没有指定FileLocation,然后prob2struct在当前文件夹中创建文件。

返回的问题结构引用这个函数文件。

例子:“myequation”

数据类型:字符|字符串

生成文件的位置(目标函数、约束函数和其他子函数文件),指定为逗号分隔对组成“FileLocation”以及可写文件夹的路径。所有生成的文件都存储在这个文件夹中;不支持多个文件夹。金宝app

例子:“文件C: \ MATLAB \ myproject的”

数据类型:字符|字符串

表示使用自动微分(AD)对非线性目标函数,指定为逗号分隔对组成“ObjectiveDerivative”“汽车”(如果可能,请使用AD)“auto-forward”(如果可能,使用前向广告),自动翻转的(如果可能的话,使用反向AD),或者有限差分的(请勿使用AD)。选择包括汽车在目标函数支持的情况下,使所得到的目标函数文件在解决问题时包含导数信息,如金宝app金宝app支持优化变量和表达式的操作.例如,请参见基于问题的工作流中的供应衍生品

请注意

在由。转换的问题中使用自动导数prob2struct,传递指定这些衍生品的选项。

选择= optimoptions (“fmincon”“SpecifyObjectiveGradient”,真的,...“SpecifyConstraintGradient”,真正的);问题。选择=选项;

例子:有限差分的

数据类型:字符|字符串

所创建的目标函数文件的名称prob2struct对于优化问题,指定为逗号分隔的对,由“ObjectiveFunctionName”和文件名。这个论点适用于fminconfminunc问题;看到问题.不包括文件扩展名.m在文件名中。prob2struct在创建文件时附加文件扩展名。

如果没有指定ObjectiveFunctionName,然后prob2struct覆盖“generatedObjective.m”.如果没有指定FileLocation,然后prob2struct在当前文件夹中创建文件。

返回的问题结构引用这个函数文件。

例子:“myobj”

数据类型:字符|字符串

优化求解器,指定为列出的求解器的名称。对于优化问题,此表包含每种问题类型的可用求解器,包括来自全局优化工具箱.方程问题的细节出现在优化求解器的细节下面。

用于转换具有整数约束的非线性问题prob2struct,得到的问题结构可以取决于选择的求解器。如果你没有全局优化工具箱许可证,您必须指定求解器。看到基于非线性问题优化中的整数约束

这里列出了每种优化问题类型的默认解算器。

问题类型 默认的解算器
线性规划(LP) linprog
混合整数线性规划(MILP) intlinprog
二次规划(QP) quadprog
二阶锥规划(SOCP) coneprog
线性最小二乘 lsqlin
非线性最小二乘 lsqnonlin
非线性规划(NLP)

fminunc对于没有约束的问题,否则fmincon

混合整数非线性规划(MINLP) 遗传算法(全局优化工具箱)

在这个表中,是的表示解决程序可用于问题类型,x表示解算器不可用。

问题类型

LP MILP QP 二次 线性最小二乘 非线性最小二乘 NLP 适应
解算器
linprog

是的

x x x x x x x
intlinprog

是的

是的

x x x x x x
quadprog

是的

x

是的

是的

是的

x x x
coneprog

是的

x x

是的

x x x x
lsqlin x x x x

是的

x x x
lsqnonneg x x x x

是的

x x x
lsqnonlin x x x x

是的

是的

x x
fminunc

是的

x

是的

x

是的

是的

是的

x
fmincon

是的

x

是的

是的

是的

是的

是的

x
patternsearch(全局优化工具箱)

是的

x

是的

是的

是的

是的

是的

x
遗传算法(全局优化工具箱)

是的

是的

是的

是的

是的

是的

是的

是的

particleswarm(全局优化工具箱)

是的

x

是的

x

是的

是的

是的

x
simulannealbnd(全局优化工具箱)

是的

x

是的

x

是的

是的

是的

x
surrogateopt(全局优化工具箱)

是的

是的

是的

是的

是的

是的

是的

是的

请注意

如果你选择lsqcurvefit作为最小二乘问题的求解者,解决使用lsqnonlin.的lsqcurvefitlsqnonlin求解器是相同的解决

谨慎

对于最大化问题(概率。ObjectiveSense“马克斯”“最大化”),不要指定最小二乘求解器(以名称开头的求解器)lsq).如果你这样做,解决抛出错误,因为这些求解器不能最大化。

对于方程求解,此表包含每种问题类型的可用求解器。在表中,

  • 指示问题类型的默认解决程序。

  • Y表示可用的求解器。

  • N表示求解器不可用。

金宝app支持求解方程

方程类型 lsqlin lsqnonneg fzero fsolve lsqnonlin
线性 N Y(标量) Y Y
线性和范围 Y N N Y
标量非线性 N N Y Y
非线性系统 N N N Y
非线性系统加边界 N N N N

例子:“intlinprog”

数据类型:字符|字符串

输出参数

全部折叠

问题结构,返回为fmincon问题结构,fminunc问题结构,fsolve问题结构,intlinprog问题结构,linprog问题结构,lsqlin问题结构,lsqnonlin问题结构,quadprog问题结构,或者遗传算法问题(全局优化工具箱)结构。

下表给出了优化问题的默认问题类型。您还可以获取非默认的问题类型。例如,对于非线性有界约束的问题,您可以选择大多数全局优化工具箱通过使用解算器论点。

优化目标及约束类型(线性约束包括边界)

产生的问题类型

线性目标和约束函数。

至少有一个问题变量具有“整数”类型。

intlinprog

线性目标和约束函数。

没有问题变量有“整数”类型。

linprog

线性约束功能。

目标函数是一个常数加上线性表达式的平方和。

lsqlin

绑定约束。

目标函数是一个常数加上一般非线性表达式的平方和。

lsqnonlin

线性约束功能。

一般二次目标函数。

quadprog

一般非线性目标函数。

没有约束。

fminunc

一般非线性目标函数,且任意类型约束至少有一个。

或者,至少有一个一般的非线性约束函数。

fmincon

非线性目标函数或约束函数,且至少存在一个整数变量。

遗传算法

下表给出了求解方程的问题类型。

方程类型

产生的问题类型

有或无边界的线性系统

lsqlin

标量(单)非线性方程

fzero

无约束非线性系统

fsolve

有界非线性系统

lsqnonlin

请注意

对于非线性问题,prob2struct为目标和非线性约束函数创建函数文件。对于调用支持函数的目标函数和约束函数,金宝appprob2struct也创建支持函数文件并将它们金宝app存储在FileLocation文件夹中。要访问生成函数中的额外参数,请参见获取生成功能详细信息

对于线性和二次优化问题,问题结构包括一个额外的领域,f0,表示目标函数的可加常数。如果使用指定的求解器解决问题结构,则返回的目标函数值不包括f0价值。如果你解决概率使用解决函数时,返回的目标函数值包括f0价值。

如果ObjectiveSense概率“马克斯”“最大化”,然后问题在中使用目标函数的负数概率因为解决最小化。为了最大化,他们将原始目标函数的负值最小化。在这种情况下,从求解器报告的最优函数值是原始问题中值的负数。看到最大化客观.你不能使用lsqlin对于一个最大化问题。

提示

  • 如果你叫prob2struct在同一个MATLAB中多次®对于非线性问题,使用ObjectiveFunctionNameEquationFunctionName参数,如果合适,则为ConstraintFunctionName论点。指定唯一的名称可以确保产生的问题结构引用正确的目标和约束函数。否则,后续调用prob2struct可能导致生成的非线性函数文件覆盖现有文件。

  • 为了避免造成无限递归,不要调用prob2struct在目标函数或约束函数内部。

  • 当调用prob2struct同时,对于非线性问题,确保得到的目标函数和约束函数文件具有唯一的名称。这样做可以避免每次循环都写相同的文件。

算法

全部折叠

转换到求解器形式

问题结构的基础是将所有问题变量隐式排序成单个向量。问题变量的顺序和变量财产概率.看到OptimizationProblem.你也可以通过使用varindex

例如,假设问题变量的顺序如下:

  • x-一个3 × 2 × 4的数组

  • y-一个3乘2的数组

在这种情况下,隐式变量的顺序与问题变量的顺序相同var = [x (:); y (:))

的前24个元素var相当于x (:),接下来的6个元素等价于y (:),总共有30个元素。下界和上界对应于这个变量排序,每个线性约束矩阵有30列。

对于一般非线性目标或约束函数的问题,prob2struct在当前文件夹或指定的文件夹中创建函数文件FileLocation.返回的问题结构指的是这些函数文件。

自动分化

自动分化(AD)适用于解决prob2struct以下条件下的功能:

  • 支持目标函数和约束函数,如金宝app金宝app支持优化变量和表达式的操作.它们不需要使用fcn2optimexpr函数。

  • 求解器调用解决fminconfminuncfsolve,或lsqnonlin

  • 对于优化问题,“ObjectiveDerivative”“ConstraintDerivative”的名称-值对参数解决prob2struct“汽车”(默认),“auto-forward”,或自动翻转的

  • 对于方程问题,“EquationDerivative”选项设置为“汽车”(默认),“auto-forward”,或自动翻转的

当广告应用 支持的所有约束函数金宝app 不支持一个或多个约束金宝app
目标函数的支持金宝app AD用于表示目标和约束条件 AD仅用于客观目的
不支持目标函数金宝app AD仅用于约束 广告不习惯

当这些条件不满足时,解决通过有限差分估计梯度prob2struct不会在其生成的函数文件中创建梯度。

求解器默认选择以下类型的AD:

  • 对于一般的非线性目标函数,fmincon默认为目标函数反向AD。fmincon当非线性约束的数量小于变量的数量时,默认对非线性约束函数反向AD。否则,fmincon默认为非线性约束函数转发AD。

  • 对于一般的非线性目标函数,fminunc默认为反向AD。

  • 对于最小二乘目标函数,fminconfminunc默认为目标函数转发AD。关于基于问题的最小二乘目标函数的定义,见编写基于问题的最小二乘的目标函数

  • lsqnonlin当目标向量中的元素数量大于或等于变量数量时,默认转发AD。否则,lsqnonlin默认为反向AD。

  • fsolve当方程的数量大于或等于变量的数量时,默认转发AD。否则,fsolve默认为反向AD。

请注意

在由。转换的问题中使用自动导数prob2struct,传递指定这些衍生品的选项。

选择= optimoptions (“fmincon”“SpecifyObjectiveGradient”,真的,...“SpecifyConstraintGradient”,真正的);问题。选择=选项;

目前,AD仅适用于一阶衍生物;它不适用于二阶或更高阶导数。例如,如果你想使用分析Hessian来加速你的优化,你不能使用解决直接使用,而必须使用基于问题的工作流中的供应衍生品

兼容性的考虑

全部展开

错误开始在R2021a

介绍了R2017b