数学建模--非线性规划模型+MATLAB代码保姆式解析

目录

1.简单介绍

2.求解方法

3.适用赛题

4.典型例题及相关分析

(1)问题引入

(2)决策变量&约束条件

(3)确定目标函数

(4)建立数学模型

5.MATLAB代码祝逐字句讲解


1.简单介绍

非线性规划,要想深刻的理解并且运用这个模型,我们学习者必须要了解什么是线性,什么是非线性,简单的来讲:数学里面的一次函数关系就是线性的关系,其他的函数关系就是非线性的关系,例如,我们平常常见的x^2,logx,sinx这些都是非线性的,我们的这个非线性规划模型要解决的就是这样的问题,这个是我们从宏观上对于我们要学习的非线性规划问题做一个大致的了解。

2.求解方法

下面的图片里面的函数就是我们进行求解非线性规划模型的函数fmincon函数,下面的左下方就是一个常见的非线性规划问题,一个目标函数,带平方显然不是我们之前提到的线性的模型,约束条件(中括号里面的内容)同样是带平方的非线性规划类的问题,我们现在只需要大概了解一下即可,下面我们会全面的介绍这个函数的应用场景以及求解的方法。

3.适用赛题

(1)空间运动类的问题,下面也提到了三角函数以及指数函数,这些函数的图像就是典型的非线性的函数图像,我们就需要使用非线性规划的方法解决这类问题。

(2)选地址的这类问题,显然就要求解函数的极值最值,这里就要使用两点之间的距离公式,这个公式里面既要平方运算,又含有根号运算,显然就已经属于我们的非线性的研究的范畴了;

(3)选地址类的问题就是我们的选取的经典例题,我们就以这类问题作为引例,详细的介绍非线性规划类的问题,下面是我们进行的一些假设,这些假设可以简化我们的模型,我们都知道两点之间的距离计算的肯定是直线的,但是实际的生活里面,我们遇到的各种工程问题怎么可能会是直的呢?难免会出现无法直达的情况,

这个时候我们的模型的假设就很有必要了,我们的模型假设所有的情况都是两点之间的直线距离,那种不是直线的情况我们不进行考虑。

4.典型例题及相关分析

(1)问题引入

我们的问题是两个料场,6个工厂,问题里面的吨千米数就是指距离乘以材料的重量,两者的乘积就是我们的决策变量,我们要求的是这个变量的最小值;

(2)决策变量&约束条件

下面我们是确定目标函数和约束条件:这里出现了对个自变量,i,j等等,而且求和的时候会出现一个变量改变,另外的一个变量不改变的情况,然后进行求和,我们只有先清楚的理解这个求和式子的含义是什么,才可以在MATLAB里面根据它的含义去进行运算,初学者这个地方理解起来会有些吃力,但是这个是我们必须要进行面对的,我们在数学建模的过程中会遇到大量的这种数据多,交叉进行求和的情况,我们必须要逐渐的适应,去理解,去尝试;

以上面的变量含义和求和运算的符号为例子,我们简单的了解一下表示的几何意义:我们使用i表示的是6个工厂,i的取值范围就是123456,我们使用j代表的是两个料场,料场的j取值范围就是12,e表示的是料场里面每天的材料储备量,e1就表示第一个料场的材料储备量,e2就表示第二个料场的原料储备量;d表示的就是day每天的意思,意思就是说1号工厂的每天的水泥用量d1就是两个水泥原料厂输送的水泥量的总和;

下面我们来了解一下下面的约束条件里面的两个求和运算的式子究竟是什么含义:第一个约束条件就是水泥运输的总量不能超过每天的储备量,这个里面的ij都在改变,我们理解的时候要使用我们耳熟能详的控制变量法,就是我们先看j=1的时候,就是第一个料场,他向6个工厂输送的水泥量的总和不能超过他的日储备量,j=2时候,就表示第二个料场向6个工厂输送的水泥量的总和不超过自己的日水泥储备量;

第二个约束条件就是说:第一个水泥工厂的水泥日使用量就是两个原料厂的运送给他的水泥的总量,使用数学语言进行表示就是d1=x11+x12,x11表示第一个原料厂向第一个工厂的运送量(这里四从后向前理解)Xij就表示第j个原料厂向第i个工厂运送的水泥的量。

(3)确定目标函数

这个里面有像个求和的符号,含义我们前面已经说过,相信你可以理解(这种的求和我们可以先对一个求和,再对另外的一个求和),具体就是我们先让j=1,也就是我们只看第一个原料厂,计算这个原料厂和其他的6个工厂的距离的总和,再让j=2,计算第二个原料厂和这6个工厂的总和,我们这两个求和符号相当于是计算了12个距离的总和,希望你能够理解。

