数学规划模型的matlab求解

今天胡老师给我们讲了数学规划模型,数学规划模型是优化模型的一种,包括线性规划模型(目标函数和约束条件都是线性函数的优化问题); 非线性规划模型(目标函数或者约束条件是非线性的函数); 整数规划(决策变量是整数值得规划问题); 多目标规划(具有多个目标函数的规划问题) ;目标规划(具有不同优先级的目标和偏差的规划问题) 动态规划(求解多阶段决策问题的最优化方法) 。数学规划模型相对比较好理解,关键是要能熟练地求出模型的解。
以下是解线性规划模型的方法:

1.线性规划问题

线性规划问题的标准形式为:

min   f ' *x  

sub.to:A*x<b

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

MATLAB中,线性规划问题(Linear Programming)的求解使用的是函数linprog。

函数 linprog

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

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

x = linprog(f,A,b,Aeq,beq,lb,ub)    %指定x的范围 ,若没有等式约束 ,则Aeq=[ ],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迭代次数。

2.非线性规划问题

利用函数fminbnd求有约束的一元函数的最小值

格式    x = fminbnd(fun,x1,x2)  

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

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

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

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

 

命令   利用函数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型简单搜寻法。

命令   利用函数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效果较好。

利用fmincon求线性有约束的多元函数的最小值

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

函数   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表示所使用的算法。

3.二次规划问题

函数   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与线性规划中参数意义相同

4.     极小化极大(Minmax)问题

函数   fminimax

格式   x = fminimax(fun,x0)

          x = fminimax(fun,x0,A,b)

x = fminimax(fun,x0,A,b,Aeq,beq)

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub)

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

[x,fval,maxfval] = fminimax(…)

[x,fval,maxfval,exitflag] = fminimax(…)

[x,fval,maxfval,exitflag,output] = fminimax(…)

[x,fval,maxfval,exitflag,output,lambda] = fminimax(…)

 

5.多目标规划问题

函数   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,fval] = fgoalattain(…)

[x,fval,attainfactor] = fgoalattain(…)

[x,fval,attainfactor,exitflag] = fgoalattain(…)

[x,fval,attainfactor,exitflag,output] = fgoalattain(…)

[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(…)

6.最小二乘最优问题

有约束线性最小二乘

函数   lsqlin   

格式   x = lsqlin(C,d,A,b)    %求在约束条件 下,方程Cx = d的最小二乘解x。

x = lsqlin(C,d,A,b,Aeq,beq)    %Aeq、beq满足等式约束 ,若没有不等式约束,则设A=[ ],b=[ ]。

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)    %lb、ub满足 ,若没有等式约束,则Aeq=[ ],beq=[ ]。

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)    % x0为初始解向量,若x没有界,则lb=[ ],ub=[ ]。

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options)    % options为指定优化参数

[x,resnorm] = lsqlin(…)    % resnorm=norm(C*x-d)^2,即2-范数。

[x,resnorm,residual] = lsqlin(…)    %residual=C*x-d,即残差。

[x,resnorm,residual,exitflag] = lsqlin(…)    %exitflag为终止迭代的条件

[x,resnorm,residual,exitflag,output] = lsqlin(…)    % output表示输出优化信息

[x,resnorm,residual,exitflag,output,lambda] = lsqlin(…)    % lambda为解x的Lagrange乘子

非线性数据(曲线)拟合

函数   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,resnorm] = lsqcurvefit(…)

[x,resnorm,residual] = lsqcurvefit(…)

[x,resnorm,residual,exitflag] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)

 

非线性最小二乘

函数   lsqnonlin

格式   x = lsqnonlin(fun,x0)    %x0为初始解向量;fun为 ,i=1,2,…,m,fun返回向量值F,而不是平方和值,平方和隐含在算法中,fun的定义与前面相同。

x = lsqnonlin(fun,x0,lb,ub)     %lb、ub定义x的下界和上界: 。

x = lsqnonlin(fun,x0,lb,ub,options)    %options为指定优化参数,若x没有界,则lb=[ ],ub=[ ]。

[x,resnorm] = lsqnonlin(…)     % resnorm=sum(fun(x).^2),即解x处目标函数值。

[x,resnorm,residual] = lsqnonlin(…)    % residual=fun(x),即解x处fun的值。

[x,resnorm,residual,exitflag] = lsqnonlin(…)     %exitflag为终止迭代条件。

[x,resnorm,residual,exitflag,output] = lsqnonlin(…)    %output输出优化信息。

[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(…)    %lambda为Lagrage乘子。

[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqnonlin(…)    %fun在解x处的Jacobian矩。

 

非负线性最小二乘

函数   lsqnonneg

格式   x = lsqnonneg(C,d)    %C为实矩阵,d为实向量

x = lsqnonneg(C,d,x0)    % x0为初始值且大于0

x = lsqnonneg(C,d,x0,options)    % options为指定优化参数

[x,resnorm] = lsqnonneg(…)    % resnorm=norm (C*x-d)^2

[x,resnorm,residual] = lsqnonneg(…)    %residual=C*x-d

[x,resnorm,residual,exitflag] = lsqnonneg(…)

[x,resnorm,residual,exitflag,output] = lsqnonneg(…)

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(…)

6.非线性方程(组)求解

非线性方程的解

函数   fzero

格式   x = fzero (fun,x0)    %用fun定义表达式f(x),x0为初始解。

x = fzero (fun,x0,options)

[x,fval] = fzero(…)      %fval=f(x)

[x,fval,exitflag] = fzero(…)

[x,fval,exitflag,output] = fzero(…)

非线性方程组的解
函数   fsolve

格式   x = fsolve(fun,x0)    %用fun定义向量函数,其定义方式为:先定义方程函数function F = myfun (x)。

F =[表达式1;表达式2;…表达式m]    %保存为myfun.m,并用下面方式调用:x = fsolve(@myfun,x0),x0为初始估计值。

x = fsolve(fun,x0,options)

[x,fval] = fsolve(…)      %fval=F(x),即函数值向量

[x,fval,exitflag] = fsolve(…)

[x,fval,exitflag,output] = fsolve(…)

[x,fval,exitflag,output,jacobian] = fsolve(…)    % jacobian为解x处的Jacobian阵。

其余参数与前面参数相似。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章