10.3.4 options 选项

从上面的例子可以看出优化选项(options)对优化过程甚至对优化结果都会产生不可忽略的影响,因此在使用优化函数的时候要对它的相应选项作细致的了解,为了便于读者学习,本书给出对各选项的简单解释,见表 10.1。对于具体应用,读者还要参考函数本身的详细说明,选择合适的选项,以便得到准确的结果。

对 structure 数据 options 选项的设定可使用 optimset 函数完成,其调用格式为:
options = optimset('param1',value1,'param2',value2,...)
optimset
options = optimset
options = optimset(optimfun)
options = optimset(oldopts,'param1',value1,...)
options = optimset(oldopts,newopts)
具体调用的例子可以参考例 10.9。

10.4 最小二乘优化问题

非线性最小二乘问题,简称 LS(Least Sqaures)问题,它的标准形式如下:
Min F(x)=∑ri(x)=r'r, x∈Rn, m≤n
其中 r = r(x) = (r1(x), r2(x), …, rm(x))' 称为剩余量,某些 ri(x)为非线性函数。
最小二乘问题大量应用于实际拟合问题中,它固然可以用无约束优化的方法解,然而,
由于此问题目标函数的特殊结构,因此可以对某些方法进行改造,使之更简单或更有效。另
外,也可由此构造一些针对此问题的特殊方法。
在 MATLAB 中,最小二乘问题的求解可由函数 lsqlin、 lsqnonlin 以及 lsqnonneg 实现。

10.4.1 最小二乘优化

1.线性最小二乘问题优化
此类问题主要是想解决形如

