我正在使用内点算法来解决非线性优化问题,并希望提供拉格朗日的 Hessian 作为 fmincon 的一部分以加快该过程(针对不同的参数集运行数千个变化)
我正在设计的工作流程具有(非线性)目标函数,线性和非线性约束的形式分别位于单独的函数文件中。由于我正在运行问题的不同变体,因此有时可能存在零非线性等式和零非线性不等式约束,在其他情况下,非线性等式/不等式约束的非零数量。简而言之,非线性约束的数量是动态的,并存储在 2 个变量“NumOfNonLinEqConstr”和“NumOfNonLinInEqConstr”中
我已经查看了使用符号工具箱和其他一些网页生成 Hessian 矩阵,但看不到为动态数量的约束构造拉格朗日的 Hessian 矩阵的示例。在引用的 matlab 网页示例中,就像在一个变体中一样,我尝试将 10 替换为 NumOfNonLinInEqConstr 但它不起作用,因为 matlabFunction 不适用于单元格数据类型。任何人都可以提供一个工作示例来构造具有动态数量的非线性约束的拉格朗日粗麻布吗
下面提供的 matlab 链接中的相关代码行:我的问题是如何避免在下面的代码中硬编码 10(并且还手动添加约束的 hessian 和 lambda.ineqnonlin 的乘积 10 次)?
hessc = cell(1, 10);
for i = 1:10
hessc{i} = jacobian(gradc(:,i),x);
end
for i = 1:10
ii = num2str(i);
thename = ['hessc',ii];
filename = [currdir,thename,'.m'];
matlabFunction(hessc{i},'file',filename,'vars',{x});
end
function H = hessfinal(X,lambda)
%
% Call the function hessenergy to start
H = hessenergy(X);
% Add the Lagrange multipliers * the constraint Hessians
H = H + hessc1(X) * lambda.ineqnonlin(1);
H = H + hessc2(X) * lambda.ineqnonlin(2);
H = H + hessc3(X) * lambda.ineqnonlin(3);
H = H + hessc4(X) * lambda.ineqnonlin(4);
H = H + hessc5(X) * lambda.ineqnonlin(5);
H = H + hessc6(X) * lambda.ineqnonlin(6);
H = H + hessc7(X) * lambda.ineqnonlin(7);
H = H + hessc8(X) * lambda.ineqnonlin(8);
H = H + hessc9(X) * lambda.ineqnonlin(9);
H = H + hessc10(X) * lambda.ineqnonlin(10);
end