(4)建立数学模型

模型包括我们上面提到的目标函数(12个距离的总和),约束条件(料场向工厂运送的水泥量不超过其储备量,以及每个工厂的水泥日用量di等于两个原料厂向他输送的水泥的和);

这个就是我们对于模型的问题分析:我们这个问题有2个小问:第一小问料场的位置确定,虽然涉及到距离的求解,但是这个距离我们可以直接求出来,是常数,这个就是典型的线性规划类问题;但是第二问的料场的位置不确定,我们需要使用坐标进行表示,这个时候根号,以及平方运算不是具体的数,这个就是典型的非线性规划的问题了;

由此可见,对于模型的识别很重要,我们只有分析之后得到模型的类别,才能使用对应的方法函数对于问题进行求解,这个也提醒我们同学们在学习的时候,不能一味学习模型,却不了解模型的适用场景,这个就得不偿失了。

下面的是我们对于为了方便写代码进行的一些操作(请理解,后续的代码会使用到),就是X的角标原来是两个数字,我们现在使用一个数字具体代替,我们要了解这1~12这12个角标的具体含义,举例说明一下:X12就代表第二个原料厂向第一个工厂运送的水泥量;

5.MATLAB代码祝逐字句讲解

(1)准备工作

我们先是把题目里面的已知信息转换成为数学语言,请根据注释进行理解,sqrt是求算数平方根的函数,这个里面是一个双重的循环,对于这个xy,我们应该正确的进行理解,对应的两个原料厂的坐标分别是(5,1)(2,7),我们这里是把两个横坐标放到了一起,两个纵坐标放到一起,希望读者正确的理解;

最后我们可以尝试打印输入l,可以看出来l是一个6*2的矩阵;这个矩阵的坐标值表示的就是原料厂和工厂之间的距离;

(2)因为我们的第一问是线性规划问题,就要用到我们之前介绍的linprog函数(不理解的伙伴可到我的主页数学建模专栏进行阅读)

这个函数的第一个参数代表的含义就是约束条件的变量的系数,第一个约束条件j可以取的值是1和2,所以有2个约束,有2个约束就有2行,我们一共有12个变量(x1~x12),所以矩阵的每一行就有12个数字,虽然某些没有用到,但是我们也要使用0进行代替;例如i=1是,我们的求和是1*x1+1*x2+1*x3+1*x4+1*x5+1*x6+0*x7+0*x8…………0*x12,因为j=1时,我们的第一个原料厂只能向6个工厂送原料,也就是x11 x21 x31 x41 x51 x61,我们的x7~x12代表的是x12 x22 x32 x42 x52 x62,这六个也是变量只不过是第二个原料厂的,我们现在考虑的是第一个原料厂,所以系数是0,同理,第二行表示的是j=2的时候的情况;希望你能够理解为什么第一行前六项是1,第二行后6项是1;

我们的代码里除了A这个矩阵,还有一行代码f,这个代码什么意思呢?我们前面已经看到,我们自己计算的两个点之间的距离是6*2的矩阵,我们的MATLAB进行运算的时候,不可以是这样的形式,必须是一行或者是一列才可以,我们需要把这个矩阵进行转化,我们这个地方转换成了1列,这一列是12个数,我们的l(:,1)表示的是取出第一列,后面有一个冒号表示的是换行;l(:,2)表示取出第二列的全部元素;

上面的A是我们的约束条件里面的不等式的系数,下面的Aeq是约束条件里面的等式的系数,第二个约束条件就是每个工厂每天的水泥用量就是两个原料厂的运送量之和;

这个地方的处理就非常的巧妙,可能初学者很难想到,我们理解即可:

eye函数是生成单位矩阵,我们的参数是6,表示的是生成6*6的单位矩阵,对角线的元素是1,其他的元素是0,然后两个拼接在一起,我们观察下面的6*12矩阵就可以发现,第一行的第1列和第7列是1,这个不正好可以表示X1和X7吗,也就是第一个水泥厂和第二个水泥厂向第一个工厂输送水泥的意义,以此类推,我们就理解了其他的五个工厂;这里更深入的理解应该是X11+0*X21+…………X21+0*X22+…………0*X62,我们的Aeq里面放的是系数,所以就是我们的矩阵第一行的元素,我们发现,eye函数组成的两个单位矩阵的拼接正好可以达到这个效果;

beq就是我们前面已经表示好的水泥的日用量,这个里面的123456就是行向量d里面对应的索引

