主要内容

prob2struct

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

描述

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

提示

有关完整的工作流程,请参见基于问题的优化工作流求解方程的基于问题的工作流程

例子

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

例子

问题= prob2struct (概率x0还转换初始点结构x0并将其包括在问题

例子

问题= prob2struct (___名称,值,对于任何输入参数,使用一个或多个名-值对参数指定额外的选项。例如,对于一个非线性优化问题,problem = prob2struct(prob,' objecvefunctionname ','objfun1')指定prob2struct创建一个名为objfun1.m在当前文件夹中。

例子

全部折叠

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

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

Ingots = optimvar(“锭”、4、1、“类型”“整数”下界的0,“UpperBound”1);合金= optimvar(“合金”、4、1、下界的, 0);weightIngots = [5,3,4,6];成本锭=重量锭。*[350,330,310,280];costalloy = [500,450,400,100];成本=成本锭*锭+成本合金*合金;Steelprob =优化问题;steelprob。目标=成本;总重量=重量*锭数+总和(合金);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问题的结构。

Problem = 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
Beq = problem.beq
说真的=3×125.0000 1.2500 1.2500

检查边界。

problem.lb
ans =8×10 0 0 0 0 0 0
problem.ub
ans =8×1无穷无穷无穷无穷1 1 1 1

打电话解决问题intlinprog

X = intlinprog(问题)
LP:最优目标值为8125.600000。切割生成:应用3 mir切割。下界为8495.000000。相对差距为0.00%。找到最优解。Intlinprog停止在根节点,因为目标值在最佳值的间隙公差范围内,选项。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);趣味= 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;问题=优化问题(“目标”、有趣的);Mycon = dot(x,x) <= 4;probo . 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.6241e-11

输入参数

全部折叠

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

警告

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

例子:Prob =优化问题;概率。目标= obj;prob.Constraints。con1 = con1;

例子:Prob = eqnproblem;概率。方程= eqs;

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

对于一些全局优化工具箱解决,x0可以是向量OptimizationValues表示多个初始点的对象。属性创建点optimvalues函数。这些解算器是:

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

  • MultiStart(全局优化工具箱).这个解算器接受局部解算器的多个初始点,例如fmincon

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

例如,使用x0使用命名索引变量,请参见用命名索引变量创建优化的初始点

例子:如果概率具有命名为x而且yx0。x =[3,2,17]; x0.y = [pi/3,2*pi/3]

数据类型:结构体

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:problem = prob2struct(prob,'FileLocation','C:\Documents\myproblem')

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

请注意

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

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

例子:有限差分的

数据类型:字符|字符串

创建的非线性约束函数文件的名称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),或有限差分的(请勿使用AD)。选择包括汽车在解决问题时,如果目标函数得到支持,则使得到的目标函数文件包含导数信息,如金宝app金宝app优化变量和表达式的支持操作.有关示例,请参见基于问题的工作流程中的供给导数

请注意

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

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

例子:有限差分的

数据类型:字符|字符串

创建的目标函数文件的名称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) 遗传算法(全局优化工具箱)
多目标 gamultiobj(全局优化工具箱)

在这个表格中,是的表示求解器可用于该问题类型,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(全局优化工具箱)

是的

是的

是的

是的

是的

是的

是的

是的

gamultiobj(全局优化工具箱)

是的

是的

是的

是的

是的

是的

是的

是的

paretosearch(全局优化工具箱)

是的

x

是的

是的

是的

是的

是的

x

请注意

如果你愿意lsqcurvefit作为最小二乘问题的解算器,解决使用lsqnonlin.的lsqcurvefit而且lsqnonlin求解器是相同的解决

谨慎

对于最大化问题(概率。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数组

在这种情况下,隐式变量顺序与问题变量相同Vars = [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”,或自动翻转的

AD何时生效 支持所有约束函数金宝app 不支持一个或多个约束金宝app
目标功能支持金宝app AD用于目标和约束 AD仅用于客观
不支持的目标函数金宝app AD仅用于约束 未使用AD

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

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

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

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

  • 对于最小二乘目标函数,fmincon而且fminunc对于目标函数,默认为转发AD。有关基于问题的最小二乘目标函数的定义,请参见为基于问题的最小二乘写目标函数

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

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

请注意

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

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

目前,AD仅适用于一阶导数;它不适用于二阶或更高阶导数。因此,例如,如果您想使用分析黑森来加速优化,则不能使用解决中所描述的方法基于问题的工作流程中的供给导数

版本历史

在R2017b中引入

全部展开