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
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MATLAB是一个通用的数学软件,可以用来实现许多不同的数学模型,其中包括非线性整数规划模型。非线性整数规划模型是指目标函数和约束条件都是非线性的,并且在决问题时需要考虑变量的整数属性。 MATLAB提供了许多工具箱和函数,用于非线性整数规划问题。其中一些重要的工具箱包括Optimization Toolbox和Global Optimization Toolbox。这些工具箱提供了许多优化算法,如线性规划非线性规划整数规划、并行计算、全局优化等。 在使用MATLAB非线性整数规划问题时,需要定义问题的目标函数和约束条件,然后选择合适的求器。然后,求器将尝试寻找最优。如果问题的规模较大或者求时间过长,可以使用并行计算或全局优化来提高求效率。 除了上述方法外,在MATLAB中还可以使用其他的优化方法来非线性整数规划问题,例如genetic algorithm、simulated annealing等。这些方法可以通过MATLAB的函数调用来实现。 总之,MATLAB提供了丰富的工具和算法,可以用来决各种非线性整数规划问题。不同的问题需要选择合适的工具和算法才能得到更好的求效果。 ### 回答2: MATLAB是一个功能强大的数学计算软件,拥有广泛的应用范围。对于非线性整数规划问题,它也能提供有效的决方案。 非线性整数规划是一种复杂的优化问题,其目标函数和限制条件均为非线性且包含整数变量。所以,求非线性整数规划问题需要使用特定的求算法。 在MATLAB中,提供了多种求非线性整数规划问题的工具箱,例如Global Optimization Toolbox和Optimization Toolbox等。这些工具箱提供了各种求非线性整数规划问题的算法,如分支定界法、求线性松弛问题再舍入、割平面法和群体搜索法等。 使用MATLAB非线性整数规划问题需要以下步骤: 1. 定义问题的目标函数和限制条件,以及非线性整数变量的上下限。 2. 选择合适的非线性整数规划算法。 3. 配置求器的参数,如迭代次数和容许误差等。 4. 通过求器获得最优MATLAB除了提供求器,还提供了非线性整数规划问题求可视化工具,可以展示每个变量的取值和约束条件的绘图。同时,MATLAB也支持将求结果与其他MATLAB功能整合使用,例如优化和拟合等。 需要注意的是,求非线性整数规划问题是一项复杂而耗时的任务,需要良好的数学基础和算法设计能力。如果遇到问题,可以查阅MATLAB文档或寻求专业技术支持。 ### 回答3: Matlab非线性整数规划是指在满足一定约束条件下,寻找非线性函数的最小值或最大值的一种优化问题。其中,整数规划是指目标函数或约束条件中包含整数变量的情况。 在Matlab中,非线性整数规划可以通过使用内置的优化工具箱来实现。可以使用fmincon函数来求非线性整数规划问题。其中,需要定义目标函数,约束条件以及变量的上下界限制。对于整数变量,需要使用intcon参数指定变量的整数性质。 具体求过程可以用以下步骤来描述: 1. 定义目标函数:通过数学公式或函数表达式的方式定义非线性目标函数。 2. 定义约束条件:通过数学公式或函数表达式的方式定义非线性约束条件,包括等式约束和不等式约束。 3. 定义变量:定义变量并设置变量的上下界限制。 4. 设置整数变量:对于整数变量,需要使用intcon参数来指定变量的整数性质。 5. 求:使用fmincon函数求非线性整数规划问题,得到目标函数的最优和相应的变量值。 需要注意的是,非线性整数规划问题比较复杂,在求过程中可能会出现多个局部最优,而不是全局最优。因此,需要在实际应用中结合具体问题进行优化方法选择和参数调节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值