[学习笔记]非线性规划matlab实现——概述与注意
一、概述
具有非线性 约束条件或 目标函数的数学规划,是 运筹学的一个重要分支。非线性规划研究一个 n元实函数在一组等式或不等式的约束条件下的极值问题,且 目标函数和约束条件至少有一个是未知量的非线性函数。目标函数和约束条件都是 线性函数的情形则属于线性规划。
常用求解方法:内点法、序列二次规划法、有效集法、信赖域反射算法。
二、matlab函数fmincon
函数实现:fmincon完成的是局部非线性规划而不是全局非线性规划。
完整形式:[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option);
参数说明:
X0:表示给定初始值。
A b:表示线性不等式约束条件。
Aeq beq:表示线性dens规划约束条件。
lb ub :表示上下界约束。
@fun:表示目标函数。
@nonlfun:表示非线性规划条件。
option:表示求解非线性约束条件的使用方法。
构建参数@fun:
建立新的m文件
function f = fun1(x)
f = -x(1)2-x(2)2 +x(1)x(2)+2x(1)+5*x(2) ;
end
说明:这里的f实际上就是目标函数,函数的返回值是f。由于非线性目标函数无法用矩阵直接标示,因此方程中都用x(1),x(2)…表示。
构建参数@nonlfun:
与构建参数@fun做法相似,例如:
function [c,ceq] = nonlfun1(x)
-(x1-1)^2 +x2 >= 0
c = [(x(1)-1)^2-x(2)]; % 千万別写成了: (x1-1)^2 -x2
ceq = []; % 不存在非线性等式约束,所以用[]表示
end
其中c表示的是非线性不等式约束,ceq表示的是非线性等式约束。
三、有关非线性规划的注意事项:
(1)fmincon完成的是局部非线性规划而不是全局非线性规划。因此函数的初值对函数结果的影响巨大!
改进方法:多取几组初值并且做比较、利用蒙特卡洛法寻找合适的初值。
(2)出现的结果可能极度不合理。
原因是初值设置极度不合理,导致结果不断偏离。
(3)不同的方法结果可能不同,如果不了解算法,根据解的情况选取最优的算法。
蒙特卡洛算法:
原理概述:利用随机数生成大量的满足约束条件的初值,带入函数中,根据函数的结果的优良来判断初始值是否合适。
代码:
clc,clear;
n=10000000; %生成的随机数组数
x1=unifrnd(-100,100,n,1); % 生成在[-100,100]之间均匀分布的随机数组成的n行1列的向量构成x1
x2=unifrnd(-100,100,n,1); % 生成在[-100,100]之间均匀分布的随机数组成的n行1列的向量构成x2
fmin=+inf; % 初始化函数f的最小值为正无穷(后续只要找到一个比它小的我们就对其更新)
for i=1:n
x = [x1(i), x2(i)]; %构造x向量, 这里千万别写成了:x =[x1, x2]
if ((x(1)-1)^2-x(2)<=0) & (-2*x1(i)+3*x2(i)-6 <= 0) % 判断是否满足条件
result = -x(1)^2-x(2)^2 +x(1)*x(2)+2*x(1)+5*x(2) ; % 如果满足条件就计算函数值
if result < fmin % 如果这个函数值小于我们之前计算出来的最小值
fmin = result; % 那么就更新这个函数值为新的最小值
x0 = x; % 并且将此时的x1 x2更新为初始值
end
end
end
disp('蒙特卡罗选取的初始值为:'); disp(x0)
——代码源于 清风讲解