相关文章推荐
坚韧的萝卜  ·  Nameof - F# | ...·  6 月前    · 

其中f、x、b、beq、lb、ub为向量, A Aeq为矩阵。

其它形式的线性规划问题都可经过适当变换化为此标准形式。

MATLAB 6.0版中,线性规划问题(Linear Programming)已用函数 linprog 取代了 MATLAB 5.x版中的lp函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在6.0版中仍可使用。

函数  linprog

格式  x = linprog(f,A,b)   % min  f ' *x   sub.to  线性规划的最优解。

x = linprog(f,A,b,Aeq,beq)   % 等式约束 ,若没有不等式约束,则 A=[ ] b=[ ]

x = linprog(f,A,b,Aeq,beq,lb,ub)   % 指定 x的范围,若没有等式约束 ,则 A eq=[ ] beq=[ ]

x = linprog(f,A,b,Aeq,beq,lb,ub,x0)   %设置初值x0

x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)    % options 为指定的优化参数

[x,fval] = linprog( )   % 返回目标函数最优值,即 fval= f ' *x

[x,lambda,exitflag] = linprog( )   % lambda 为解 x的Lagrange乘子。

[x, lambda,fval,exitflag] = linprog( )   % exitflag 为终止迭代的错误条件。

[x,fval, lambda,exitflag,output] = linprog( )   % output 为关于优化的一些信息

说明  若exitflag>0表示函数收敛于解x,exitflag=0表示超过函数估值或迭代的最大数字,exitflag<0表示函数不收敛于解x;若lambda=lower 表示下界lb,lambda=upper表示上界ub lambda=ineqlin 表示不等式约束,lambda=eqlin表示等式约束,lambda中的非 0 元素表示对应的约束是有效约束; output=iterations表示迭代次数,output=algorithm表示使用的运算规则,output=cgiterations表示 PCG 迭代次数。

5-1 求下面的优化问题

sub.to MATLAB优化问题(1)_MATLAB_06

>>f = [-5; -4; -6];

>>A =  [1 -1  1;3  2  4;3  2  0];

>>b = [20; 42; 30];

>>lb = zeros(3,1);