接下来就可以直接使用函数进行求解了:

lb表示的是运输量的最小值,肯定是0啊,就是什么也不运输,

完整代码:

clear;clc;%清空工作区
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];%原料厂的位置纵坐标
d=[3 5 4 7 6 11];%每个工厂的日用水泥量

for i=1:6
    for j=1:2
        l(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);
    end
end

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=[0 0 0 0 0 0 0 0 0 0 0 0];

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

我们的输出结果可以在命令行的窗口里面进行查看:x   fval

如果你理解了前面的思路,相信你可以明白这个12*1的矩阵里面的每个数字的几何意义,例如3表示的就是第一个料场向第一个工厂运输的原料等等

fval:吨千米数

(3)接下来我们讨论的就是第二问的非线性规划问题,因为这个里面料场的位置是不确定的,所以我们要加上4个变量,分别表示两个料场的横纵坐标;

其次,因为是非线性规划,我们要使用这个求解2个点之间的距离的函数,我们需要把这个表达式告诉MATLAB,这个时候我们要写一个函数,最后在我们的代码里面区调用这个函数即可;

接下来我们看一下函数怎么写:

function表示的就是我们的自定义的函数,x13是第一个原料厂的横坐标,x14是第一个原料厂的纵坐标,x15就是第二个原料厂的横坐标,x16就是第二个原料厂的纵坐标f1最后的累加的结果就是我们的第一个原料厂的吨千米数,f2就是第二个原料厂的吨千米数,ff就是两个原料厂和6个工厂对应之后的总的吨千米数;

下面的就是我们的代码部分,我们在调用函数的时候就要使用@函数名进行调用,x0就是初始值,这个值可以是任意的,我们这里是用第一问的结果作为前面的12个元素的初始值,后面的4个元素的初始值使用第一问的原料厂的坐标值代替,这里读者可以自行设置;

我们的Aeq2原来是6行12列,现在我们加入了原料厂的坐标,我们需要补齐,就是增加4列,每列和原来的一样都是6行,我们把这24个元素全部初始化为0,让后添加进去即可;

lb2就是最小值,我们的4个坐标(原料厂的)是使用-inf代替,这里的-inf就是负无穷的意思,非线性规划的fmincon函数参数和我们的线性规划的linprog函数的函数参数基本一样,就是添加了前面的两项,第一项就是非线性的函数,第二项就是我们赋的初始值;

最后的打印结果x2就是我们的运送方案和对应的两个原料厂的坐标,X15就是第2个原料厂的横坐标,X16就是第二个原料厂的纵坐标,x13 x14就是对应的第一个原料厂的横纵坐标;

通过对比,我们发现改变料场位置之后,吨千米数从原来的136到现在90,可见大大提高效率

代码展示(小伙伴可在自己的电脑端运行):

clear;clc;%清空工作区

%f=[l(:,1);l(:,2)];
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,fval]=fmincon(@obj_f,x0,A2,b2,Aeq2,beq2,lb2);
x2,fval


%下面是自定义函数部分,就是我们的求解距离的函数

function ff=obj_f(x)
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;
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

以上均是自己的理解,不足之处请多指正,有任何不理解的地方请在评论区留言,笔者会尽己所能给你一个满意的答复 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

目录 一. 连续登录N天的用户数量 1)举例题目 2)分析思路 3)解题步骤 (a)Step1:选择12月的记录,并根据用户ID和登录日期先去重 (b)Step2:创建辅助列a_rk…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段,我们已经接触过STL中的部分…

Zynq 7000 系列中的JTAG和DAP子系统

Zynq 7000系列SoC器件通过标准JTAG调试接口提供调试访问。在内部,SoC设备器件在处理系统(PS)内部实现了一个Arm调试访问端口(DAP),同时在可编程逻辑(PL)内部实现了一个标准的JTAG测试…

中国人为什么不说自信,而说信天

中国人从来不说自信,中国人信天,老天爷是最公平的。做好自己,天命注定,我都这么努力了,老天爷不帮我帮谁? 中国人信天是有逻辑关系的,很简单:做错事情了或者结果不好了,…

LeetCode - 283.移动零

题目链接&#xff1a; LeetCode - 283.移动零 题目分析&#xff1a; ​​​​​ 题解代码&#xff1a; #include<iostream> #include<vector> using namespace std;class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, des…

Kafka入门介绍+集群部署+简单使用

Kafka入门介绍集群部署简单使用 简介核心概念Broker&#xff08;服务节点/实例&#xff09;Producer&#xff08;生产者&#xff09;Topic&#xff08;主题&#xff09;Partition&#xff08;分区&#xff09;Consumer&#xff08;消费者&#xff09;和Consumer Group&#xff…

