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

news2024/11/26 12:52:56

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.coloradmin.cn/o/1600020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称:Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者:Xingang Li, Ying Qu 第一作者单位及通讯作者单位:北京师范大学地理学部 文章发表期刊:《Scientific data》&#xff08…

hot100 -- 链表(中)

不要觉得力扣核心代码模式麻烦,它确实比不上ACM模式舒服,可以自己处理输入输出 只是你对 链表 和 return 的理解不到位 👂 ▶ 屿前世 (163.com) 👂 ▶ see you tomorrow (163.com) 目录 🎂两数相加 🚩删…

android不同版本(支持>10)获取当前连接的wifi名称

1、AndroidManifest.xml 配置权限 <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name"android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name&q…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

Cohere Command R+:企业级可扩展大模型

Command R 是一种最先进的 RAG 优化模型&#xff0c;旨在处理企业级工作负载&#xff0c;并首先在 Microsoft Azure 上提供 今天&#xff0c;我们推出了 Command R&#xff0c;这是我们最强大、可扩展的大型语言模型 &#xff08;LLM&#xff09;&#xff0c;专为在实际企业用…

tailwindcss在manoca在线编辑智能感知

推荐一下monaco-tailwindcss库&#xff0c;它实现在monaco-editor网页在线编辑器中对tailwindcss的智能感知提示&#xff0c;在利用tailwindcss实现html效果布局。非常的方便。 生成CSS

Maven POM元素解析(二)

一、parent <parent>元素包含定位此项目将从中继承的父项目所需的信息。注意&#xff1a;此元素的子元素不是插值的&#xff0c;必须作为文字值给定。 ElementTypeDescriptiongroupIdString要从中继承的父项目的组id。artifactIdString要从中继承的父项目的项目id。ver…

python零基础入门笔记【源源老师】

1. print() 输出 &#xff08;1&#xff09;认识英文单词 print: 输出&#xff08;2&#xff09;print() 的作用 print()&#xff1a;用于在控制台上输出你想要的内容。 &#xff08;3&#xff09;代码演示 举例1&#xff1a; 【注意&#xff1a;】用双引号包裹的&#xff0…

java创建线程池的方法

简介 线程池是一种用于管理和重用线程的机制&#xff0c;它可以有效地管理线程的创建和销毁&#xff0c;减少线程创建和销毁的开销&#xff0c;并且能够控制并发线程数量&#xff0c;避免资源耗尽和系统过载。Java 提供了java.util.concurrent 包来支持线程池的实现。 1.Threa…

java(网络编程)

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

Qt | 事件第二节

Qt | 事件第一节书接上回 四、事件的接受和忽略 1、事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件) 2、使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示…

fork()的一道面试题

前言&#xff1a;题源 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main(void) {int i;for(i0; i<2; i){fork();printf("-");}wait(NULL);wait(NULL);return 0; }知道一点fork()这个系统…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

【云计算】云数据中心网络(四):IPv6 网关

云数据中心网络&#xff08;四&#xff09;&#xff1a;IPv6 网关 1.什么是 IPv6 网关2.IPv6 网关设计思路3.IPv6 网关的主要应用场景3.1 IPv6 私网通信3.2 IPv6 互联网通信3.3 IPv6 互联网通信&#xff08;仅主动访问&#xff09; 1.什么是 IPv6 网关 2017 年&#xff0c;中国…

WordPress 多站点切换域名完整指南:详细步骤和注意事项

因为公司的需要&#xff0c;需要对 WordPress 多站点进行域名切换, 一开始我也找了相关的方案和教程&#xff0c;但是很可惜&#xff0c;国内这一块网上的资料几乎为0&#xff0c;所以我把实现的过程写了一篇文章分享出来&#xff0c;为后来的人铺路。 开始之前&#xff0c;先…

Linux三剑客之awk篇

目录 1、awk 1.1、awk参数 1.2、awk变量 1.3、awk分割符 1.3.1、FS 1.3.2、OFS 1.3.3、RS 1.3.4、ORS 1.3.5、NF 1.3.6、NR 1.3.7、FNR 1.3.8、FILENAME 1.3.9、ARGC与ARGV 1.4、自定义变量 1.5、printf格式化输出 1、awk 作用&#xff1a;具有强大的文本格式化…

软考 - 系统架构设计师 - 嵌入式真题

问题 1&#xff1a; &#xff08;1&#xff09;.HTML 静态化&#xff1a;可以实现对系统经常访问的页面进行静态化以提高系统访问的效率&#xff0c;但系统页面通常需要数据库中的用户信息和用户选择来动态显示&#xff0c;因此不适合采用。 HTML 静态化&#xff1a; 将动态生成…

20240416如何使用git对本地文件进行上传

0 写在前面 年前收到硕导消息要搭建一下github仓库&#xff0c;一直没倒出时间整理&#xff0c;如今终于有时间搭建&#xff0c;顺带解决出现的问题。 1 安装git 安装git这步比较简单&#xff0c;随手一搜就有很多教程。git的作用主要是一种媒介&#xff0c;连接本地主机与G…

CC工具箱使用指南:【三调三大类面积汇总表(一首歌听到卡带)】

一、简介 群友定制工具。 CC工具箱已经做了一个三大类面积汇总表&#xff0c;奈何大家的模板好像还是都有点不太一样。 群友提供的模板如下&#xff1a; 可以看到&#xff0c;这里的土地权属信息很多&#xff0c;有乡镇、村民委员会、村民小组&#xff0c;还有用地权属信息【…

Linux 指令之文件

1.开发背景 记录 linux 下对文件操作的指令 2.开发需求 记录常用的文件操作指令 3.开发环境 linux 操作系统&#xff0c;如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 查找字符串 查找指定目录下包含指定的字符串 grep -rn "Timer frequency" .…