2025华数杯数学建模A题完整论文:多孔膜光反射性能的优化与控制_2025数学建模竞赛解题思路
2025华数杯数学建模A题完整论文:多孔膜光反射性能的优化与控制,完整内容见文末名片。下文为问题一部分内容
问题一基于各环节物理机理,将蒸发环节采用动力学模型,析出环节采用质量平衡模
型,布朗运动环节采用粒子扩散动力学模型,大液滴形成及增大环节采用粒子碰撞动
力学模型,设定材料初始参数、各环节参数,依据质量守恒定律等构建各组分质量平
衡方程,通过分步机理建模法将各子模型整合,最终推导出孔面积占比与温度、湿
度、固含量及待定参数相关的理论模型表达式
问题二采用Levenberg-Marquardt算法及带参数约束的非线性最小二乘法,以模型预
测孔面积占比与实测值平方和为目标函数,对12个非线性参数进行拟合。在求解过程
中,通过四阶龙格-库塔法求解DMF蒸发微分方程,计算析出量、粘度等中间变量,
经迭代优化得到参数估计值。随后利用决定系数、残差分析及预测误差对模型进行检
验
问题三采用全因子遍历搜索法,生成所有27种组合,代入应用模型计算孔面积占比预
测值,比较后筛选出最优制备条件,并通过与实测值对比验证结果
问题四采用三因素方差分析,识别出温度、固含量及二者交互效应显著,湿度不显
著,进而剔除湿度并在模型中加入温度与固含量交互项重新建模。运用改进的
Levenberg-Marquardt算法拟合调整后模型参数,然后采用简化变量的全因子遍历搜索法确定新的最优制备条件,与问题三结果对比
第一问:多孔膜孔面积占比理论模型的建立与求解
一、问题要求
结合多孔膜制备的五个步骤(制备材料的蒸发、环丁砜与醋酸纤维素的析出、环丁砜小液滴的布朗运动、大液滴的形成及增大),通过机理分析推导描述多孔膜孔面积占比的理论模型,明确模型中各参数的物理意义,并说明建模过程中对复杂物理现象的简化假设及其合理性。
二、问题分析
本问题的核心是通过对多孔膜制备全过程的机理拆解,建立孔面积占比与关键工艺参数(如温度、湿度、固含量等)之间的定量关系。多孔膜的孔结构主要由制备过程中析出的环丁砜液滴经蒸发后留下的孔隙决定,因此需从五个串联步骤的物理本质出发,揭示“溶剂蒸发→溶质析出→液滴运动→液滴聚并与生长→孔隙形成”的内在逻辑链。
问题核心目标:最终需得到一个能描述孔面积占比
与温度T 、湿度 H 、固含量$ SC $等可调控参数之间关系的理论模型,为工艺优化提供定量工具。
建模思路:由于制备过程涉及多物理场耦合(传质、相分离、胶体运动等),直接建立整体模型难度较大,因此采用“分步机理建模+变量耦合”策略:将五个步骤视为串联子过程,每个子过程基于其物理机理(如蒸发基于蒸气压差,析出基于溶解度平衡,布朗运动基于分子动力学等)建立子模型,再通过关键变量(如DMF质量、析出量)将子模型串联,最终形成孔面积占比的积分表达式。
求解算法选择:采用“分步机理建模法”拆解复杂过程,确保各子模型物理意义明确;结合“守恒定律分析法”(质量守恒、能量守恒)确保模型严谨性;数值求解采用龙格-库塔法处理微分方程(如DMF蒸发动力学),积分法计算大液滴总质量,以实现从瞬态参数到最终孔面积占比的映射。
三、完整数学模型建立
(一)变量与参数定义及约束条件
1. 基础变量与材料参数
2. 过程参数与约束
(二)模型假设及合理性说明
为简化复杂物理过程,基于实验现象和文献规律,提出以下关键假设:
DMF完全蒸发假设:假设制备过程中DMF最终完全挥发
合理性:DMF挥发性强(沸点153°C),在常规制备条件下(如60°C烘干)可充分挥发,残留量远小于1%,对后续析出和液滴形成影响可忽略。
- 小液滴单分散性假设:假设析出的环丁砜小液滴半径均为$ r $,呈球形单分散分布。
合理性:初始析出阶段,环丁砜过饱和度低,成核均匀,小液滴尺寸差异较小;采用平均半径r 可简化数密度、碰撞频率等计算,后续可通过实验数据反推$r 的有效值。
- 纤维素析出仅影响粘度假设:假设析出的醋酸纤维素不参与液滴碰撞/吸收,仅通过体积分数增加溶液粘度,影响小液滴布朗运动。
合理性:醋酸纤维素为高分子聚合物,析出后形成凝胶网络,其刚性结构对小液滴的空间阻碍主要体现为粘度增加,而直接碰撞捕获小液滴的概率极低(与液滴尺寸相比,纤维素分子链尺度更小)。
- 溶解度平衡假设:环丁砜和醋酸纤维素的析出量由DMF的溶解度决定,即当DMF质量低于溶解所需阈值时,过量部分立即析出。
合理性:溶液中溶质溶解遵循“溶解-析出平衡”,DMF作为良溶剂,其质量减少会导致溶解能力下降,过量溶质以液滴/固体形式析出,该过程动力学远快于蒸发速率,可近似为瞬时平衡。
import numpy as np from scipy.integrate import solve_ivp def porous_membrane_model(params): \"\"\" 多孔膜孔面积占比理论模型求解函数 参数: params: 字典,包含所有模型参数 返回: P_p: 孔面积占比(%) t_evap: 蒸发结束时间(s) m_S2_total: 大液滴总质量(g) \"\"\" # 参数验证 required_params = [\'m_S_initial\', \'S_S\', \'m_C_total\', \'S_C\', \'rho_D\', \'rho_S\', \'rho_C\', \'A\', \'B\', \'C\', \'T\', \'k1\', \'k_h\', \'H\', \'r\', \'eta0\', \'k_B\', \'k_form\', \'k_grow\', \'k_final\', \'m_D_initial\'] for param in required_params: if param not in params: raise ValueError(f\"参数缺失: {param}\") # -------------------------- # 定义微分方程右侧函数(核心计算) # -------------------------- def dv_dt(t, y): \"\"\" 微分方程组右侧函数:计算DMF质量变化率和大液滴质量变化率 y = [m_D, m_S2],其中: m_D: 当前DMF质量(g) m_S2: 当前大液滴总质量(g) 返回: dy_dt: 导数 [dm_D/dt, dm_S2/dt] \"\"\" # 提取当前状态变量 m_D = y[0] # DMF质量(g) m_S2 = y[1] # 大液滴总质量(g) # 防止数值问题:确保质量非负 m_D = max(m_D, 0.0) m_S2 = max(m_S2, 0.0) # -------------------------- # 1. 析出环节:计算环丁砜和醋酸纤维素析出量 # -------------------------- # 环丁砜析出量(g):m_S_precipitated = max(初始环丁砜 - DMF质量×溶解度, 0) m_S_precipitated = max(params[\'m_S_initial\'] - m_D * params[\'S_S\'], 0) # 醋酸纤维素析出量(g):m_C1 = max(总醋酸纤维素 - DMF质量×溶解度, 0) m_C1 = max(params[\'m_C_total\'] - m_D * params[\'S_C\'], 0) # -------------------------- # 2. 溶液体积计算(用于蒸发速率和数密度计算) # -------------------------- # 溶液体积V_solution(cm³)= DMF体积 + 未析出环丁砜体积 + 总醋酸纤维素体积 # (注:析出的醋酸纤维素仍在溶液中,体积=总醋酸纤维素/密度) V_solution_cm3 = (m_D / params[\'rho_D\'] # DMF体积:质量/密度(g/(g/cm³)=cm³) + (params[\'m_S_initial\'] - m_S_precipitated) / params[\'rho_S\'] # 未析出环丁砜体积 + params[\'m_C_total\'] / params[\'rho_C\']) # 总醋酸纤维素体积(析出+未析出) # 防止数值问题:溶液体积过小 V_solution_cm3 = max(V_solution_cm3, 1e-9) # 转换为m³(1 cm³ = 1e-6 m³) V_solution_m3 = V_solution_cm3 * 1e-6 # -------------------------- # 3. 蒸发环节:计算DMF蒸发速率 # -------------------------- # Antoine方程计算DMF饱和蒸气压(Pa):log10(P_sat) = A - B/(C+T) log_P_sat = params[\'A\'] - params[\'B\'] / (params[\'C\'] + params[\'T\']) P_sat = 10 ** log_P_sat # 饱和蒸气压(Pa) # 液态DMF浓度c(g/cm³):c = m_D / V_solution_cm3 c = m_D / V_solution_cm3 # 蒸发速率v_vap(g/s):v_vap = k1 * (100 - k_h*H)/100 * c * P_sat # (k1单位:g/(s·Pa·cm³);c单位:g/cm³;P_sat单位:Pa → 乘积单位:g/s) humidity_factor = (100 - params[\'k_h\'] * params[\'H\']) / 100 v_vap = params[\'k1\'] * humidity_factor * c * P_sat dm_D_dt = -v_vap # DMF质量变化率(g/s):负号表示减少 # -------------------------- # 4. 布朗运动环节:计算小液滴扩散系数和速度 # -------------------------- # 析出纤维素体积分数Φ_C1:Φ_C1 = (析出纤维素体积) / 溶液体积 # 析出纤维素体积 = m_C1 / rho_C(g/(g/cm³)=cm³) Phi_C1 = (m_C1 / params[\'rho_C\']) / V_solution_cm3 # 混合物粘度η(Pa·s):爱因斯坦方程η = η0*(1 + 2.5Φ_C1) eta = params[\'eta0\'] * (1 + 2.5 * Phi_C1) # 扩散系数D(m²/s):斯托克斯-爱因斯坦方程D = k_B*T/(6πηr) # (k_B:玻尔兹曼常数;T:热力学温度(K)= 摄氏温度+273.15;η:粘度;r:小液滴半径) T_kelvin = params[\'T\'] + 273.15 D = (params[\'k_B\'] * T_kelvin) / (6 * np.pi * eta * params[\'r\']) # 小液滴平均速度v_avg(m/s):v_avg ∝ sqrt(D),假设比例系数为1(模型简化) v_avg = np.sqrt(D) if D > 0 else 0 # -------------------------- # 5. 大液滴形成及增大环节:计算大液滴质量增长 # -------------------------- # 小液滴数密度n(m⁻³):单位体积内小液滴数量 if m_S_precipitated == 0: # 无析出时,数密度为0 n = 0 c_S1 = 0 # 小液滴质量浓度(g/m³) else: # 析出环丁砜体积(m³):(质量/密度)×1e-6(cm³→m³) vol_S_precipitated_m3 = (m_S_precipitated / params[\'rho_S\']) * 1e-6 # 单个小液滴体积(m³):(4/3)πr³ vol_droplet = (4/3) * np.pi * (params[\'r\'] ** 3) # 防止数值问题:单个液滴体积过小 if vol_droplet 0 else 0 # 碰撞形成大液滴质量form(g/s):form = 碰撞形成系数×碰撞频率 form = params[\'k_form\'] * Z # 大液滴吸收小液滴质量m_grow(g/s):m_grow = 增长系数×速度×小液滴浓度×当前大液滴质量 m_grow = params[\'k_grow\'] * v_avg * c_S1 * m_S2 if (c_S1 > 0 and m_S2 > 0) else 0 # 大液滴质量变化率(g/s):dm_S2/dt = 碰撞形成质量 + 吸收质量 dm_S2_dt = form + m_grow # 返回微分方程组结果 return [dm_D_dt, dm_S2_dt] # -------------------------- # 定义终止条件:当DMF质量小于1e-6g时停止计算(认为蒸发完毕) # -------------------------- def event(t, y): return y[0] - 1e-6 # 触发条件:m_D = 1e-6g event.terminal = True # 满足条件时终止求解 event.direction = -1 # 仅当m_D减小时触发 # -------------------------- # 求解微分方程组 # -------------------------- # 初始条件:y0 = [初始DMF质量, 初始大液滴质量] y0 = [params[\'m_D_initial\'], 0.0] # 时间范围:从0到最大模拟时间(1e5s,约27小时,确保蒸发完毕) t_span = (0.0, 1e5) # 调用solve_ivp求解(龙格-库塔法) solution = solve_ivp( fun=dv_dt, # 微分方程函数 t_span=t_span, # 时间范围 y0=y0, # 初始条件 events=event, # 终止条件 rtol=1e-6, # 相对 tolerance atol=1e-6 # 绝对 tolerance ) # 检查求解是否成功 if not solution.success: print(f\"求解器警告: {solution.message}\") # -------------------------- # 计算结果提取 # -------------------------- t_evap = solution.t[-1] # 蒸发结束时间(s):最后一个时间点 m_S2_total = solution.y[1, -1] # 大液滴总质量(g):最后一个状态的m_S2 P_p = params[\'k_final\'] * m_S2_total # 孔面积占比(%):转换系数×大液滴总质量 return P_p, t_evap, m_S2_total # -------------------------- # 主程序:参数设置与模型求解 # -------------------------- if __name__ == \"__main__\": # -------------------------- # 参数设置(根据问题描述和文献初始值) # -------------------------- # 固含量(SC):6%、8%、10%,对应m_C_total为1.8g、2.4g、3.0g SC = 6 # 固含量(%) m_solvent = 30 # 溶剂总质量(g) params = { # 材料初始参数 \'m_D_initial\': 24.0, # DMF初始质量(g) \'m_S_initial\': 6.0, # 环丁砜初始质量(g) \'m_C_total\': (SC * m_solvent) / 100, # 醋酸纤维素总质量(g) \'rho_D\': 0.944, # DMF密度(g/cm³) \'rho_S\': 1.26, # 环丁砜密度(g/cm³) \'rho_C\': 1.3, # 醋酸纤维素密度(g/cm³) # 蒸发环节参数 \'k1\': 1e-8, # 蒸发速率系数(g/(s·Pa·cm³)):假设值 \'k_h\': 0.5, # 湿度抑制系数(0-1):假设值 \'A\': 6.9, # Antoine方程参数A:假设值(用于计算饱和蒸气压) \'B\': 1200, # Antoine方程参数B:假设值 \'C\': 230, # Antoine方程参数C:假设值 \'T\': 25, # 温度(°C) \'H\': 50, # 湿度(%) # 析出环节参数 \'S_S\': 0.2, # 溶解度(DMF对环丁砜,g/g):假设值 \'S_C\': 0.1, # 溶解度(DMF对醋酸纤维素,g/g):假设值 # 布朗运动环节参数 \'r\': 1e-6, # 小液滴半径(m):文献参考值 \'eta0\': 0.0008, # 纯DMF粘度(Pa·s):文献参考值 \'k_B\': 1.38e-23, # 玻尔兹曼常数(J/K) # 大液滴形成及增大参数 \'k_form\': 1e-12, # 碰撞形成系数(g·s):假设值 \'k_grow\': 1e-8, # 增长系数(m³/g):假设值 \'k_final\': 0.1 # 孔面积转换系数(%/g):假设值 } # 打印当前计算的固含量 print(f\"固含量: {SC}%,醋酸纤维素总质量: {params[\'m_C_total\']}g\") # -------------------------- # 调用模型求解 # -------------------------- P_p, t_evap, m_S2_total = porous_membrane_model(params) # -------------------------- # 输出结果 # -------------------------- print(\" 多孔膜孔面积占比理论模型计算结果:\") print(f\"蒸发结束时间:{t_evap:.2f} s({t_evap/60:.2f} min)\") print(f\"大液滴总质量:{m_S2_total:.6f} g\") print(f\"孔面积占比:{P_p:.2f} %\") # 批量计算不同固含量下的孔面积占比 SC_values = [6, 8, 10] results = [] for sc in SC_values: params[\'m_C_total\'] = (sc * m_solvent) / 100 P_p, t_evap, m_S2_total = porous_membrane_model(params) results.append((sc, P_p, t_evap, m_S2_total)) print(\" 不同固含量下的孔面积占比:\") for sc, pp, te, ms in results: print(f\"固含量: {sc}%, 孔面积占比: {pp:.2f}%, 蒸发时间: {te/60:.2f} min, 大液滴质量: {ms:.6f} g\")