volatility内存取证

记录一道volatility内存取证的题目&#xff0c;第一次遇到&#xff0c;现场把环境搞出来&#xff0c;现记录一些操作指令。 一、安装volatility3 1、新建一个kali虚拟机 新建的过程不再赘述。 2、下载volatility3 GitHub - volatilityfoundation/volatility3: Volatility …

21.组件组成

组件组成 组件最大的优势就是可复用性 当使用构建步骤时&#xff0c;我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件(简称 SFC) 组件组成结构 <template><div>承载标签</div> </template> <script> expor…

政安晨:【Keras机器学习示例演绎】(六)—— 通过 CT 扫描进行 3D 图像分类

目录 简介 设置 下载 MosMedData&#xff1a;胸部CT扫描与COVID-19相关发现 加载数据和预处理 建立训练和验证数据集 数据增强 定义 3D 卷积神经网络 训练模型 模型性能可视化 通过一次 CT 扫描进行预测 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

图像处理的魔法师:Pillow 库探秘

文章目录 图像处理的魔法师&#xff1a;Pillow 库探秘第一部分&#xff1a;背景介绍第二部分&#xff1a;库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解…

黑马---苍穹外卖总结上

1.功能模块 1.1 管理端功能 员工登录/退出 , 员工信息管理 , 分类管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 订单管理 &#xff0c;数据统计&#xff0c;来单提醒。 模块描述登录/退出内部员工必须登录后,才可以访问系统管理后台员工管理管理员可以在系统后台对员工信息进…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

Java 笔记 03:Java 基础知识,使用 IDEA 创建 Java 项目、设置注释颜色,以及自动生成 JavaDoc

一、前言 记录时间 [2024-04-21] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 本文讲述了…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 &#xff1a; S o r t i n g I t A l l O u t eg1&#xff1a;Sorting\ It\ All\ Out eg1&#xff1a;Sorting It All Out ( 蓝书例题&#xff0c;传递…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(2)——架构分析 - 核心思想环境搭建技术选型

4.架构分析 4.1.核心思想 超越一阶提示&#xff0c;通过增加静态知识库和信息检索方案或简单的总结方案来扩展语言模型。 将这些想法扩展到构建一个代理架构&#xff0c;该架构处理检索&#xff0c;其中过去的经验在每个时步动态更新&#xff0c;并混合与npc当前上下文和计划…

计算机视觉——OpenCV Python位运算与图像掩码

概述 位运算与图像掩码的结合允许对图像的特定区域进行精确的操作。通过使用位运算&#xff08;如AND、OR、XOR和NOT&#xff09;&#xff0c;可以基于掩码的选择性地修改图像数据。位运算与图像掩码结合使用的一些关键点和应用场景&#xff1a; 选择性修改&#xff1a; 通过位…

李宏毅2022机器学习/深度学习 个人笔记(1)

本系列用于推导、记录该系列视频中本人不熟悉、或认为有价值的知识点 本篇记录第一讲&#xff08;选修&#xff09;&#xff1a;神奇宝贝分类 如图&#xff0c;为了估算某个样本属于某类的概率&#xff0c;在二分类问题中&#xff0c;我们需要计算红框所示的4个参数&#xff0…

语义分割知识点:UNet、FCN、SegNet、PSPNet、DeepLab系列

语义分割知识点&#xff1a;UNet、FCN、SegNet、PSPNet、DeepLab系列 前言语义分割网络剖析UNet系列UNetUNet网络有几个主要的特点&#xff1a;从UNet结构图可以知道&#xff0c;收敛路径主要的过程为简要总结&#xff1a; UNet为什么UNet可以被剪枝?如何剪枝? 根据子网络在验…

如何打开局域网共享?

局域网共享是一种方便实现文件共享、打印共享和资源访问的技术。通过局域网共享&#xff0c;不同设备之间可以方便地共享文件和资源&#xff0c;提高工作效率和便利性。在网络环境中&#xff0c;使用天联组网工具可以更加快速地实现局域网共享&#xff0c;解决不同地区间的远程…

lesson03:类和对象(中)

1.类的6个默认的成员函数 2.构造函数 3.析构函数 4.拷贝构造函数 1.类的6个默认的成员函数 空类&#xff08;类中一个成员都没没有&#xff09;会有成员函数吗&#xff1f; 其实是有的&#xff01;如果我们在类中什么都不写&#xff0c;编译器会自动生成6个默认成员函数&a…