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

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.hqwc.cn/news/641889.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时,弹窗报错:加密狗未安装或检测异常;  问题原因:安装VM 的时候未选择软加密,选择了加密狗驱动,此时要使用软授权就出现了此现象。  解决方法: ① 首先确认软加密驱动正确安装…

面向对象练习坦克大兵游戏

游戏玩家(名称,生命值,等级),坦克,大兵类,玩家之间可以相互攻击,大兵拥有武器,用枪弹和反坦克炮弹,造成攻击不同,坦克攻击值固定,请设…

常见的数据抽取工具对比

1.什么是ETL? ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,是数据仓库的生命线。 …

用Python将原始边列表转换为邻接矩阵

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中,图是一种非常重要的数据结构,它由节点&#xff…

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例:基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失,为何权重更新是对的?1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…

(C++) 树状数组

目录 一、介绍 二、一维树状数组 2.1 区间长度 2.2 前驱和后继 2.3 查询前缀和 2.4 点更新 三、一维数组的实现 3.1 区间长度函数 3.2 前缀和 3.3 插入/更新 3.4 封装成类 一、介绍 树状数组(Binary Indexed Tree,BIT),又称为 …

YOLOv8-Pose推理详解及部署实现

文章转自:YOLOv8-Pose推理详解及部署实现 注意事项 一、2024/1/10更新 修改第 4 部分 YOLOv8-Pose 推理中后处理 iou 计算代码,原代码存在问题,原代码如下: def iou(box1, box2):def area_box(box):return (box[2] - box[0]) …

Midjourney-01 初试上手 注册使用并生成你的第一张AI图片 详细流程 提示词 过程截图 生成结果 付费文生图的天花板!

背景介绍 Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法来辅助用户进行绘画创作。这款软件能够通过用户输入的文本描述生成图像,支持多种生成方式,包括文字生成图片、图片生成图片和混合图片生成图片。 图像生成方式&#…

Spark Standalone模式部署

准备至少2台虚拟机,装好linux系统,我装的是Ubuntu20.04。 1.修改主机名(每台) 1)修改/etc/hostsname内容,主节点改为master,子节点改为slaver1 sudo vim /etc/hostname 2)在/etc/…

QT----MP3播放器搜索引擎

代码地址:GitHub 文档与提交记录章节相同,方便查看代码变动。视频教学里的酷狗api已经无法使用,自己摸索了一下,还学到了点爬虫知识。教学视频是我废了好大劲搞来的,三连关注点赞评论进入个人博客领取啦 1 新建项目 …

面试算法准备:动态规划

这里写自定义目录标题 1 理论2 例题2.1 斐波那契数列(什么是重叠子问题)2.1.1 带备忘录的递归解法 2.2 零钱兑换(讲解最优子结构)2.3 最长递增子序列(讲解如何求解状态转移方程)2.4 俄罗斯套娃信封问题&…