数学建模04——非线性规划

目录

方法简介

概述

特点

求解方法

简单例题

模型假设

思路分析

代码实现


方法简介

概述

       在所有的变量表达式中,至少有一个为非线性关系式。

特点

(1)形式上与线性规划相似,都具有决策变量、目标函数、约束条件。

(2)在数学上,非线性规划没有一种通用解法去求严格的数值解。

求解方法

简单例题一

某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:km) 及水泥日用量d(单位:t)由下表给出。目前有两个临时料场位于A(5,1),B(2,7)。 日储量各有20t。假设从料场到工地之间均有直线道路相连。

(1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的 吨千米数最小?

 (2)为了进一步减少吨千米数,打算舍弃这两个临时料场,改建两个新的,日储量各为 20t。问应建在何处,节省的吨千米数为多大?

模型假设

       料场运输工地的路径为两点间直线

思路分析

         约束条件

       (1)从料场运往某个工地的运输量 = 该工地的水泥日用量

       (2)每个料场的运输总量 \leqslant 该料场的日储量

          在问题一中两料场与各工地的坐标为定值,运送的距离为定值,决策变量只有运送的吨数,该问题为线性规划

          在问题二中,要建立新站料场,运送的距离不确定,根据两点间距离公式可知,该问题属于非线性规划

代码实现

clc,clear;
% 六个工地的坐标
a=[1.25 8.75 0.5 5.75 3 7.25];
b=[1.25 0.75 4.75 5 6.5 7.75];
% 两个料厂的坐标
x=[5 2];
y=[1 7];
% 计算目标函数系数,即6工地与两个料场的距离,总共12个值
for i=1:6   % 对于6个工地
    for j=1:2       % 接收两个料场的供用
        l(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);   % 距离计算
    end
end
% 6个工地水泥日用量
d=[3 5 4 7 6 11];

%第一问

% 目标函数系数向量,总共12个值
f = [l(:,1);l(:,2)];    

% 料场的运输量小于等于日储量
A = [1 1 1 1 1 1 0 0 0 0 0 0
     0 0 0 0 0 0 1 1 1 1 1 1];% 两个料厂各自运出的水泥量    
b = [20;20];% 两个临时料场日储量

% 各工地收到的水泥量等于日用量
Aeq = [eye(6),eye(6)];% 各工地各自收到的水泥量   
beq=[d(1);d(2);d(3);d(4);d(5);d(6)];% 各工地各自的水泥日用量

lb=zeros(12,1);

[x,fval]=linprog(f,A,b,Aeq,beq,lb)

%第二问

% 约束条件与第一问一致,但决策变量多了两对坐标值
A2 = [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0];
B2 = [20;20];
Aeq2 = [eye(6),eye(6),zeros(6,4)];    
beq2=[3;5;4;7;6;11];
lb2=[zeros(12,1);-inf;-inf;-inf;-inf];
x0=[3;5;0;7;0;1;0;0;4;0;6;10;5;1;2;7];  
[x2,fval2]=fmincon(@obj_f,x0,A2,B2,Aeq2,beq2,lb2)
% 非线性约束
function ff = obj_f(x)   
% 6个工地坐标
a1 = [1.25 8.75 0.5 5.75 3 7.25];
b1 = [1.25 0.75 4.75 5 6.5 7.75];

f1=0;

% x(13)是第一个新料场的横坐标,x(14)是其纵坐标;
% x(15)是第二个新料场的横坐标,x(16)是其纵坐标;
for i=1:6
    s(i)=sqrt((x(13)-a1(i))^2+(x(14)-b1(i))^2); % 第一个料场到各工地的距离
    f1=s(i)*x(i)+f1;  % 第一个料场给各工地的吨千米数的总和
end

f2=0;

for i=7:12
    s(i)=sqrt((x(15)-a1(i-6))^2+(x(16)-b1(i-6))^2);  % 第二个料场到各工地的距离
    f2=s(i)*x(i)+f2;  % 第二个料场给各工地的吨千米数总和
end
% 总运输量(吨千米数)
ff=f1+f2;
end

       

找到最优解
x = 12×1
     3
     5
     0
     7
     0
     1
     0
     0
     4
     0
fval = 136.2275

可能存在局部最小值。满足约束。

fmincon 已停止,因为当前步长小于
步长容差值并且在约束容差值范围内满足约束。

<停止条件详细信息>
x2 = 16×1
    2.9410
    4.8405
    3.8779
    6.9431
    1.3033
    0.0221
    0.0590
    0.1595
    0.1221
    0.0569
fval2 = 90.4920

简单例题二

代码实现

clc,clear;
% 定义非线性的目标函数
function f=f1(x)
         % min -f(x)=-x(1)*x(2)*x(3)
         f=-x(1)*x(2)*x(3);
end
% 给x1、x2、x3赋初始值
x0=[0,0,0];
% 线性约束条件
A=[-1,1,-1];
b=[0];
Aeq=[1,-1,0];
beq=[10];
lb=[10,-Inf,-Inf];
ub=[20,+Inf,+Inf];
%非线性约束条件
function [c,ceq]=nonlfun1(x)
         c=[x(1)+x(2)^2+x(3)^3-20;x(1)*x(2)-x(3)-1];
         ceq=[-x(1)-x(2)^2+2];
end
[x,fval]=fmincon(@f1,x0,A,b,Aeq,beq,lb,ub,@nonlfun1);
x,fval=-fval
x = 1×3
   10.0000   -0.5130   -7.0371
fval = 36.1033
  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值