求matlab大神把 Lingo 代码转化为matlab代码

常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下:

S (Susceptible),易感者,指缺乏免疫能力健康人,与感染者接触后容易受到感染;

E (Exposed),暴露者 ,指接触过感染者但暂无传染性的人,可用于存在潜伏期的传染病;

I (Infectious),患病者,指有传染性的病人,可以传播给 S,将其变为 E 或 I ;

R (Recovered),康复者,指病愈后具有免疫力的人,如是终身免疫性传染病,则不可被重新变为 S 、E 或 I ,如果免疫期有限,就可以重新变为 S 类,进而被感染。

SIS传染病模型假设:
1.在疾病传播期内,研究区域内总人数N不变,既不考虑生死,也不考虑迁移。将该区域内的人群分为:易感染者、感病者和病愈免疫的移出者三类,以下简称易感染者,病人和移出者。在t时刻将这三类人群的数量分别记为S(t)、I(t)和R(t),t时刻这三类人在总人数中所占的比例分别记为s(t)、i(t)和r(t)。
2.每个病人每天有效接触的平均人数是常数λ,称为日接触率。当病人与健康者有效接触时,会使健康者受感染变为病人。
3.每天被治愈的病人占病人总数的比例为常数μ,称为日治愈率。病人被治愈后仍有可能被感染为病人,故假设1/μ是该疾病的平均传染期。
4.在初始时刻,只有少数个体处于感染状态,其他都是易感染状态。
5.假设疾病的时间尺度远小于个体生命周期,从而不考虑个体的出生和自然死亡对数据统计造成的影响。
6.完全混合:每一个个体与其他个体接触的机会均等。
根据以上假设可得:每个病人每天可使λ·s(t)个健康者变为病人,每天有μ·Ni个病人被治愈。
由该式中,接触数σ是病人在平均传染期内有效接触的人数。

SIS传染病模型构建:
由假设1可得,整个群体由易感染者,感染者,移出者构成,三者之间的关系如下:
将数据带入上述公式,求解微分方程即可得到各个变量随时间变化的情况。

已知6种国家排放标准的汽车目前的保有量、排放因子和升级成本(升级成本指的是低于该标准的每辆汽车升级到该标准的成本,例如:国6的升级成本为15000元,意味着国1到国5标准的车升级到国6标准每辆车需要15000元)如下表所示,计算在该情况下,达到减排55%目标的升级改造成本最低的升级方案(不改变汽车保有量)。

0

采用非线性规划,设定升级后的国1~国6的保有量为x1~x6,设定约束条件,求解合适的x1~x6。

% 由于 matlab非线性规划函数 fmincon要求目标函数只能有一个输入和一个输出, % 所以,其他影响目标函数值计算的变量需要通过定义为全局变量(global)实现传值 % 在减排比例限制下的最大允许排放量 % 该处的含义为升级前后汽车总保有量不变 % x为规划结果(升级之后的各标准汽车的保有量),fval为规划结果对应的目标函数值 %% 后处理方法(取得类似于整数规划的效果) % 解释一下为什么要进行后处理以取得似于整数规划的效果 % 因为题目最终需要的求解的是车辆的升级方案,但是车辆的数量是整数,需要采用整数规划 % 但是目前 matlab 无法进行非线性的整数规划,所以只能采取变通的方式,即: % 先使用非线性规划求解连续结果,对其结果向下取整之后,求解总量差额,将差额分别 % 添加至x的各个元素中,从新得到的解中选择效果最好的作为最终答案。 for i=1:length(A) % 将差额分别添加至x的各个元素中,计算每种情况对应的目标函数值 % 由于最终解x是升级之后的各标准汽车的保有量,故计算升级成本时需要先减去x0(初始保有量) % 得出各标准车辆的变动量,并且由于变动量为正的代表有车辆升级为该标准,会计算成本 % 反之,变得量为负的,说明该标准车辆升级为更高标准,该变化不计算成本,故变动量(x1) % 小于0的元素会被设置为0。 % 特别的 x1(x1<0)=0; 这步计算本身是非线性计算,所以,带有这一判断会使整个问题变为

非线性规划的思路简洁明了,借助MATLAB代码进行实现也并不困难,但是该技术路线并不完美,主要的存在以下三个问题:

(1)非线性规划的求解难度远高于线性规划,并且非线性规划本身不能完全保证其结果的全局最优性。在复杂问题背景下,非线性规划的求解难度会很高,所得出的解的质量也难以保证。

(2)MATLAB求解非线性规划的函数fmincon为其专有方法,也就意味着,该解题思路几乎仅能通过MATLAB实现,而不容易向其他平台(如C#、python等)迁移。

(3)该问题本身为整数规划问题,而MATLAB无法直接处理目标函数或约束条件为非线性的整数规划问题,不能保证其得出的连续解与题目要求的离散解(整数解)在全局最优处的一致性,并且后处理过程使用的贪心算法在面临复杂情况(例如:解空间很大,取整差额较多时)难以保证得出全局最优解(一定要尽可能取得全局最优的话可以考虑进行穷举,但是在解空间很大,取整差额较多时,穷举法并不适用)。

所以,需要转变思路并设计一种方法,将非线性规划问题转变为线性规划问题,并且能够进行整数规划。

一般情况下,将非线性问题转换为线性规划问题都是比较困难的。该问题显示为非线性规划的核心原因是在计算车辆的变动差额时,需要判断差额的正负性,并且将负值置为0,该过程为非线性过程,正是该过程的存在使得目标函数变为非线性函数。一种可行的方法是,将各排放标准车辆之间的变动量作为求解变量,即问题变为达到减排55%目标时,求解出国1升级为国2、国3、国4、国5和国6的车辆数目(分别为x12、x13、x14、x15、x16)、国2升级为国3、国4、国5和国6的车辆数目(分别为x23、x24、x25、x26)等,如图所示:

整数规划问题可以通过使用Lingo进行解决,Lingo代码如下:

!第一约束条件(减排量要符合要求); !第二约束条件(某标准的升级车辆不能超过该标准目前的保有量); !第三约束条件(车辆保有量不能为负);

参照Lingo的求解逻辑,可以设计MATLAB代码进行混合整数线性规划求解。但要注意,MATLAB的混合整数线性规划函数(intlinprog)以及线性规划函数(linprog)均需要自行编制约束条件矩阵(A,b),解向量以及约束条件设置方式如图所示:

%% MATLAB 混合整数线性规划求解方法 %% 计算第一约束条件(减排量要符合要求) %% 计算第二约束条件(某标准的升级车辆不能超过该标准目前的保有量) %% 计算第三约束条件(车辆保有量不能为负) %% 计算目标函数(成本最低) intcon=1:xNum; % 用于标记解向量xfinal中哪些自变量为整数,例如:intcon=[2,5];则解向量中排序第2和第5的自变量限定为整数

从求解结果来看,三种求解方法所得方案差异很小(仅国4和国5标准的汽车数目存在少量差异),目标函数值差异也很小。但是Lingo的求解效果最好,其次是MATLAB非线性规划,最后是MATLAB混合整数线性规划。

身份认证 购VIP最低享 7 折!

基于MATLAB和LINGO的数学实验_3_肖华勇编著_西北工业大学出版社 绝对的稀缺资源

我要回帖

更多关于 matlab工具箱生成代码 的文章

 

随机推荐