x = lsqlin(C,d,A,b)
x = lsqlin(C,d,A,b,Aeq,beq)
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options)
x = lsqlin(problem)
[x,resnorm] = lsqlin(...)
[x,resnorm,residual] = lsqlin(...)
[x,resnorm,residual,exitflag] = lsqlin(...)
[x,resnorm,residual,exitflag,output] = lsqlin(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(…)

其中 C 和 d 分别对应目标函数中的系数, resnorm 返回残差的二阶矩, residual 返回残差
值,其他参数与 linprog 函数中参数意义相同。
2.非线性最小二乘问题优化
此类问题主要是想解决形如

的问题。在 MATLAB 中主要由函数 lsqnonlin 来实现,其标准调用格式为:

x = lsqnonlin(fun,x0)
x = lsqnonlin(fun,x0,lb,ub)
x = lsqnonlin(fun,x0,lb,ub,options)
x = lsqnonlin(problem)
[x,resnorm] = lsqnonlin(...)
[x,resnorm,residual] = lsqnonlin(...)
[x,resnorm,residual,exitflag] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(...)

其中 x0 是初值点, fun 是优化函数名,需要注意的是:此函数需要返回一向量而非向量元素的平方和。

的问题。在 MATLAB 中主要由函数 lsqnonneg 来实现,其标准调用格式为:
x = lsqnonneg(C,d)
x = lsqnonneg(C,d,x0)
x = lsqnonneg(C,d,x0,options)
x = lsqnonneg(problem)
[x,resnorm] = lsqnonneg(...)
[x,resnorm,residual] = lsqnonneg(...)
[x,resnorm,residual,exitflag] = lsqnonneg(...)
[x,resnorm,residual,exitflag,output] = lsqnonneg(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(...)
与前面两个函数对照,没有需要说明的输入输出参数。下面通过一个例子对比最小二乘
法的解与非负最小二乘优化的解的区别:
>> C = [
0.0372 0.2869
0.6861 0.7071
0.6233 0.6245
0.6344 0.6170];
>> d = [
0.8587
0.1781
0.0747
0.8405];
>> [C\d, lsqnonneg(C,d)] %超定方程除法即最小二乘法拟合解
ans =
-2.5627 0
3.1108 0.6929
>> [norm(C*(C\d)-d), norm(C*lsqnonneg(C,d)-d)]
ans =
0.6674 0.9118

由此可见非负最小二乘优化的结果没有最小二乘法得到的结果好,但是 lsqnonneg 得到的解没有负元素。

10.4.2 最小二乘曲线/面拟合

优化工具箱还提供了最小二乘曲线/面拟合的功能,主要是想解决形如

的问题。 MATLAB 里由函数 lsqcurvefit 实现,其标准调用格式为:
x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
x = lsqcurvefit(problem)
[x,resnorm] = lsqcurvefit(...)
[x,resnorm,residual] = lsqcurvefit(...)
[x,resnorm,residual,exitflag] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(...)

该函数从初始点 x0 出发搜寻系数 x, 使得非线性函数 fun(x,xdata)在最小二乘的规则下可以最佳拟合 ydata。显然该函数在数据拟合方面有非常重要的应用背景和价值,本书中不做过多介绍。

10.5 非线性约束问题优化

除了自由优化问题外,还有一种带有约束条件的优化问题。事实上,在实际应用中,带有约束的优化问题占了大多数。本节将主要介绍求解非线性约束问题优化的 MATLAB 实现。此问题主要由 fmincon 函数来实现。

10.5.1 函数介绍

fmincon 函数主要用来求解如下形式的优化问题:

其中目标函数 f (x),约束不等式函数 c(x)和约束等式函数 ceq(x)都可以是非线性函数。 fmincon
函数的标准调用格式为:
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fmincon(problem)
[x,fval] = fmincon(...)
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
[x,fval,exitflag,output,lambda] = fmincon(...)
[x,fval,exitflag,output,lambda,grad] = fmincon(...)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)

其中 A,b,Aeq,beq 都用来指定线性约束,而多出来的 nonlcon 用来指定非线性约束。 options用来指定优化参数,例如指定优化算法等,具体参数可以参见表 10-1。 对于同一问题,若优化过程需要用到 KNITRO 第三方库,则可以调用函数 ktrlink,其调用格式与 fmincon 几乎一致,唯一差别即可使用 knitrooptions 定义 KNITRO 参数选项。

10.5.2 应用举例

【例 10.11】 考虑例 10.8 加上两个约束条件的问题。

目标函数和约束条件为:

解: 首先在 MATLAB 中编制目标函数 objfun.m:
function f = objfun(x)
f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);
以及约束函数 confun.m:
function [c, ceq] = confun(x)
% Nonlinear inequality constraints
c = [1.5 + x(1)*x(2) - x(1) - x(2);
-x(1)*x(2) - 10];
% Nonlinear equality constraints
ceq = [];
然后在命令窗口中设置初值并优化:
>> x0 = [-1,1]; % 初值
>> options = optimset('Algorithm','active-set');
>> [x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
>> x,fval
x =
-9.5474 1.0474
fval =
0.0236

解: 依然使用上例中的目标函数和约束条件 M 文件,在命令窗口做优化:
>> [x,fval] = fmincon(@objfun,x0,[],[],[],[],[0 0],[],@confun,options);
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the function tolerance,
and constraints were satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
1 1
>> x,fval
x =
0 1.5000
fval =
8.5000

解: 依然使用上例中的目标函数和约束条件 M 文件,在命令窗口做优化:
>> x0 = [-1,1];
>> [x,fval] = fmincon(@objfun,x0,[],[],[1 1],[0],[],[],@confun,options);
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the function tolerance,
and constraints were satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
1
>> x,fval
x =
-1.2247 1.2247
fval =
1.8951

10.6 多任务“目标-达到”问题的优化

在优化问题中还有一类重要的问题,在控制系统中有广泛的应用,即为所谓的“目标-达到”问题优化。其数学问题可以简单描述为:找到在各种约束条件下的最佳 x,使得 F x i ( )达到目标(goal) * Fi ,在现实问题中二者可能不能精确相等,为了“达到目标”,我们实质上希

在 MATLAB 中主要由函数 fgoalattain 来实现此优化问题,其标准调用格式为:
x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,... options)
x = fgoalattain(problem)
[x,fval] = fgoalattain(...)
[x,fval,attainfactor] = fgoalattain(...)
[x,fval,attainfactor,exitflag] = fgoalattain(...)
[x,fval,attainfactor,exitflag,output] = fgoalattain(...)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(...)

