数学建模--深入剖析线性规划(模型全方位解读+代码分析)

1.简介

(1)线性规划三要素

(2)模型适用赛题

2.典例讲解


(1)问题分析

目标函数是净收益尽可能大,风险尽可能小;

                           约束条件是交易费的分段函数,以及每一笔投资都是非负数;


(2)模型假设

模型假设是我们进行建模的时候必须要进行的,我们应该逐步地学习;对于这道题目,我们首先要理清各个变量的意义,以及不同变量之间的各种关系;这个里面的交易费是一个分段函数,我们的投资小于一个指定的数字的时候,需要付对应的交易费,大于这个数字的时候,只需要按照一定的比率进行付交易费即可,这个指定的数据就是ui,我们举一个很简单的例子,我们的投资以100作为分界线,当我们投资20的时候,我们就要付交易费20,但是如果我们投资是2000(任意大于20的数字,就只需要按照一定的比率付交易费,也就是说不同的投资,我们的交易费的计算方法是不一样的;

我们上面的假设的意义何在呢?假设每一笔交易的投资金额足够大,我们就只需要按照一定的费率付交易费,这样就把原来的分段函数的两种情况变成了只有现在的一种情况,这样就简化了我们的模型,这就是模型假设的意义,相信你已经get到了!

(3)模型建立

我们上面已经看到了4种投资方案对应的相应的数据,我们下面进行模型的建立;

我们前面已经提到了目标函数和约束条件,下面我们将这些文字语言转换为数学语言;


我们的目标函数就是总利润最大:xi就是每个项目的投资,例如x1就是第一个项目的投资,x1*r1就是投资乘上平均的收益率,得到的就是对应的收益,因为我们还有付的交易费x1*p1就是第一个项目投资的交易费,x1*r1-x1*p1就是我们的第一个项目投资净赚的利润,依次分别计算其他的三个项目的投资,最后求和就是我们的净收益;(但是实际上这里的i是从0开始的,不知道你有没有注意到(我最开始没有注意到),这个就是我们的4个项目的利润收益加上我们的剩下的资金x0,因为x0是不存在交易费的,这个x0是存在银行里面有利息的,所以我们可以直接加上对应的利息,相当于这个收益是前四个项目的收益加上我们这个时候剩下的资金存银行产生的利息);


我们的目标函数还要求总体的风险尽可能小,我们也要分别计算单个项目的投资的风险最后相加,那么单个项目的投资的风险如何计算呢?为什么下面的图片里面又是max又是min,我们应该如何进行理解呢?


这里的max显然是最小值,我们的4种投资都有对应的风险,我们分别计算4种方案的投资风险,在这四个投资风险里面求得最大值(比如我们计算之后发现第3种是风险最大),这个最大值就说明这4个投资里面,3号投资的风险对我们的整个投资的影响最大,我们可以简单地认为只要3好的风险最小,我的这4项投资的风险就最小(这里显然是不够严谨的,但是我们还是忽略了这个误差,有些时候,想要得到精确的解,我们就要付出更大的代价,我们要比较付出的代价是否值得,这里我们认为是没必要的,只要把最大的单个项目的风险降低到最低,我们就近似地认为这4个项目的风险就是最低的),最后我们对这个单个项目的风险求最小值;

约束条件就是我们的投资加上我们的交易费的和等于我们的全部资金,因为我们的资金一部分是投资的,剩下的就是投资的过程中需要付的交易费;xi就是每个项目所投的资金必须是大于0的;

(4)模型简化

合理的模型简化,可以让我们对于模型的求解事半功倍,相信你已经意识到了,前面的分别计算4种投资的风险,取最大值,再求其最小值,让人很不舒服,很对小伙伴难以理解;下面我们对这个目标函数进行简化进而简化我们的模型;

我们假设风险率小于某个确定的值,就是为这个总风险最小,这个确定的值就是a,我们表示出风险率使之小于a,这样简化之后,你就会发现,我们的目标函数,从原来的两个到现在的一个,这个投资风险就变成了一个约束条件,只要求表示的投资风险小于我们的a即可;

经过这个简化之后,我们的模型就是一个目标函数(总的收益最大)和3个约束条件(风险小于这个特定的常数,交易费和我们投入的资金两者的和等于总资金,每一项的投资都是非负数)-----这个就是单目标的线性规划模型;

(也许看到这里,你会觉得,这个模型简化也太神奇了吧,我怎么可能想得到,这个时候,千万不要灰心,我们现阶段只需要理解即可,熟能生巧,数模的学习不能急于求成);

(5)模型改进

我们前面已经提到,不同的人进行投资的时候,所能够承担的风险肯定是不一样的,显示投资里面的a肯定是一个变量,我们在MATLAB调用对应的函数的时候需要这个a是一个常量才可以带入函数,这个时候我们在论文里面写作“模型改进”;

具体的做法就是每次计算的时候,代入的a的值是不一样的,但是我们的模型里面的a是一个常数,我们实际代入的时候把a当作一个变量进行带入;小伙伴们要理解这个思路。 

3.模型求解

(1)对MATLAB函数的介绍

理解标准型,把我们的目标函数化为标准型;MATLAB函数使用的时候,我们输入的变量必须是标准型才可以进行求解,标准形是求最小值,我们想要求解的目标函数是净收益的最大值,我们只需要加负号就可以了,具体的操作如下图所示:

(2)函数的参数的介绍

数据来源,计算的时候不要直接拿表格里面的数据运算,后面还是有一个百分号的呦!

下面的就是这个函数进行调用的时候需要使用到的几个对应的参数:

f:计算的就是pi-r1,这里一定要切记后面的百分号,例如,第一个就是银行的p1(交易费0)减去平均收益率(也就是利息0.05)就是图里面的-0.05,第2个是1%-28%即,0.01-0.28=-0.27,依次计算;

A:显然,这个是一个4行5列的矩阵,我们首先要清楚的是这个矩阵的行数和列数分别代表的是什么;A计算的就是对应的风险率;行数4表示的是这4个项目,虽然有5个变量,但是银行存款生利息是没有风险的,所以我们只用这个矩阵的4行分别表示x1,x2,x3,x4;每一行有5个数据,这5个数代表的就是风险损失率,第一个项目的风险就是2.5%,和其他的没有关系,因为我们有5个变量,所以我们写了每行是5个值,如果没有体现这个变量,我们就在对应的位置写上0即可;

b:就是对应的风险,我们模型里面不是把这个风险a设置为常数吗,我们先是让a等于0.05,然后是每次计算换其他的值;所以b这个列向量就是4个0.05;

Aeq:代表的就是第二个约束条件,1加上交易费率,因为银行的没有交易费,所以直接是1,其他的四个都要加上对应的交易费率;

Beq就是我们的M,即总共的资金,我们记作1;

lb:就是每个投资都是非负数,我们的lb就是最小值,即0;最大值其实就是不超过我们的全部资金,即最大值1,但是因为我们前面的约束条件之下,这个单个项目的投资不可能是1,所以这个地方写不写都不会有任何的影响;

(3)MATLAB代码

我们试着理解一下:代码里有一部分就是我们前面分析的过程;

1.clc,clear是清空之前定义的一些变量,防止不必要的报错;

2.zeros(4,1)是生成4行一列的0矩阵,diag是对角矩阵(线性代数知识);

3.LB是5行1列的列向量,全部是0;

4.Q就是净收益,我们还没计算,先定义了一个空的向量,最后把计算的结果放进去即可;

5.循环里面相当于是循环了51次,就是a是以0开始,使用0.001作为步长,以0.5结束,进行求解的,所以是循环了51次,b就是每次循环的时候对应的不同的风险率,4行1列的矩阵;之后调用函数linprog传参求解,MATLAB标准型求的是最小值,我们的循环第四行取相反数得到的是最大值,Q就是最大的投资收益,XX就是对应不同的项目的具体投资金额;

我们通过工作区点击对应的变量就可以查看对应的矩阵,点击xx就可以看到对应每次循环的时候,具体的不同的投资方案;

6.最后的三行就是作图部分的一些命令plot绘制平面坐标轴,*r就是坐标曲线的一种表示的形式,例如是实现还是虚线,使用点还是圆圈,或者是星号,这些等等都有对应的表示方法,读者可以自行的进行了解;

图像:

感兴趣的小伙伴下去可以自行尝试:

clc,clear;
a=[0:0.001:0.05];
f=[-0.05,-0.27,-0.09,-0.185,-0.185];
A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
Aeq=[1,1.01,1.02,1.045,1.065];
beq=1;
LB=zeros(5,1);
Q=zeros(1,length(a));
XX=[];
for i=1:length(a);
    b=a(i)*ones(4,1);
    [x,y]=linprog(f,A,b,Aeq,beq,LB);
    Q(i)=-y;
    XX=[XX;x'];
end
plot(a,Q,'*r')
xlabel('风险率')
ylabel('最大收益')

(4)结果分析

这个计算的结果只是粗略值(不同的软件有偏差),具体的方案:

不同的项目投资金额:可在工作区里面的xx查看;(对应的单位是万元,我们看到的结果要乘上1000才是真正的结果)

总的净收益Q可在工作区查看;Q是1*51的向量,可以观察到最后的时候收益就已经不变了,和我们的图像结果是吻合的;

能够看到这里,我相信你一定有所收获,上面的文字均是自己的理解,自己的语言,希望能帮助到你,对于任何问题,欢迎在评论区和我交流,感谢!

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

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

相关文章

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上,开始没测试绘图部分功能,只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误: (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好,我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前,必须先介绍一下旧版本的粒子系统。   在UE4的时候,虚幻引擎的粒子系统叫做Cascade&#x…

【iOS】——SDWebImage源码学习

文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库,可以给UIKit框架中的控…

思维导图ai生成软件分享5款好用的!

思维导图ai生成软件分享5款好用的! 在快节奏的信息时代,思维导图作为一种有效的思维整理工具,越来越受到人们的青睐。它能够将复杂的思维过程可视化,帮助我们更好地梳理思路、规划工作。近年来,随着人工智能技术的飞速…

整数运算超越存储单元表示范围:上溢出、下溢出、回绕

示例&#xff1a; /*** brief how about integer-underflow-overflow? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <std…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

java-spring 图灵 04

在Spring框架中&#xff0c;可以使用org.springframework.core.io.support.ResourcePatternResolver接口的resolveBasePackage方法来将指定的基础包解析为用于包搜索路径的模式规范。 例如&#xff0c;如果基础包是com.example.app&#xff0c;则可以使用resolveBasePackage方法…

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】

之前用NSL-KDD数据集做入侵检测的项目是&#xff1a; 【1】https://qq742971636.blog.csdn.net/article/details/137082925 【2】https://qq742971636.blog.csdn.net/article/details/137170933 有人问我是不是可以改代码&#xff0c;我说可以。 训练 我将NSL_KDD_Final_1.i…

Open3D 无效点滤波(32)

Open3D 无效点滤波(32) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 这个算法的目标是从点云数据中去除无效的点,这些无效点可能是由于坐标值为无穷大(inf)或者不是数字(NaN)而产生的。这些无效点可能会导致后续处理步骤出现错误或异常,因此在处理点云数据时需…

品深茶创始人是谁?

据说&#xff0c;品深茶的创始人之前是一个程序员&#xff0c;他在软件行业工作十多年&#xff0c;由于常年熬夜加班再加上抽烟喝酒等不良习惯&#xff0c;导致在一次体检中被查出患上了肾癌&#xff0c;对他来说&#xff0c;期待的财务自由还没实现&#xff0c;身体就已经完蛋…

java(网络编程)

什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输 Java中可以使用ja…

CSS基础:width,height尺寸属性详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web…

vue脚手架CLI的简单使用

目录 初始化脚手架说明具体步骤模板项目的结构main.js入口文件app.vuemain.jsrender main.js 修改默认配置 初始化脚手架 说明 Vue 脚手架是 Vue 官方提供的标准化开发工具&#xff08;开发平台&#xff09;。最新的版本是 4.x。文档: https://cli.vuejs.org/zh/。 具体步骤 …

QFS [VLDB‘13] 论文阅读笔记

原论文&#xff1a;The Quantcast File System (VLDB’13) QFS简介及技术要点 QFS&#xff08;Quantcast File System&#xff09;是由Quantcast开发的一个高效、可扩展的分布式文件系统&#xff0c;旨在提供与Hadoop分布式文件系统&#xff08;HDFS&#xff09;兼容的替代方案…

allure2教程-1-环境搭建

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 自动化测试执行完成后我们需要展示给其他人看&#xff0c;这就要有自动化测试报告了。复杂的测试报告当然可以自己代码实现&#xff0c;但用pytest-html或allure基本也能满足我们生成测试报告的要求了。本小节介绍…

如何基于香橙派AIpro将开源框架模型转换为昇腾模型

在前面的介绍中&#xff0c;我们知道了如何基于香橙派AIpro开发AI推理应用&#xff0c;也大致了解到在推理之前&#xff0c;需要把原始网络模型 (可能是 PyTorch 的、TensorFlow&#xff0c;可能是Caffe的等等) 转换成 .om 模型&#xff0c;然后才能调用昇腾的aclmdlExecute 等…

深度学习 Lecture 8 决策树

一、决策树模型&#xff08;Decision Tree Model) 椭圆形代表决策节点&#xff08;decison nodes)&#xff0c;矩形节点代表叶节点&#xff08;leaf nodes)&#xff0c;方向上的值代表属性的值&#xff0c; 构建决策树的学习过程&#xff1a; 第一步&#xff1a;决定在根节点…

Blender3.3 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

微博聚类文本分析和可视化

本文使用python抓取微博数据并对微博文本分析和可视化&#xff0c;LDA&#xff08;树图&#xff09;、关系图、词云、时间趋势&#xff08;折线图&#xff09;、热度地图、词典情感分析&#xff08;饼图和3D柱状图&#xff09;、词向量神经网络情感分析、tfidf聚类、词向量聚类…

家居网购项目(手写分页)

文章目录 1.后台管理—分页显示1.程序框架图2.编写数据模型Page.java 3.编写dao层1.修改FurnDao增加方法 2.修改FurnDaoImpl增加方法 3.单元测试FurnDaoTest 4.编写service层1.修改FurnService增加方法 2.修改FurnServiceImpl增加方法3.单元测试FurnServiceTest 5.编写DataUtil…
最新文章