与线性等式约束最小化,信赖域反射算法
的fmincon
trust-region-reflective
算法可以减少非线性目标函数服从线性等式约束(没有界限或任何其他限制)。例如,最小化
线性等式约束。这个例子需要 。
创建问题
的browneq.mat
文件包含矩阵Aeq
和说真的
,它代表了线性约束Aeq * x =说真的
。的Aeq
矩阵表示线性约束(100 100行Aeq
是一个100 -,- 1000矩阵)。加载browneq.mat
数据。
负载browneq.mat
的brownfgh
辅助函数在这个例子实现了目标函数,包括其梯度和黑森。
设置选项
的trust-region-reflective
算法要求目标函数包括梯度。该算法在目标函数接受一个黑森。将选项设置为包括所有的导数信息。
选择= optimoptions (“fmincon”,“算法”,“trust-region-reflective”,…“SpecifyObjectiveGradient”,真的,“HessianFcn”,“目标”);
解决问题
设置初始点1为奇数项和偶数项+ 1。
n = 1000;x0 =的(n - 1);x0 (2:2: n) = 1;
这个问题没有边界,线性不等式约束,或非线性约束,所以设置这些参数[]
。
一个= [];b = [];磅= [];乌兰巴托= [];nonlcon = [];
调用fmincon
来解决这个问题。
[x, fval exitflag、输出]=…fmincon (@brownfgh x0, A、b Aeq,说真的,磅,乌兰巴托,nonlcon,选项);
局部最小值。fmincon停止是因为最后的函数值的变化相对于其初始值小于公差的值函数。
检查解决方案和解决方案的过程
检查出口标志,目标函数值和约束违反。
disp (exitflag)
3
disp (fval)
205.9313
disp (output.constrviolation)
2.2338 e-13
的exitflag价值3表示fmincon
停止因为目标函数的变化值小于公差FunctionTolerance
。最后给出了目标函数值fval
。满足约束,如图所示output.constrviolation
,它显示一个非常小的数字。
计算约束违反自己,执行下面的代码。
规范(Aeq * x-beq正)
ans = 2.2338 e-13
Helper函数
下面的代码创建brownfgh
helper函数。
函数[f, g, H] = brownfgh (x)% BROWNFGH非线性最小化问题(函数,其梯度%,黑森)。%的文档的例子。% 1990 - 2019版权MathWorks公司。%评估函数。n =长度(x);y = 0 (n, 1);我= 1:(n - 1);y (i) = (x (i) ^ 2) ^ (x (i + 1) ^ 2 + 1) + (x (i + 1)。^ 2)。^ (x (i) ^ 2 + 1);f = (y)总和;%计算梯度。如果nargout > 1 i = 1: (n - 1);g = 0 (n, 1);g (i) = 2 * (x (i + 1)。^ 2 + 1)。* x (i)。* ((x (i) ^ 2) ^ (x (i + 1)。^ 2)) +…2 * x (i)。* ((x (i + 1)。^ 2)。^ (x (i) ^ 2 + 1))。*日志(x (i + 1)。^ 2);g (i + 1) = g (i + 1) +…2 * x (i + 1) * ((x (i) ^ 2) ^ (x (i + 1) ^ 2 + 1))。*日志(x (i)。^ 2) +…2 * (x(我)^ 2 + 1)。* x (i + 1) * ((x (i + 1)。^ 2)。^ (x(我)^ 2));结束%评估(稀疏对称)海赛矩阵如果nargout > 2 v = 0 (n, 1);我= 1:(n - 1);v (i) = 2 * (x (i + 1)。^ 2 + 1)。* ((x (i) ^ 2) ^ (x (i + 1)。^ 2)) +…4 * (x (i + 1) ^ 2 + 1)。* (x (i + 1)。^ 2)。* (x (i) ^ 2) * ((x (i) ^ 2) ^ ((x (i + 1)。^ 2) 1)) +…2 * ((x (i + 1)。^ 2)。^ (x (i) ^ 2 + 1))。*(日志(x (i + 1)。^ 2));v (i) =(我)+ 4 * (x (i) ^ 2) * ((x (i + 1)。^ 2)。^ (x (i) ^ 2 + 1))。*((日志(x (i + 1)。^ 2)) ^ 2);v (i + 1) = (i + 1) +…2 * (x (i) ^ 2) ^ (x (i + 1) ^ 2 + 1)。*(日志(x(我)^ 2))+…4 * (x (i + 1)。^ 2)。* ((x (i) ^ 2) ^ (x (i + 1) ^ 2 + 1))。*((日志(x(我)^ 2))^ 2)+…2 * (x(我)^ 2 + 1)。* ((x (i + 1)。^ 2)。^ (x(我)^ 2));v (i + 1) = (i + 1) + 4 * (x (i) ^ 2 + 1)。* (x (i + 1)。^ 2)。* (x (i) ^ 2) * ((x (i + 1)。^ 2)。^ (x (i) ^ 2 - 1));v0 = v;v = 0 (n - 1, 1);v (i) = 4 * x (i + 1)。* x (i)。* ((x (i) ^ 2) ^ (x (i + 1)。^ 2)) +…4 * x (i + 1) * (x (i + 1) ^ 2 + 1)。* x (i)。* ((x (i) ^ 2) ^ (x (i + 1)。^ 2))。*日志(x(我)^ 2);v (i) = (1) + 4 * x (i + 1)。* x (i)。* ((x (i + 1)。^ 2)。^ (x(我)^ 2)。*日志(x (i + 1)。^ 2);v (i) = (i) + 4 * x (i)。* ((x (i + 1)。^ 2)。^ (x(我)^ 2)。* x (i + 1);v1 = v;i = [(1: n)”; (1: (n - 1)));j = [(1: n); (2: n));s = (v0; 2 * v1);H =稀疏(i, j s n, n);H = (H + H) / 2;结束结束