A8.2022年全国数学建模竞赛 B题-赛题分析与讨论
2022年全国数学建模竞赛 B题-赛题分析与讨论
说明:本文目前内容为 2021年国赛 B题,将于 2022/9/15 22:00 第一次更新, 2022/9/16 12:00 第二次更新,建议收藏.**
1. 2021年B 题(C4 烯烃广泛应用于化工产品及医药的生产)
-
C4 烯烃广泛应用于化工产品及医药的生产,乙醇是生产制备 C4烯烃的原料:
(1)问题的背景。好比 A题说了一段天眼,跟解题没有多大关系。 -
在制备过程中,催化剂组合(即:Co负载量、Co/SiO2和HAP装料比、乙醇浓度的组合)与温度对 C4烯烃的选择性和 C4烯烃收率将产生影响:
(1)选择性是什么,收率是什么?附录有说明。
(2)乙醇偶合制备 C4烯烃反应,有很多生成物。C4烯烃在生成物中的占比,就是选择性。我们希望生成物中 C4烯烃越多越好,也就是选择性越高越好。附录中“选择性”的定义实际是有歧义的,我们就不讨论了。
(3)转化率比较好理解,10个人逛淘宝,3个人下单了,转化率就是 30%。哦,不对,附录中说的是“单位时间内乙醇的单程转化率”,这是本题的官方定义。单位时间,暗示转化率与时间有关?单程转化率,暗示还有双程转化率?可逆反应?查了一下,没有双程转化率,单程转化率是指一次通过反应器的转化率,与之相对的是产物中原料分离后再次重复进入反应器反应的总转化率。不是很明白,反正跟本题没关系。
(4)催化剂组合,题目给出的定义是:Co负载量、Co/SiO2和HAP装料比、乙醇浓度的组合,定义是否合理、严密就不用考虑了,反正题目说的催化剂组合就是指这 3个独立或关联的变量。初步分析,这 3个变量都可以独立地自由调整,但对于转化率和选择性的影响不一定是相互独立的。
(5)温度是催化剂组合之外的另一个变量,但温度属于操作变量,从附件看温度对转化率和选择性的影响最大。
(6)Co负载量(x1)、Co/SiO2和HAP装料比(x2)、乙醇浓度(x3)、温度(x4),这几个变量对转化率(y1)和选择性(y2)都会产生影响,即:y1=f1(x1,…x4)、y2=f2(x1,…x4)。 -
因此通过对催化剂组合设计,探索乙醇催化偶合制备C4烯烃的工艺条件具有非常重要的意义和价值:
(1)对催化剂组合设计,是指改变自变量 Co负载量(x1)、Co/SiO2和HAP装料比(x2)、乙醇浓度(x3)的数值。
(2)探索工艺条件,大概是指改变自变量温度(x4)的数值,不过乙醇浓度(x3)似乎也可以理解为工艺条件。
(3)重要的意义和价值:提高收率,获得利润最大化。 -
某化工实验室针对不同催化剂在不同温度下做了一系列实验:
(1)某化工实验室:吕同学的实验室,希望实验是准确的,数据是可靠的。
(2)针对不同催化剂:虽然不是说“针对不同催化剂组合”,但结合附件数据,好像并没什么区别。
(3)在不同温度下做了一系列实验:针对不同催化剂组合,给出了不同温度的转化率、选择性数据。 -
请通过数学建模完成下列问题:
(1)不是通过化学研究解决问题,化学专业的同学不要得意。
(2)至此,原则上可以跳出化学问题,把题目看成一个数学建模问题。 -
对附件1中每种催化剂组合,分别研究乙醇转化率、C4烯烃的选择性与温度的关系:
(1)附件1给出了编号 A1~A14、B1~B7 共21种催化剂组合。
(2)“对每种…分别研究…与温度的关系",不是研究 y1=f1(x1,…x4) 的关系,而是研究 yA1(T)、…、yB7(T)的关系。 -
并对附件2中350度时给定的催化剂组合在一次实验不同时间的测试结果进行分析:
(1)附件2 是给定的催化剂组合在350度时性能随时间的变化,y=f(t)。
(2)没有说明给定的催化剂组合是哪一种,也许需要通过分析找出来。
(3)“对每种…分别研究…与温度的关系,并对附件2…不同时间…结果进行分析”,暗示转化率、选择性既是温度的函数,也是时间的函数,附件 1、2 分别给出固定时间随温度的变化、固定温度随时间的变化。另外,这不是两个无关的问题,而是递进的问题。 -
探讨不同催化剂组合及温度对乙醇转化率以及 C4烯烃选择性大小的影响:
(1)问题二与问题一的区别,不再是“对每种…分别研究…与温度的关系“,而是把所有催化剂组合的数据作为一个整体来研究。
(2)没有涉及时间变化问题。
(3)问题一的结果与本问题的关系? -
如何选择催化剂组合与温度,使得在相同实验条件下C4烯烃收率尽可能高:
(1)典型的优化问题,目标函数收率最高,决策变量催化剂组合与温度(x1~x4)。根据附件数据计算出各组实验的收率数据。
(2)根据附录的名词解释,C4烯烃收率 = 乙醇转化率 x C4烯烃的选择性。
(3)要建立转化率数学模型和选择性数学模型。 -
若使温度低于350度,又如何选择催化剂组合与温度,使得C4烯烃收率尽可能高。
(1)在上一问的基础上,增加一个约束条件:温度低于350度。
(2)这里有个小问题:约束条件通常是小于等于或大于等于。温度低于350度,字面来说是小于350度,不包括等于350度。但是,如果最大值正好在边界点 350度怎么办?解答说 350度对不对,应该是不对的,那么349度,还是349.9度,还是349.9999度? -
如果允许再增加5次实验,应如何设计,并给出详细理由:
(1)增加实验当然要给出理由。这也暗示,问题是开放的,只要言之成理就可以。
2. 数据导入是所有数模编程的第一步
编程求解一个数模问题,问题总会涉及一些数据。
有些数据是在题目的文字描述中给出的,有些数据是通过题目的附件文件下载或指定网址提供的,还有些数据是需要自己搜集的。不论是哪种方式获得的数据,也不论哪种类型的问题和算法,首先都是要把这些数据以适当的方式和格式导入到程序中。
如果数据格式有问题,轻则读取数据时发生错误,要浪费时间去查找和解决,在数模竞赛中就会让人非常焦躁。数据错误还是轻的吗?对,重则读取数据有错误,程序却在继续运行,得到了错误的结果,这在数模竞赛中就更糟糕了。你可能都不知道发生了错误,就算感觉有问题也不会把错误直接锁定到数据导入部分,结果不停地去修改其它模块,直到把正确的模块也搞错了,最后无可救药。
因此,确保数模编程第一步“数据导入”的顺利完成,比原先的想象更重要。
Python 语言中数据导入的方法很多。对于数学建模问题编程来说,选择什么方法最好呢?答案是:没有最好的,只有最合适的。对于不同的问题,不同的算法,以及所调用工具包的不同实现方法,对于数据就会有不同的要求。另外,赛题所给数据文件中的数据组织方式不同,也需要使用不同的方法来导入数据。
例程 1:将数据导入作为单独的函数
# 子程序:定义优化问题的目标函数
def cal_Energy(X, nVar, mk): # m(k):惩罚因子
p1 = (max(0, 6*X[0]+5*X[1]-320))**2
p2 = (max(0, 10*X[0]+20*X[1]-7027)**2
fx = -(10*X[0]+9*X[1])
return fx+mk*(p1+p2)
# 子程序:模拟退火算法的参数设置
def ParameterSetting():
tInitial = 100.0 # 设定初始退火温度(initial temperature)
tFinal = 1 # 设定终止退火温度(stop temperature)
alfa = 0.98 # 设定降温参数,T(k)=alfa*T(k-1)
nMarkov = 100 # Markov链长度,也即内循环运行次数
youcans = 0.5 # 定义搜索步长,可以设为固定值或逐渐缩小
return tInitial, tFinal, alfa, nMarkov, youcans
例程 2:将数据导入集中写成一段,放在程序的起始部分
# 主程序
def main():
# 模型数据导入
p1 = [6, 5, -320]
p2 = [10, 20, -7027]
p3 = [10, 9]
print(p1,p2,p3)
# 算法参数设置
tInitial = 100.0 # 设定初始退火温度(initial temperature)
tFinal = 1 # 设定终止退火温度(stop temperature)
alfa = 0.98 # 设定降温参数,T(k)=alfa*T(k-1)
nMarkov = 100 # Markov链长度,也即内循环运行次数
youcans = 0.5 # 定义搜索步长,可以设为固定值或逐渐缩小
print(tInitial, tFinal, alfa, nMarkov, youcans)