欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[学习笔记]非线性规划matlab实现——概述与注意

程序员文章站 2022-06-13 16:38:32
...

一、概述
具有非线性 约束条件或 目标函数的数学规划,是 运筹学的一个重要分支。非线性规划研究一个 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)

——代码源于 清风讲解

相关标签: matlab 线性规划