其中 fun 代表 F(x)函数, x0 是初值, goal 表示目标, weight 是权函数,其他参数与前面
函数中的参数意义相同。
应用举例
【例 10.14】 本例给出目标-达到函数的用法。
已知一个闭环复杂设备的输出反馈控制器,其信号可由如下方程描述:
x ( ) A BKC x Bu
y Cx
= + +
=

希望设计 K,使其特征值 eig(A+B*K*C)位于[−5,−3,−1]的左侧,且 K 的各元素的绝对值
小于 4。考虑双输入双输出非稳态过程,输入设备状态空间矩阵由下面信息给出:

解: 首先创建特征值表征函数 eigfun.m
function F = eigfun(K,A,B,C)
F = sort(eig(A+B*K*C)); % Evaluate objectives
A = [-0.5 0 0; 0 -2 10; 0 1 -2];B = [1 0; -2 2; 0 1];
C = [1 0 0; 0 0 1]; K0 = [-1 -1; -1 -1]; % 初值
goal = [-5 -3 -1]; % 特征值目标
weight = abs(goal); % 权
lb = -4*ones(size(K0));ub = 4*ones(size(K0));
[K,fval,attainfactor] = fgoalattain(@(K)eigfun(K,A,B,C),… K0,goal,weight,
[],[],[],[],lb,ub,[])
K =
-4.0000 -0.2564
-4.0000 -4.0000
fval =
-6.9313
-4.1588
-1.4099
attainfactor =
-0.3863
结果说明优化结果超过目标 38.63%,如果希望优化尽可能地接近目标,可设 optiset 为
GoalsExactAchieve
options = optimset('GoalsExactAchieve',3);
[K,fval,attainfactor] = fgoalattain(@(K)eigfun(K,A,B,C),… K0,goal,weight,
[],[],[],[],lb,ub,[],options)
K =
-1.5953 1.2040
-0.4201 -2.9047
fval =
-5.0000
-3.0000
-1.0000
attainfactor =
-2.4929e-021

此式表明特征值几乎精确达到目标。整个算例过程可由 goaldemo 演示。

10.7 非线性方程的优化解

在 MATLAB 的优化工具箱中提供了两个用来求解非线性方程的功能函数 fzero 和 fsolve,用它们来求非线性方程的优化解十分方便。下面就给予这方面的介绍。

1. fzero 函数

fzero 函数用来求解单变量连续函数的根,其标准调用格式为:

x = fzero(fun,x0)
x = fzero(fun,x0,options)
x = fzero(problem)
[x,fval] = fzero(...)
[x,fval,exitflag] = fzero(...)
[x,fval,exitflag,output] = fzero(...)

其中 x0 是初值, fzero 函数返回在 x0 附近的零点。若 x0 为单标量,则 x 返回在 x0 附近的函数值变号的点,如果失败则返回 NaN。若搜索过程中遇到 Inf, NaN 或者复数值,则搜索中断。若 x0 为双元素的向量,则 x 返回在此向量构成的数值区间内的某个根。其他参数与前面的函数参数意义相同。
 

【例如】
>> fzero('sin', 3)
ans =
3.141592653589793e+000
说明 注意函数的引号;函数亦由 M 文件定义,例如 f.m
function y = f(x)
y = x.^3-2*x-5;
>> z = fzero(@f,2)
z =
2.0946
2. fsolve
fsolve 用于求解非线性方程 F(x) =0 的解。其中 x 可为向量或矩阵。调用格式如下。
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
x = fsolve(problem)
[x,fval] = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
参数与前面的函数参数意义相同,不在冗述。

解:
建立函数文件
function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
-x(1) + 2*x(2) - exp(-x(2))];
>> x0 = [-5; -5];
>> [x,fval] = fsolve(@myfun,x0)
x =
0.567143031397357
0.567143031397357
fval =
1.0e-006 *
-0.405909605705190
-0.405909605705190
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