非线性规划
目标函数或约束条件中包含非线性函数
实例:投资决策问题
非线性规划模型
MATLAB解法
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
- x:决策向量取值
- fval:目标函数取值
- fun:用M文件定义的待求函数
- x0:x的初始值
- A,b:定义了线性不等式约束
- Aeq,beq:定义了线性等式约束
- lb,ub:x向量的下界和上界
function f=fun1(x);
f=sum(x.^2)+8;
function [g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];%非线性不等式约束
h=[-x(1)-x(2)^2+2
x(2)+2*x(3)^3-3];%非线性等式约束,要把等式一边变为零,方便求解
clc,clear
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
上面这个例子似乎跑不通,不知道怎么回事,(╯‵□′)╯︵┻━┻
无约束问题的MATLAB解法
求多元非线性函数的极值
符号解
- 求偏导,解方程,求驻点
- 求哈希矩阵
- 哈希矩阵:正定–该点处取极小值;负定–该点处取极大值;不定阵–不是极值点
数值解 直接用MATLAB工具箱
- fminunc
[x,fval]=fminunc(fun,x0,options)
- x:极小值点
- fval:极小值
- fun:M函数
- x0:x的初始值
- options:优化参数
- fminsearch
[x,fval]=fminsearch(fun,x0,options)
参数含义同上
这两个工具求的都是极小值,但是只要把f(x)变成-f(x),也就可以求出极大值了。
函数零点和方程组的解
- solve函数
- fsolve函数
约束极值问题(规划问题)
二次规划
目标函数是自变量x的二次函数,约束条件全是线性的。
- quadprog
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) - H:实对称矩阵
其他参数含义同上。
罚函数法–序列无约束最小化技术
有约束----(加入罚函数)---->无约束
MATLAB解法
- fminbnd 单变量x
[x,fval]=fminbnd(fun,x1,x2,options)
- x:极小值点
- fval:极小值
- x1,x2:x的下上限
- fseminf 多变量
[x,fval]=fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
- ntheta:半无穷约束的个数
- seminfcon:函数,用于定义非线性不等式约束、非线性等式约束、半无穷约束的函数
- fminimax
[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
类似fmincon - 利用梯度求解
!直接用MATLAB工具箱optimtool!
这么好的工具居然要在未来版本被remove了,不能给小白留条活路吗/(ㄒoㄒ)/~~