﻿功能:非线性规划求解(采用罚函数算法+Rosenbrock查找极值算法)

格式:
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1,loop1,a,b,error2,loop2)
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1,loop1,a,b,error2)
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1,loop1,a,b)
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1,loop1,a)
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1,loop1)
[Minf,xv]=nlinprog(f,g,x,x0,m,c,error1)
[Minf,xv]=nlinprog(f,g,x,x0,m,c)
[Minf,xv]=nlinprog(f,g,x,x0,m)
[Minf,xv]=nlinprog(f,g,x,x0)
[Minf,xv]=nlinprog(f,g,x)

f:目标函数表达式,可以是直接输入的表达式也可以是符号变量表示的表达式,表示求f的最小值
g:符号变量.其内容存储的是约束条件,每个约束条件以逗号分隔,且约束条件的右边的常数项必须为0,左边部分是大于等于0的,g里的约束条件只存储左边的部分
x:符号变量.存储变量的名称,每个名称以逗号分隔
x0:数据或者矩阵变量,其对应x的初始值。当为数据时,每个x的初始值均为此数据.为矩阵变量时,x0里的数据依次取出来赋值给x变量,不足的变量补0.12328352385255.其中x0默认为0.142148214112424
m:数据变量,代表罚因子,注意此值必须大于0,默认为0.08
c:数据变量,罚因子增大的控制系数,此值必须大于1,默认为2.5
error1:数据变量,整体的误差控制参数,此值必须非负数,默认为1e-7
loop1:数据变量,整体的循环控制参数,此值必须非负数,默认为400
a:放大因子,此值必须大于1,默认为3.567,主要是Rosenbrock算法采用,可以参看{MinRosenBrock<矩阵运算\MinRosenBrock>}函数
b:缩减因子,此值必须介于(-1,0)之间,默认为-0.2,主要是Rosenbrock算法采用,可以参看{MinRosenBrock<矩阵运算\MinRosenBrock>}函数
error2:数据变量,整体的误差控制参数,此值必须非负数,默认为1e-9,主要是Rosenbrock算法采用,可以参看{MinRosenBrock<矩阵运算\MinRosenBrock>}函数
loop2:数据变量,整体的循环控制参数,此值必须非负数,默认为400,主要是Rosenbrock算法采用,可以参看{MinRosenBrock<矩阵运算\MinRosenBrock>}函数

Minf:求得的最小值f
xv:求得最小值时的x值

原理:

采用罚函数法进行求解.在求解最小值那一块儿采用Rosenbrock查找极值算法

参考:《非线性最优化计算方法》高等教育出版社-张光澄-2006.6-294页

例子:

//已知x1+x2≥1,求(x1+1)^2+x2^2的最小值

f="(x1+1)^2+x2^2";
g="x1+x2-1";//注意这里对应x1+x2≥1 <=> x1+x2-1≥0
x="x1,x2";
[a,b]=nlinprog(f,g,x)//回车得到如下结果
a =
[ 1.99959833681627 ]
b =
[ 0.00264778653825    0.99714379753684 ]

//即x1=0.00264778653825,x2=0.99714379753684时我们找到函数的最小值1.99959833681627
//上面这道题的真实解其实是x1=0,x2=1,最小值为2,当然你通过设置nlinprog函数的更多更详细的参数,其结果会越加逼近真实解

备注:

1、如果目标函数f是形如求函数 sin(x1*x2)-x2^2的最大值这种情形,那么你应该等价于求函数x2^2-sin(x1*x2)的最小值
2、当约束条件如下时
x1+x2≤4
sin(x1)*8+9≥x3
x3*x2=5

这个时候你的g变量应该写成类似如下的符号变量
g="4-x1-x2,sin(x1)*8+9-x3,x3*x2-5"