>>[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

x =      % 最优解

0.0000

15.0000

3.0000

fval =     % 最优值

-78.0000

exitflag =     % 收敛

output =

iterations: 6   % 迭代次数

cgiterations: 0

algorithm: 'lipsol'   % 所使用规则

lambda =

ineqlin: [3x1 double]

eqlin: [0x1 double]

upper: [3x1 double]

lower: [3x1 double]

>> lambda.ineqlin

ans =

0.0000

1.5000

0.5000

>> lambda.lower

ans =

1.0000

0.0000

0.0000

表明:不等约束条件 2 3 以及第 1 个下界是有效的

5.2  foptions函数

对于优化控制, MATLAB 提供了 18 个参数,这些参数的具体意义为:

options(1)- 参数显示控制(默认值为 0 )。等于 1 时显示一些结果。

options(2)- 优化点 x的精度控制 ( 默认值为 1e-4)

options(3)- 优化函数 F 的精度控制 ( 默认值为 1e-4)

options(4)- 违反约束的结束标准 ( 默认值为 1e-6)

options(5)- 算法选择,不常用。

options(6)- 优化程序方法选择,为 0 则为 BFCG 算法,为 1 则采用 DFP 算法。

options(7)- 线性插值算法选择,为 0 则为混合插值算法,为 1 则采用立方插算法。

options(8)- 函数值显示 ( 目标—达到问题中的 Lambda )

options(9)- 若需要检测用户提供的梯度,则设为 1

options(10)- 函数和约束估值的数目。

options(11)- 函数梯度估值的个数。

options(12)- 约束估值的数目。

options(13)- 等约束条件的个数。

options(14)- 函数估值的最大次数(默认值是 100 ×变量个数)

options(15)- 用于目标 — 达到问题中的特殊目标。

options(16)- 优化过程中变量的最小有限差分梯度值。

options(17)- 优化过程中变量的最大有限差分梯度值。

options(18)- 步长设置 ( 默认为 1 或更小 )

Foptions已经被optimset和optimget代替,详情请查函数optimset和optimget。

5.3  非线性规划问题

5.3.1  有约束的一元函数的最小值

单变量函数求最小值的标准形式为     sub.to

MATLAB5 .x中使用fmin函数求其最小值。

函数  fminbnd

格式  x = fminbnd(fun,x1,x2)   % 返回自变量 x在区间上函数fun取最小值时x值,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

x = fminbnd(fun,x1,x2,options)   % options 为指定优化参数选项

[x,fval] = fminbnd( )   % fval 为目标函数的最小值

[x,fval,exitflag] = fminbnd( )   %xitflag 为终止迭代的条件

[x,fval,exitflag,output] = fminbnd( )   % output 为优化信息

说明  若参数 exitflag >0,表示函数收敛于x,若 exitflag=0 ,表示超过函数估计值或迭代的最大数字, exitflag<0表示函数不收敛于x;若参数 output= iterations表示迭代次数, output= funccount表示函数赋值次数,output=algorithm表示所使用的算法。

5-2 计算下面函数在区间(0, 1 )内的最小值。

解:>> [x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)

0.5223

fval =

0.3974

exitflag =

output =

iterations: 9

funcCount: 9

algorithm: 'golden section search, parabolic interpolation'

5-3 [0 5] 上求下面函数的最小值

解:先自定义函数:在 MATLAB 编辑器中建立 M 文件为:

function f = myfun(x)

f = (x-3).^2 - 1;

保存为myfun.m,然后在命令窗口键入命令:

>> x=fminbnd(@myfun,0,5)

则结果显示为:

5.3.2  无约束多元函数最小值

多元函数最小值的标准形式为

其中:x为向量,如

MATLAB 5.x中使用fmins求其最小值。

命令  利用函数fminsearch求无约束多元函数最小值

函数  fminsearch

格式  x = fminsearch(fun,x0)   %x0为初始点,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

x = fminsearch(fun,x0,options)   % options optimset

[x,fval] = fminsearch( )   % 最优点的函数值

[x,fval,exitflag] = fminsearch( )   % exitflag 与单变量情形一致

[x,fval,exitflag,output] = fminsearch( )  %output 与单变量情形一致

注意:fminsearch采用了Nelder-Mead型简单搜寻法。

5-4 求的最小值点

解:>>X=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2',  [0,0])

1.0016    0.8335

或在 MATLAB 编辑器中建立函数文件

function  f=myfun(x)

f=2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2;

保存为myfun.m,在命令窗口键入

>> X=fminsearch ('myfun',  [0,0]) >> X=fminsearch(@myfun,  [0,0])

1.0016    0.8335

命令  利用函数fminunc求多变量无约束函数最小值

函数  fminunc

格式  x = fminunc(fun,x0)   % 返回给定初始点 x0的最小函数值点

x = fminunc(fun,x0,options)   % options 为指定优化参数

[x,fval] = fminunc( )   %fval 最优点 x处的函数值

[x,fval,exitflag] = fminunc( )   % exitflag 为终止迭代的条件,与上同。

[x,fval,exitflag,output] = fminunc( )   %output 为输出优化信息

[x,fval,exitflag,output,grad] = fminunc( )   % grad 为函数在解 x处的梯度值

[x,fval,exitflag,output,grad,hessian] = fminunc( ) % 目标函数在解 x处的海赛( Hessian )值

注意:当函数的阶数大于 2 时,使用 fminunc比fminsearch更有效,但当所选函数高度不连续时,使用fminsearch效果较好。

5-5 求的最小值。

>> fun='3*x(1)^2+2*x(1)*x(2)+x(2)^2';

>> x0=[1 1];

>> [x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0)

1.0e-008 *

-0.7591    0.2665

fval =

1.3953e-016

exitflag =

output =

iterations: 3

funcCount: 16

stepsize: 1.2353

firstorderopt: 1.6772e-007

algorithm: 'medium-scale: Quasi-Newton line search'

grad =

1.0e-006 *

-0.1677

0.0114

hessian =

6.0000    2.0000

2.0000    2.0000

或用下面方法:

>> fun=inline('3*x(1)^2+2*x(1)*x(2)+x(2)^2')

fun =

Inline function:

fun(x) = 3*x(1)^2+2*x(1)*x(2)+x(2)^2

>> x0=[1 1]

>> x=fminunc(fun,x0)

1.0e-008 *

-0.7591    0.2665

5.3.3  有约束的多元函数最小值

非线性有约束的多元函数的标准形式为:

sub.to

其中:x、b、beq、lb、ub是向量,A、Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。

MATLAB5 .x中,它的求解由函数constr实现。

函数  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,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( )

参数说明:fun为目标函数,它可用前面的方法定义;

x0为初始值;

A b满足线性不等式约束,若没有不等式约束,则取 A=[ ] b=[ ]

Aeq、beq满足等式约束,若没有,则取 A eq=[ ] beq=[ ]

lb、ub满足,若没有界,可设lb=[ ] ub=[ ]

nonlcon 的作用是通过接受的向量 x来计算非线性不等约束和等式约束分别在x处的估计 C Ceq,通过指定函数柄来使用,如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon) ,先建立非线性约束函数,并保存为 mycon.m: function [ C,Ceq] = mycon(x)

C = % 计算 x处的非线性不等约束的函数值。

Ceq = % 计算 x处的非线性等式约束的函数值。

lambda L agrange乘子,它体现哪一个约束有效。

output输出优化信息;

