当前位置:
文档之家› Matlab 7最优化问题求解
Matlab 7最优化问题求解
x s.t,G(X)≤0
1.0000
1.0000
f x
其中x = [x1 , x2 … x n ]T ,该数学表示的含义是求一组 x,使得目标函数 f(x)最小,且满 足约束条件 G(x)小于或等于 0.这种问题也称为最小化问题.
2.1 约束条件分类 ·线性不等式约束:Ax ≤ b ·线性等式约束:Aeq x = beq ·非线性不等式约束:Cx ≤ 0 ·非线性等式约束:Ceq x = 0 ·x 的上界和下界:Lbnd ≤ x ≤ Ubnd Matlab 提供了 fmincon 函数,用于求解各种约束下的最优解问题,调用格式为: [x,fval]=fmincon(@fname,x0,A,b,Aeq,beq,Lbnd,Ubnd,Nonf ,options) X,fname,fval,x0 和 options 含义与求最小值函数相同, 其余参数为约束条件, 参 数 NonF 为非线性约束函数的 M 文件名,如果该约束不存在则用空矩阵表示. --------------------------------------------------------------------例如:求解有约束最优化问题
例如:求解线性规划问题
min f x = 2x1 + x2 3x1 + x2 ≥ 3 x s. t. 4x1 + 3x2 ≥ 6 x1 ≥ 0, x2 ≥ 0 f=[2;1]; A=[-3,-1;-4,-3;-1,-2]; b=[-3;-6;-2]; lb=[0;0]; options=optimset('Display','off'); [x,f]=linprog(f,A,b,[],[],lb,[]) Optimization terminated.
4.3.2 多元函数的无约束优化问题 多元函数无约束最小化问题的标准型为: min F X 其中X为n维变元向量.可以使用fminunc函数或fminsearch函数.调用格式为: ·x=fminunc(fun,x0)/x=fminsearch(fun,x0) ·x=fminunc(fun,x0,options)/x=fminsearch(fun,x0,options) ·[x,fval]=fminunc(fun,x0,options)/ [x,fval]=fminsearch(fun,x0,options) ·[x,fval,exitflag]=fminunc(fun,x0,options)/ [x,fval,exitflag]=fminsearch(fun,x0,options) ·[x,fval,exitflag,output]=fminunc(fun,x0,options)/ [x,fval,exitflag,output]=fminsearch(fun,x0,options) 注意: fminsearch以单纯的形法寻最优值, fminunc的算法受options参数控制: ·fminunc为无约束优化提供了大型优化算法和中型优化算法,由options的 LargeScale控制: LargeScale=’on’(默认),使用大型算法 LargeScale=’off’,使用中型算法 · fminunc为中型优化算法的搜索方向提供了4种算法, 由options的HessUpdate 控制: HessUpdate=’bfgs’(默认),拟牛顿法的BFGS公式 HessUpdate=’dfp’,拟牛顿法的DFP公式 HessUpdate=’steepdesc’,最速下降法 ·fminunc为中型优化算法的步长一维搜索提供了2种算法,由options的 LineSearchType控制: LineSearchType=’quadcubic’(缺省值),混合的二次和三次多项式插值 LineSearchType=’cubicpoly’,三次多项式插值
Matlab 最优化问题求解
1. 无约束最优化问题 无约束最优化问题一般描述为: min f x 其中x = [x1 , x2 … x n ] ,该数学表示的含义是求一组 x,使得目标函数 f(x)最小.这种 问题也称为最小化问题. Matlab 中提供了 3 个求最小值的函数,调用格式为: ·[x,fval]=fminbnd(@fname,x1,x2,options) :求一元函数在(x1,x2)区间中 的极小值点 x 和极小值 fval; ·[x,fval]=fminsearch(@fname,x0,options) :基于单纯形算法求多元函数的 极小值点 x 和极小值 fval; ·[x,fval]=fminunc(@fname,x0,options):基于拟牛顿法求多元函数的极小值 点 x 和极小值 fval. 这里讨论的是局域极值问题,fname 是定义函数 m 文件的文件名,fminbnd 的输入变 量 x1,x2 分别是研究区间的左右边界; fminsearch 和 fminunc 的输入变量 x0 是一 个向量, 表示极值点的初值.options 为优化参数, 可以通过 optimset 函数来设置, 当目标函数的阶数大于 2 时, 使用 fminunc 比 fminsearch 更有效; 但是目标函数高 度不连续时,使用 fminsearch 函数效果更好.
2
-0.5000 -1.0000
-0.5000 lb lb = 0 0 x0 x0 = 0.5000 0.5000 [x,f]=fmincon(@fop,x0,A,b,[],[],lb,[],[],options) x = 0.3400 0.3300 f = 0.2456 注意线性不等式约束全部是小于号, 如果出现大于号要将不等式两端取相反数转换成小于号 再列写A,b矩阵. ---------------------------------------------------------------------
4
解一元函数的无约束优化问题: min f x x1 ≤ x ≤ x2 使用的函数是fminbnd,其常用格式: ·x=fminbnd(@fname,x1,x2) ·x=fminbnd(@fname,x1,x2,options) ·[x,fval]=fminbnd(@fname,x1,x2,options) ·[x,fval,exitflag]=fminbnd(@fname,x1,x2,options) ·[x,fval,exitflag,output]=fminbnd(@fname,x1,x2,options) Fminbnd算法基于黄金分割法和二次插值法,要求目标函数必须是连续函数,并可 能给出局部最优解.
例如:求函数f x = x 3 − 2x − 5在区间[0,5]内的极小值和极小值点.
function fx=mymin(x) fx=x.^3-2*x-5; [x,fval]=fminbnd(@mymin,0,5) x = 0.8165 fval = -6.0887 因此极小值点为 x=0.8165,极小值为-6.0887 ---------------------------------------------------------------------
2 2 min f x = 0.4x2 + x1 + x2 − x1 x2 +
x t.
x1 + 0.5x2 ≥ 0.4 0.5x1 + x2 ≥ 0.5 x1 ≥ 0, x2 ≥ 0
1 3 x 30 1
function f=fop(x) f=0.4*x(2)+x(1)^2+x(2)^2-x(1)*x(2)+1/30*x(1)^3; A A = -1.0000 -0.5000 b b = -0.4000
---------------------------------------------------------------------
例如:求函数f = 2e−x sinx在0<x<8区间内的最大值和最小值.
function fx=fun(x) fx=2*exp(-x).*sin(x);
[xmin,ymin]=fminbnd(@fun,0,8) xmin = 3.9270 ymin = -0.0279
约束最小 (非线性规划) 达到目标问题 极小极大问题
X=fmincon(@fname,X0) X=fgoalattain(@fname,x,goal,w) X=fminimax(‘FG’,x0)
min r s. t. F x − wr ≤ goal min max Fi x s. t. G x ≤ 0
T
Matlab 中没有专门求最大值的函数,只要 -f(x)在 (a,b) 上的最小值就是 f(x)在 (a,b)上最大值的相反数.因此用 fminbnd(-f,x1,x2)返回函数 f(x)在(x1,x2)上 的最大值的相反数.
---------------------------------------------------------------------
3. 线性规划问题求解 线性规划问题的标准形式是:
min
Ax ≤b x s.t. A eq x=beq Lbnd ≤x ≤Ubnd
f x
Matlab中求解线性规划问题的函数是linprog,调用格式为: [x,fval]=linprog(f,A,b,Aeq,beq,Lbnd,Ubnd) 其中x是最优解,fval是目标函数的最优值.函数中各项参数是线性规划问题标准形式中的 对应项,x,b,beq,Lbnd,Ubnd是向量,Aeq,A是矩阵,f为目标函数的系数向量. ---------------------------------------------------------------------
function fx=fun(x) fx=-2*exp(-x).*sin(x);
[x,fval]=fminbnd(@fun,0,8); xmax=x; ymax=abs(fval); xmax xmax = 0.7854 ymax ymax = 0.6448