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 留空待测。

映射表的结构关系

下图把“原始配方输入—字段归一化—派生计算—结构化记录”的关系画成一条数据流,同时标出单位约定与留空规则,便于在填表时对照检查。

原始配方输入 MMA 60 g / BA 35 g AA 5 g AIBN 0.8 g 乙酸乙酯 50 g 78 °C / 240 min 字段归一化 单体 → wt%(对单体总量) 引发剂 → phr(对单体) 溶剂 → wt%(对投料总质量) 温度 °C / 时间 min 单位固定,禁止混用 派生计算 solid_calc = 单体/总投料 Tg_calc:Fox 方程 initiator_phr 换算 conv_obs 待实测填入 派生列标注来源 结构化记录(映射表一行) batch_id MMA_wt BA_wt AA_wt init_phr solv_ratio T_set t_hold solid_calc Tg_calc B-001 60.00 35.00 5.00 0.800 33.33 78 240 66.67 21.6 conv_obs 留空(待实测) 未测列不得填 0,避免与真实零值混淆 单位约定:单体 wt% 对单体总量;引发剂 phr 对单体;溶剂 wt% 对投料总质量

填表时的三个判断点

  • 单位归属:同一列只能有一种基准。若某批配方改为“引发剂对总投料计”,必须新增列或换算后填入,不能与 phr 混填。
  • 派生列可追溯:solid_calc 与 Tg_calc 是计算值,应保留计算依据(公式或脚本版本),避免后续误当实测值使用。
  • 缺失值处理:conv_obs 未测时留空,不用 0 填充;0 表示“实测转化率为零”,与“未测”语义完全不同,混用会污染后续拟合。
映射表建好后,建议先用 2~3 组已知配方回填并核对派生列:若 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 筛选对比,而不必回到原始记录本逐条翻找。