matlab解简单数学规划(线性,非线性,整数规划)

参考学习b站:

数学建模学习交流

线性规划

[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
c是目标函数的系数向量,A是不等式约束Ax<=b的系数矩阵,b是不等式约束Ax<=b的常数项
Aeq是等式约束Aeq x=beq的系数矩阵,beq是等式约束Aeq x=beq的常数项
lb是X的下限,ub是X的上限,X是向量[x1,x2,...xn]' , 即决策变量。
迭代的初始值为x0(一般不用给)
返回的x表示最小值处的x取值 ; fval表示最优解处时取得的最小值

例题:
max ⁡ Z = 2 x 1 + 3 x 2 − 5 x 3 s . t . { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{aligned}\max Z=2x_{1}+3x_{2}-5x_{3}\\ s. t.\begin{cases}x_{1}+x_{2}+x_{3}=7\\ 2x_{1}-5x_{2}+x_{3}\geq 10\\ x_{1}+3x_{2}+x_{3}\leq 12\\ x_{1},x_{2},x_{3}\geq 0\end{cases}\end{aligned} maxZ=2x1+3x25x3s.t.x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

求解:

c = [-2 -3 5]';
A = [-2 5 -1;
         1 3 1];
b = [-10 12];
Aeq = ones(1,3);
beq = 7;
lb = zeros(3,1);
% ub不写,则意味着没有上界的约束
[x fval] = linprog(c, A, b, Aeq, beq, lb)
fval = -fval % 注意这个fval要取负号

结果:

x =
    6.4286
    0.5714
         0
fval =
  -14.5714
fval =
   14.5714

非线性规划

[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
x0表示给定的初始值(用行向量或者列向量表示),必须得写
A b表示线性不等式约束
Aeq beq 表示线性等式约束
lb ub 表示上下界约束
@fun表示目标函数
@nonlfun表示非线性约束的函数
option 表示求解非线性规划使用的方法

例题:
min ⁡ f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 2 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 \begin{aligned}\min f\left( x\right) =x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+8\\ s.t. \begin{cases}x_{1}^{2}-x_{2}+x_{3}^{2}\geq 0\\ x_{1}+x_{2}^{2}+x_{3}^{2}\leq 20\\ -x_{1}-x_{2}^{2}+2=0\\ x_{2}+2x_{3}^{2}=3\\ x_{1},x_{2},x_{3}\geq 0\end{cases}\end{aligned} minf(x)=x12+x22+x32+8s.t.x12x2+x320x1+x22+x3220x1x22+2=0x2+2x32=3x1,x2,x30
求解:

fun.m

function f = fun(x)
    % f = x(1)^2+x(2)^2 +x(3)^2+8 ; 
    % x实际上是一个向量,我们可以使用矩阵的运算符号对其计算
    f = sum(x.*x) + 8;  
end

nonlfun.m

function [c,ceq] = nonlfun(x)
    % 非线性不等式约束
    % 这里的x是一个向量!不能把x(1)写成x1
    c = [-x(1)^2+x(2)-x(3)^2;   
        x(1)+x(2)^2+x(3)^2-20];
    % 非线性等式约束
    ceq = [-x(1)-x(2)^2+2;
          x(2)+2*x(3)^2-3]; 
end

f.m

% 可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
format long g   
x0 = [1 1 1];  %任意给定一个初始值 
lb = [0 0 0];  % 决策变量的下界
[x,fval] = fmincon(@fun,x0,[],[],[],[],lb,[],@nonlfun)

结果:

x =
         0.552167405729277          1.20325915507969         0.947824046150443
fval =
          10.6510918606939

可以用蒙特卡罗寻找初始值x0

clc,clear;
n=1000000; 
x1= unifrnd(0,2,n,1);   % 生成在[0,2]之间均匀分布的随机数组成的n行1列的向量构成x1
x2 = sqrt(2-x1);        % 根据非线性等式约束用x1计算出x2
x3 = sqrt((3-x2)/2);    % 根据非线性等式约束用x2计算出x3
fmin=+inf; 
for i=1:n
    %构造x向量, 不要写成:x =[x1, x2, x3]
    x = [x1(i), x2(i), x3(i)];  
    if (-x(1)^2+x(2)-x(3)^2<=0) & (x(1)+x(2)^2+x(3)^2-20<=0)  
        result =sum(x.*x) + 8 ; 
        if  result  < fmin 
            fmin = result; 
            x0 = x;  
        end
    end
end
disp('蒙特卡罗选取的初始值为:'); disp(x0)

结果:

蒙特卡罗选取的初始值为:
    0.5522    1.2033    0.9478

整数规划

线性规划的函数:[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
线性整数规划的函数:[x fval] = linprog(c, intcon, A, b, Aeq, beq, lb,ub)

例题:
min ⁡ Z = − 3 x 1 − 2 x 1 − x 3 s . t . { x 1 + x 2 + x 3 ≤ 7 4 x 1 + x 2 + x 3 = 12 x 1 , x 2 ≥ 0 x 3 = 0 , 1 \begin{aligned}\min Z=-3x_{1}-2x_{1}-x_{3}\\ s.t. \begin{cases}x_{1}+x_{2}+x_{3}\leq 7\\ 4x_{1}+x_{2}+x_{3}=12\\ x_{1},x_{2}\geq 0\\ x_{3}= 0,1\end{cases}\end{aligned} minZ=3x12x1x3s.t.x1+x2+x374x1+x2+x3=12x1,x20x3=0,1
求解:

c=[-3;-2;-1]; 
intcon=3; % x3限定为整数
A=ones(1,3); b=7;
Aeq=[4 2 1]; beq=12;
lb=zeros(3,1); 
ub=[+inf;+inf;1]; %x(3)0-1变量
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

结果:

x =
         0
    5.5000
    1.0000
fval =
   -12

猜你喜欢

转载自blog.csdn.net/qq_45550375/article/details/122973610