grad 表示目标函数在 x处的梯度;

hessian 表示目标函数在 x处的Hessiab值。

5-6 求下面问题在初始点( 0 1 )处的最优解

sub.to

解:约束条件的标准形式为

sub.to

先在 MATLAB 编辑器中建立非线性约束函数文件:

function  [c, ceq]=mycon (x)

c=(x(1)-1)^2-x(2);

ceq=[ ];      % 无等式约束

然后,在命令窗口键入如下命令或建立 M 文件:

>>fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)';     % 目标函数

>>x0=[0 1];

>>A=[-2 3];   % 线性不等式约束

>>Aeq=[ ];    % 无线性等式约束

>>beq=[ ];

>>lb=[ ];       %x没有下、上界

>>ub=[ ];

>>[x,fval,exitflag,output,lambda,grad,hessian]

=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@mycon)

3     4

fval =

exitflag =      %解收敛

output =

iterations: 2

funcCount: 9

stepsize: 1

algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'

firstorderopt: [ ]

cgiterations: [ ]

lambda =

lower: [2x1 double]   %x下界有效情况,通过lambda.lower可查看。

upper: [2x1 double]   %x上界有效情况,为 0 表示约束无效。

eqlin: [0x1 double]    % 线性等式约束有效情况,不为 0 表示约束有效。

eqnonlin: [0x1 double]    % 非线性等式约束有效情况。

ineqlin: 2.5081e-008    % 线性不等式约束有效情况。

ineqnonlin: 6.1938e-008    % 非线性不等式约束有效情况。

grad =      % 目标函数在最小值点的梯度

1.0e-006 *

-0.1776

hessian =    % 目标函数在最小值点的 H essian值

1.0000   -0.0000

-0.0000    1.0000

5-7 求下面问题在初始点x=(10, 10, 10)处的最优解。

Sub.to

解:约束条件的标准形式为

sub.to

>> fun= '-x(1)*x(2)*x(3)';

>> x0=[10,10,10];

>> A=[-1 -2 -2;1 2 2];

>> b=[0;72];

>> [x,fval]=fmincon(fun,x0,A,b)

24.0000   12.0000   12.0000

fval =

-3456

5.3.4  二次规划问题

二次规划问题( quadratic programming )的标准形式为:

sub.to

其中, H A A eq为矩阵,f、b、beq、lb、ub、x为向量

其它形式的二次规划问题都可转化为标准形式。

MATLAB5.x版中的qp函数已被 6.0 版中的函数 quadprog取代。

函数  quadprog

格式  x = quadprog(H,f,A,b)   %其中 H ,f,A,b为标准形中的参数,x为目标函数的最小值。

x = quadprog(H,f,A,b,Aeq,beq)   %Aeq,beq 满足等约束条件

x = quadprog(H,f,A,b,Aeq,beq,lb,ub)   % lb,ub 分别为解 x的下界与上界。

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)   %x0为设置的初值

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)   % options 为指定的优化参数

[x,fval] = quadprog( )   % fval为目标函数最优值

[x,fval,exitflag] = quadprog( ) % exitflag 与线性规划中参数意义相同

[x,fval,exitflag,output] = quadprog( ) % output与线性规划中参数意义相同

[x,fval,exitflag,output,lambda] = quadprog( ) % lambda与线性规划中参数意义相同

5-8 求解下面二次规划问题

sub.to

>>b = [2; 2; 3];

>>lb = zeros(2,1);

>>[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb)

x =     % 最优解

0.6667

1.3333

fval =     % 最优值

-8.2222

exitflag =    % 收敛

output =

iterations: 3

algorithm: 'medium-scale: active-set'

firstorderopt: [ ]

cgiterations: [ ]

lambda =

lower: [2x1 double]

upper: [2x1 double]

eqlin: [0x1 double]

ineqlin: [3x1 double]

>> lambda.ineqlin

ans =

3.1111

0.4444

>> lambda.lower

ans =

说明  第 1 2 个约束条件有效,其余无效。

例5-9  求二次规划的最优解

max   f (x1, x2)=x1x2+3

sub.to    x1+x2-2=0

解:化成标准形式:

sub.to    x1+x2=2

在Matlab中实现如下:

>>H=[0,-1;-1,0];

>>f=[0;0];

>>Aeq=[1 1];

>>[x,fval,exitflag,output,lambda] = quadprog(H,f,[ ],[ ],Aeq,b)

1.0000

1.0000

fval =

-1.0000

exitflag =

output =

firstorderopt: 0

iterations: 1

cgiterations: 1

algorithm: [1x58 char]

lambda =

eqlin: 1.0000

ineqlin: [ ]

lower: [ ]

upper: [ ]

2.【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided 3.使用 ONLYOFFICE 宏生成和插入词义 4.无涯教程-Android - Activity 5.Facebook - 01