标量目标函数的编写gydF4y2Ba
函数文件gydF4y2Ba
例如,标量目标函数文件接受一个输入gydF4y2BaxgydF4y2Ba
,并返回一个实标量输出gydF4y2BafgydF4y2Ba
.输入gydF4y2BaxgydF4y2Ba
可以是标量、向量或gydF4y2Ba矩阵gydF4y2Ba.函数文件可以返回更多的输出(参见gydF4y2Ba包括梯度和黑森gydF4y2Ba).gydF4y2Ba
例如,假设你的目标是三个变量的函数,gydF4y2BaxgydF4y2Ba,gydF4y2BaygydF4y2Ba,gydF4y2BazgydF4y2Ba:gydF4y2Ba
fgydF4y2Ba(gydF4y2BaxgydF4y2Ba) = 3*(gydF4y2BaxgydF4y2Ba- - - - - -gydF4y2BaygydF4y2Ba)gydF4y2Ba4gydF4y2Ba+ 4 * (gydF4y2BaxgydF4y2Ba+gydF4y2BazgydF4y2Ba)gydF4y2Ba2gydF4y2Ba/ (1 +gydF4y2BaxgydF4y2Ba2gydF4y2Ba+gydF4y2BaygydF4y2Ba2gydF4y2Ba+gydF4y2BazgydF4y2Ba2gydF4y2Ba) + cosh(gydF4y2BaxgydF4y2Ba- 1) + tanh(gydF4y2BaygydF4y2Ba+gydF4y2BazgydF4y2Ba).gydF4y2Ba
将这个函数编写为一个接受向量的文件gydF4y2Ba
鑫gydF4y2Ba
= (gydF4y2BaxgydF4y2Ba;gydF4y2BaygydF4y2Ba;gydF4y2BazgydF4y2Ba]并返回gydF4y2BafgydF4y2Ba:gydF4y2Ba函数f = myObjective(鑫)f = 3 *(鑫(1)新(2))^ 4 + 4 *(鑫(1)+鑫(3))^ 2 /(1 +规范(鑫)^ 2)……+ cosh(xin(1)-1) + tanh(xin(2)+xin(3));gydF4y2Ba
另存为一个名为gydF4y2Ba
myObjective.mgydF4y2Ba
到MATLAB中的一个文件夹中gydF4y2Ba®gydF4y2Ba路径。gydF4y2Ba检查函数的计算是否正确:gydF4y2Ba
myObjective([1;2;3]) ans = 9.2666gydF4y2Ba
有关如何包含额外参数的信息,请参见gydF4y2Ba传递额外参数gydF4y2Ba.有关函数文件的更复杂示例,请参见gydF4y2Ba梯度最小化与黑森稀疏模式gydF4y2Ba或gydF4y2Ba带约束和带预处理最小化gydF4y2Ba.gydF4y2Ba
局部函数和嵌套函数gydF4y2Ba
函数可以存在于其他文件中,如gydF4y2Ba本地函数gydF4y2Ba或gydF4y2Ba嵌套函数gydF4y2Ba.使用本地函数或嵌套函数可以减少保存的不同文件的数量。使用嵌套函数还允许访问额外的参数,如gydF4y2Ba嵌套函数gydF4y2Ba.gydF4y2Ba
例如,假设你想要最小化gydF4y2BamyObjective.mgydF4y2Ba
目标函数,描述于gydF4y2Ba函数文件gydF4y2Ba,但须符合gydF4y2Baellipseparabola.mgydF4y2Ba
约束,描述在gydF4y2Ba非线性约束gydF4y2Ba.不用写两个文件,gydF4y2BamyObjective.mgydF4y2Ba
而且gydF4y2Baellipseparabola.mgydF4y2Ba
,写一个包含这两个函数的文件作为本地函数:gydF4y2Ba
function [x fval] = callObjConstr(x0,options) %如果nargin < 2 options = optimoptions('fmincon','Algorithm',' internal -point');结束[x fval] = fmincon (x0 @myObjective ,[],[],[],[],[],[], ...@ellipseparabola选项);函数f = myObjective(鑫)f = 3 *(鑫(1)新(2))^ 4 + 4 *(鑫(1)+鑫(3))^ 2 /(1 +总和(鑫^ 2))…+ cosh(xin(1)-1) + tanh(xin(2)+xin(3));功能测查[c] = ellipseparabola c (1) (x) = (x (1) ^ 2) / 9 + (x (2) ^ 2) / 4 - 1;C (2) = x(1)^2 - x(2) - 1;Ceq = [];gydF4y2Ba
从这一点开始求解约束最小化问题gydF4y2Ba(1, 1, 1)gydF4y2Ba
:gydF4y2Ba
[x fval] = callObjConstr(ones(3,1))找到满足约束的局部最小值。优化完成是因为目标函数在可行方向上不递减,到函数容差默认值以内,约束条件满足到约束容差默认值以内。X = 1.1835 0.8345 -1.6439 fval = 0.5383gydF4y2Ba
匿名函数目标gydF4y2Ba
使用匿名函数来编写简单的目标函数。有关匿名函数的详细信息,请参见gydF4y2Ba什么是匿名函数?gydF4y2Ba.gydF4y2BaRosenbrock函数很简单,可以写成匿名函数:gydF4y2Ba
anonrosen = @ (x) (100 * (x (2) - (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2);gydF4y2Ba
anonrosengydF4y2Ba
正确地计算为gydF4y2Ba(1 2)gydF4y2Ba
:gydF4y2BaAnonrosen ([-1 2]) ans = 104gydF4y2Ba
anonrosengydF4y2Ba
与gydF4y2BafminuncgydF4y2Ba
产生以下结果:gydF4y2Baoptions = optimoptions(@fminunc,'算法','准牛顿');[x fval] = fminunc(anonrosen,[-1;2],options)找到局部最小值。优化完成,因为梯度的大小小于函数的默认值公差。X = 1.0000 fval = 1.2266e-10gydF4y2Ba
包括梯度和黑森gydF4y2Ba
为求解者提供导数gydF4y2Ba
为gydF4y2BafmincongydF4y2Ba
而且gydF4y2BafminuncgydF4y2Ba
,可以在目标函数中包含梯度。一般来说,解算器更健壮,当你包含梯度时可以稍微快一点。看到gydF4y2Ba包含衍生品的好处gydF4y2Ba.也包括二阶导数(黑森),请参见gydF4y2Ba包括麻布gydF4y2Ba.gydF4y2Ba
下表显示了哪些算法可以使用梯度和黑森。gydF4y2Ba
解算器gydF4y2Ba | 算法gydF4y2Ba | 梯度gydF4y2Ba | 黑森gydF4y2Ba |
---|---|---|---|
fmincongydF4y2Ba |
有效集gydF4y2Ba |
可选gydF4y2Ba | 没有gydF4y2Ba |
内点gydF4y2Ba |
可选gydF4y2Ba | 可选(见gydF4y2BaHessian for fmincon内点算法gydF4y2Ba)gydF4y2Ba | |
sqpgydF4y2Ba |
可选gydF4y2Ba | 没有gydF4y2Ba | |
trust-region-reflectivegydF4y2Ba |
要求gydF4y2Ba | 可选(见gydF4y2BaHessian for fminunc信任区域或fmincon信任区域反射算法gydF4y2Ba)gydF4y2Ba | |
fminuncgydF4y2Ba |
拟牛顿gydF4y2Ba |
可选gydF4y2Ba | 没有gydF4y2Ba |
信赖域gydF4y2Ba |
要求gydF4y2Ba | 可选(见gydF4y2BaHessian for fminunc信任区域或fmincon信任区域反射算法gydF4y2Ba)gydF4y2Ba |
如何包含渐变gydF4y2Ba
编写代码返回:gydF4y2Ba
目标函数(标量)作为第一个输出gydF4y2Ba
梯度(向量)作为第二个输出gydF4y2Ba
设置gydF4y2Ba
SpecifyObjectiveGradientgydF4y2Ba
选项gydF4y2Ba真正的gydF4y2Ba
使用gydF4y2BaoptimoptionsgydF4y2Ba
.如果合适,还可以设置gydF4y2BaSpecifyConstraintGradientgydF4y2Ba
选项gydF4y2Ba真正的gydF4y2Ba
.gydF4y2Ba可选地,检查你的梯度函数是否匹配有限差分近似。看到gydF4y2Ba检验梯度或雅可比矩阵的有效性gydF4y2Ba.gydF4y2Ba
提示gydF4y2Ba
为了获得最大的灵活性,写gydF4y2Ba条件化gydF4y2Ba代码。条件化意味着函数输出的数量可以变化,如下例所示。属性的值不会导致条件化代码错误gydF4y2BaSpecifyObjectiveGradientgydF4y2Ba
选择。无条件代码要求您适当地设置选项。gydF4y2Ba
描述和绘制在哪里gydF4y2Ba使用优化实时编辑器任务或求解器的约束非线性问题gydF4y2Ba.的梯度gydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba)gydF4y2Ba是gydF4y2Ba
rosentwogydF4y2Ba
是一个条件函数,返回求解器需要的任何东西:gydF4y2Ba
函数[f,g] = rosentwo(x) %计算目标f f = 100*(x(2) -x(1)²)²+ (1-x(1))²;如果nargout > 1%梯度需要g = (-400 * (x (2) - x (1) ^ 2) * x (1) 2 * (1 - x (1));200 * (x (2) - x (1) ^ 2)];结束gydF4y2Ba
nargoutgydF4y2Ba
检查调用函数指定的参数数量。看到gydF4y2Ba找到函数参数的个数gydF4y2Ba.gydF4y2Ba
的gydF4y2BafminuncgydF4y2Ba
求解器,设计为无约束优化,允许您最小化Rosenbrock的函数。告诉gydF4y2BafminuncgydF4y2Ba
通过设置来使用渐变和黑森gydF4y2Ba选项gydF4y2Ba
:gydF4y2Ba
options = optimoptions(@fminunc,'Algorithm','trust-region',…“SpecifyObjectiveGradient”,真正的);gydF4y2Ba
运行gydF4y2BafminuncgydF4y2Ba
从gydF4y2Ba[1, 2]gydF4y2Ba
:gydF4y2Ba
[x fval] = fminunc(@rosentwo,[-1;2],options)找到局部最小值。优化完成,因为梯度的大小小于函数的默认值公差。X = 1.0000 fval = 1.9886e-17gydF4y2Ba
如果您拥有Symbolic Math Toolbox™许可证,则可以自动计算梯度和黑森,如中所述gydF4y2Ba计算梯度和黑森使用符号数学工具箱gydF4y2Ba.gydF4y2Ba
包括麻布gydF4y2Ba
你可以用二阶导数gydF4y2BafmincongydF4y2Ba
“trust-region-reflective”gydF4y2Ba
而且gydF4y2Ba“内点”gydF4y2Ba
算法,并与gydF4y2BafminuncgydF4y2Ba
“信赖域”gydF4y2Ba
算法。有几种方法可以包含黑森信息,这取决于信息的类型和算法。gydF4y2Ba
您还必须包括渐变(setgydF4y2BaSpecifyObjectiveGradientgydF4y2Ba
来gydF4y2Ba真正的gydF4y2Ba
如果适用,gydF4y2BaSpecifyConstraintGradientgydF4y2Ba
来gydF4y2Ba真正的gydF4y2Ba
),以便包括黑森人。gydF4y2Ba
海赛的gydF4y2BafminuncgydF4y2Ba
信赖域或gydF4y2BafmincongydF4y2Ba
trust-region-reflective算法。gydF4y2Ba这些算法要么没有约束,要么只有约束或线性等式约束。因此,黑森矩阵是目标函数的二阶导数矩阵。gydF4y2Ba
将Hessian矩阵作为目标函数的第三个输出。例如,黑森人gydF4y2BaHgydF4y2Ba(gydF4y2BaxgydF4y2Ba)gydF4y2BaRosenbrock函数的值为(见gydF4y2Ba如何包含渐变gydF4y2Ba)gydF4y2Ba
包括这个黑森目标:gydF4y2Ba
函数gydF4y2Ba[f, g, H] = rosenboth(x)gydF4y2Ba计算目标fgydF4y2BaF = 100*(x(2) -x(1)²)²+ (1-x(1))²;gydF4y2Ba如果gydF4y2BaNargout > 1gydF4y2Ba所需梯度百分比gydF4y2BaG = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));200 * (x (2) - x (1) ^ 2)];gydF4y2Ba如果gydF4y2BaNargout > 2gydF4y2Ba%黑森必需gydF4y2BaH = [1200*x(1)^2-400*x(2)+2, -400*x(1);-400 * x (1), 200);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba
集gydF4y2BaHessianFcngydF4y2Ba
来gydF4y2Ba“目标”gydF4y2Ba
.例如,gydF4y2Ba
选项= optimoptions(gydF4y2Ba“fminunc”gydF4y2Ba,gydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“信赖域”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“SpecifyObjectiveGradient”gydF4y2Ba,真的,gydF4y2Ba“HessianFcn”gydF4y2Ba,gydF4y2Ba“目标”gydF4y2Ba);gydF4y2Ba
海赛的gydF4y2BafmincongydF4y2Ba
内点算法gydF4y2Ba.gydF4y2Ba黑森是拉格朗日量的黑森,拉格朗日量gydF4y2BalgydF4y2Ba(gydF4y2BaxgydF4y2Ba,gydF4y2BaλgydF4y2Ba)是gydF4y2Ba
ggydF4y2Ba而且gydF4y2BahgydF4y2Ba向量函数是否分别表示所有不等式约束和等式约束(意味着约束、线性和非线性约束),那么最小化问题是什么gydF4y2Ba
详细信息请参见gydF4y2Ba约束最优理论gydF4y2Ba.拉格朗日的黑森量是gydF4y2Ba
(1)gydF4y2Ba |
要包含Hessian,请使用该语法编写函数gydF4y2Ba
Hessian = hessianfcn(x,lambda)gydF4y2Ba
黑森gydF4y2Ba
是一个gydF4y2BangydF4y2Ba——- - - - - -gydF4y2BangydF4y2Ba矩阵,稀疏或密集,其中gydF4y2BangydF4y2Ba是变量的数量。如果gydF4y2Ba黑森gydF4y2Ba
是大的,有相对较少的非零项,节省运行时间和内存表示gydF4y2Ba黑森gydF4y2Ba
作为一个稀疏矩阵。gydF4y2BaλgydF4y2Ba
为具有与非线性约束相关的拉格朗日乘子向量的结构:gydF4y2Ba
λ。我neqnonlin lambda.eqnonlin
fmincongydF4y2Ba
计算结构gydF4y2BaλgydF4y2Ba
并将它传递给你的黑森函数。gydF4y2BahessianfcngydF4y2Ba
必须计算的总和在gydF4y2Ba方程1gydF4y2Ba.通过设置这些选项表明您正在提供黑森:gydF4y2Ba
选项= optimoptions(gydF4y2Ba“fmincon”gydF4y2Ba,gydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“内点”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“SpecifyObjectiveGradient”gydF4y2Ba,真的,gydF4y2Ba“SpecifyConstraintGradient”gydF4y2Ba,真的,gydF4y2Ba...gydF4y2Ba“HessianFcn”gydF4y2Ba, @hessianfcn);gydF4y2Ba
例如,要包含一个用于Rosenbrock函数的Hessian约束到单位圆盘上gydF4y2Ba ,注意约束函数gydF4y2Ba 有梯度和二阶导数矩阵吗gydF4y2Ba
写出黑森函数为gydF4y2Ba
函数gydF4y2BaHout = hessianfcn(x,lambda)gydF4y2Ba% Hessian的目标gydF4y2BaH = [1200*x(1)^2-400*x(2)+2, -400*x(1);-400 * x (1), 200);gydF4y2Ba% Hessian非线性不等式约束gydF4y2BaHg = 2*眼(2);Hout = H + lambda.ineqnonlin*Hg;gydF4y2Ba
保存gydF4y2BahessianfcngydF4y2Ba
在MATLAB路径上。为了完成这个例子,包含梯度的约束函数是gydF4y2Ba
函数gydF4y2Ba[c,测查,gc, gceq] = unitdisk2 c (x) = x (1) ^ 2 + x (2) ^ 2 - 1;Ceq = [];gydF4y2Ba如果gydF4y2BaNargout > 2 gc = [2*x(1);2*x(2)];Gceq = [];gydF4y2Ba结束gydF4y2Ba
解决问题,包括梯度和黑森。gydF4y2Ba
有趣= @rosenboth;Nonlcon = @unitdisk2;X0 = [-1;2];选项= optimoptions(gydF4y2Ba“fmincon”gydF4y2Ba,gydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“内点”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“SpecifyObjectiveGradient”gydF4y2Ba,真的,gydF4y2Ba“SpecifyConstraintGradient”gydF4y2Ba,真的,gydF4y2Ba...gydF4y2Ba“HessianFcn”gydF4y2Ba, @hessianfcn);[x, fval exitflag,输出]= fmincon (x0有趣, ,[],[],[],[],[],[],@ unitdisk2选项);gydF4y2Ba
有关使用内点黑森的其他示例,请参见gydF4y2Bafmincon内点算法与解析HessiangydF4y2Ba而且gydF4y2Ba计算梯度和黑森使用符号数学工具箱gydF4y2Ba.gydF4y2Ba
黑森乘法函数。gydF4y2Ba而不是一个完整的黑森函数gydF4y2BafmincongydF4y2Ba
内点gydF4y2Ba
而且gydF4y2Batrust-region-reflectivegydF4y2Ba
算法允许你提供一个黑森乘法函数。这个函数给出了一个Hessian-乘以向量乘积的结果,而不直接计算Hessian。这可以节省内存。的gydF4y2BaSubproblemAlgorithmgydF4y2Ba
选项必须是gydF4y2Ba“重心”gydF4y2Ba
使一个黑森乘法函数工作;这是gydF4y2Batrust-region-reflectivegydF4y2Ba
违约。gydF4y2Ba
这两种算法的语法不同。gydF4y2Ba
为gydF4y2Ba
内点gydF4y2Ba
算法,语法是gydF4y2BaW = HessMultFcn(x,lambda,v);gydF4y2Ba
结果gydF4y2Ba
WgydF4y2Ba
应该是产品gydF4y2BaH * vgydF4y2Ba
,在那里gydF4y2BaHgydF4y2Ba
拉格朗日的黑森量是多少gydF4y2BaxgydF4y2Ba
(见gydF4y2Ba方程1gydF4y2Ba),gydF4y2BaλgydF4y2Ba
拉格朗日乘子(由gydF4y2BafmincongydF4y2Ba
),gydF4y2BavgydF4y2Ba
向量的大小gydF4y2BangydF4y2Ba1。设置方法如下:gydF4y2Ba选项= optimoptions(gydF4y2Ba“fmincon”gydF4y2Ba,gydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“内点”gydF4y2Ba,gydF4y2Ba“SpecifyObjectiveGradient”gydF4y2Ba,真的,gydF4y2Ba...gydF4y2Ba“SpecifyConstraintGradient”gydF4y2Ba,真的,gydF4y2Ba“SubproblemAlgorithm”gydF4y2Ba,gydF4y2Ba“重心”gydF4y2Ba,gydF4y2Ba“HessianMultiplyFcn”gydF4y2Ba, @HessMultFcn);gydF4y2Ba
提供函数gydF4y2Ba
HessMultFcngydF4y2Ba
,该函数返回gydF4y2BangydF4y2Ba-by-1向量,其中gydF4y2BangydF4y2Ba维数是多少gydF4y2BaxgydF4y2Ba.的gydF4y2BaHessianMultiplyFcngydF4y2Ba
选项允许您传递Hessian乘以向量的结果,而不计算Hessian。gydF4y2Ba的gydF4y2Ba
trust-region-reflectivegydF4y2Ba
算法不涉及gydF4y2BaλgydF4y2Ba
:gydF4y2BaW = HessMultFcn(H,v);gydF4y2Ba
结果gydF4y2Ba
W = H*vgydF4y2Ba
.gydF4y2BafmincongydF4y2Ba
通过gydF4y2BaHgydF4y2Ba
作为目标函数的第三个输出中返回的值(参见gydF4y2BaHessian for fminunc信任区域或fmincon信任区域反射算法gydF4y2Ba).gydF4y2BafmincongydF4y2Ba
也通过gydF4y2BavgydF4y2Ba
的向量或矩阵gydF4y2BangydF4y2Ba行。的列数gydF4y2BavgydF4y2Ba
可以变化,所以写gydF4y2BaHessMultFcngydF4y2Ba
接受任意数量的列。gydF4y2BaHgydF4y2Ba
不一定是黑森人;相反,它可以是任何使您能够计算的东西gydF4y2BaW = H*vgydF4y2Ba
.gydF4y2Ba设置方法如下:gydF4y2Ba
选项= optimoptions(gydF4y2Ba“fmincon”gydF4y2Ba,gydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“trust-region-reflective”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“SpecifyObjectiveGradient”gydF4y2Ba,真的,gydF4y2Ba“HessianMultiplyFcn”gydF4y2Ba, @HessMultFcn);gydF4y2Ba
一个使用黑森乘法函数的例子gydF4y2Ba
trust-region-reflectivegydF4y2Ba
算法,看到gydF4y2Ba密结构黑森最小化,线性等式gydF4y2Ba.gydF4y2Ba
包含衍生品的好处gydF4y2Ba
如果你不提供梯度,解算器通过有限差分估计梯度。如果你提供梯度,你的求解器就不需要执行这种有限差分估计,这样可以节省时间,而且更准确,尽管有限差分估计对于复杂的导数来说更快。此外,求解者使用一个近似的黑森,它可能与真正的黑森相去甚远。提供Hessian可以在更少的迭代中产生解决方案。例如,见末尾gydF4y2Ba计算梯度和黑森使用符号数学工具箱gydF4y2Ba.gydF4y2Ba
对于有约束的问题,提供梯度还有另一个优势。求解器可以到达一个点gydF4y2BaxgydF4y2Ba
这样gydF4y2BaxgydF4y2Ba
是可行的,但是,对于这个gydF4y2BaxgydF4y2Ba
的有限差分gydF4y2BaxgydF4y2Ba
总是会导致一个不可行的点。进一步假设目标函数在一个不可行的点返回一个复输出,gydF4y2Ba正gydF4y2Ba
,gydF4y2Ba南gydF4y2Ba
,或错误。在这种情况下,求解器可能会失败或过早停止。提供一个梯度可以让求解器继续进行。为了获得这种好处,您可能还需要包含非线性约束函数的梯度,并设置gydF4y2BaSpecifyConstraintGradientgydF4y2Ba
选项gydF4y2Ba真正的gydF4y2Ba
.看到gydF4y2Ba非线性约束gydF4y2Ba.gydF4y2Ba
为内点选择输入黑森近似gydF4y2BafmincongydF4y2Ba
的gydF4y2BafmincongydF4y2Ba
内点gydF4y2Ba
算法有许多选择输入黑森近似的选项。有关语法的详细信息,请参见gydF4y2Ba黑森作为输入gydF4y2Ba.以下是选项,以及对它们的相对特征的估计。gydF4y2Ba
黑森gydF4y2Ba | 内存相对使用率gydF4y2Ba | 相对效率gydF4y2Ba |
---|---|---|
“蓄热”gydF4y2Ba (默认)gydF4y2Ba |
高(用于大问题)gydF4y2Ba | 高gydF4y2Ba |
“lbfgs”gydF4y2Ba |
低至中gydF4y2Ba | 温和的gydF4y2Ba |
“fin-diff-grads”gydF4y2Ba |
低gydF4y2Ba | 温和的gydF4y2Ba |
“HessianMultiplyFcn”gydF4y2Ba |
低(取决于你的代码)gydF4y2Ba | 温和的gydF4y2Ba |
“HessianFcn”gydF4y2Ba |
?(取决于你的代码)gydF4y2Ba | 高(取决于你的代码)gydF4y2Ba |
使用默认值gydF4y2Ba“蓄热”gydF4y2Ba
黑森人除非你gydF4y2Ba
内存不足-试试gydF4y2Ba
“lbfgs”gydF4y2Ba
而不是gydF4y2Ba“蓄热”gydF4y2Ba
.如果你可以提供你自己的渐变,试试吧gydF4y2Ba“fin-diff-grads”gydF4y2Ba
,并设置gydF4y2BaSpecifyObjectiveGradientgydF4y2Ba
而且gydF4y2BaSpecifyConstraintGradientgydF4y2Ba
选项gydF4y2Ba真正的gydF4y2Ba
.gydF4y2Ba想要更多的效率-提供你自己的梯度和黑森。看到gydF4y2Ba包括麻布gydF4y2Ba,gydF4y2Bafmincon内点算法与解析HessiangydF4y2Ba,gydF4y2Ba计算梯度和黑森使用符号数学工具箱gydF4y2Ba.gydF4y2Ba
的原因gydF4y2Ba“lbfgs”gydF4y2Ba
只有适度的效率才是双重的。它有相对昂贵的谢尔曼-莫里森更新。结果迭代步骤可能有些不准确,因为gydF4y2Ba“lbfgs”gydF4y2Ba
有限的记忆。gydF4y2Ba
的原因gydF4y2Ba“fin-diff-grads”gydF4y2Ba
而且gydF4y2BaHessianMultiplyFcngydF4y2Ba
只有中等效率的是他们采用了共轭梯度法。它们准确地估计了目标函数的Hessian,但没有生成最准确的迭代步骤。有关更多信息,请参见gydF4y2Bafmincon内点算法gydF4y2Ba,并讨论了LDL方法和共轭梯度方法的求解gydF4y2Ba方程38gydF4y2Ba.gydF4y2Ba