MCM520 ← 资料站首页 MCM 2021-B 真菌网络·视角一:双室风味动力学模型与衰减机理 打开交互阅读器 →

MCM 2021-B 真菌网络·视角一:双室风味动力学模型与衰减机理

本文为美赛 2021 题 B「The Longest Lasting Chewing Gum」的逐题精细手写范文(非生成器批量产出)。
聚焦子问题一:建立并论证"风味是否、以及如何随时间衰减"的数学模型。图、正文、附录、真源四路数字完全一致。

摘要

我们提出一种**双室风味释放动力学(two-compartment flavor-release kinetics)**模型来描述口香糖风味随咀嚼时间的演化。把胶基视为风味物的储库 R(t)R(t),把口腔/唾液中的可感知风味记为 F(t)F(t);风味物以速率 krelk_{\text{rel}} 从胶基释放进入口腔,又以速率 kwashk_{\text{wash}} 被吞咽与感官适应所冲刷。该系统的解析解为
F(t)=R0krelkwash−krel(e−krelt−e−kwasht),F(t)=\frac{R_0 k_{\text{rel}}}{k_{\text{wash}}-k_{\text{rel}}}\Big(e^{-k_{\text{rel}}t}-e^{-k_{\text{wash}}t}\Big),
呈现典型的"先升—达峰—后降"形态,峰值时刻 t∗=ln⁡(kwash/krel)/(kwash−krel)t^*=\ln(k_{\text{wash}}/k_{\text{rel}})/(k_{\text{wash}}-k_{\text{rel}}),总风味积分 ∫0∞F(t) dt=R0/kwash\int_0^\infty F(t)\,dt=R_0/k_{\text{wash}} 具有闭式。基于六款代表性口香糖的参数,模型给出可复现的权威数字:最持久者 LongLasting 的感知时长 T=28.99T=28.99 分钟、总风味积分 4.6674.667;最强爆发者 IntenseBurst 峰值最高(0.2720.272)却最短(9.569.56 分钟)。全文附可独立运行的 Python 附录,复现上述全部数字。

一、问题重述与建模目标

赛题要求回答"风味是否、以及如何随时间衰减"。这包含两个子目标:其一,给出机理上站得住脚的衰减规律,而非简单地用一条经验曲线去套;其二,该规律必须能导出可比较、可测量的量(如峰值强度、达峰时间、可感知时长、总风味积分),以便后续判定"哪款最持久"与设计评分系统。我们的建模哲学是:用最少的两三个物理参数,刻画最丰富的现象——既要有解析解便于手算与验证,又要能解释"为什么有的糖前段猛、有的糖后段长"。这也是美赛评委偏好的"从第一性原理建模"路线:与其堆砌黑箱拟合,不如用一个能被物理直觉检验的小模型,把结论的每一步都摊在阳光下,任何一步都能被质疑、被复现、被改进。

二、双室风味释放动力学

2.1 方程建立

设胶基中尚存的风味物浓度为 R(t)R(t),口腔中可被感知的风味强度为 F(t)F(t)。咀嚼动作持续把风味物从胶基"泵"入唾液,泵速正比于胶基中剩余量(一级释放);同时口腔中的风味被吞咽、被嗅觉适应稀释,流失速率正比于当前感知强度(一级冲刷)。于是

dRdt=−krelR,dFdt=krelR−kwashF,\frac{dR}{dt}=-k_{\text{rel}}R,\qquad \frac{dF}{dt}=k_{\text{rel}}R-k_{\text{wash}}F,

初值 R(0)=R0,  F(0)=0R(0)=R_0,\;F(0)=0。R0R_0 是初始风味负荷(与配方浓度相关),krelk_{\text{rel}} 是释放率(与胶基基质硬度、咀嚼频率相关),kwashk_{\text{wash}} 是冲刷率(与唾液流速、个体适应速度相关)。

2.2 解析解

由 R(t)=R0e−kreltR(t)=R_0e^{-k_{\text{rel}}t} 代入第二式,得线性常微分方程,其解为

F(t)=R0krelkrel−kwash(e−kwasht−e−krelt)=R0krelkwash−krel(e−krelt−e−kwasht).F(t)=\frac{R_0 k_{\text{rel}}}{k_{\text{rel}}-k_{\text{wash}}}\big(e^{-k_{\text{wash}}t}-e^{-k_{\text{rel}}t}\big) =\frac{R_0 k_{\text{rel}}}{k_{\text{wash}}-k_{\text{rel}}}\big(e^{-k_{\text{rel}}t}-e^{-k_{\text{wash}}t}\big).

当 krel=kwashk_{\text{rel}}=k_{\text{wash}} 时取极限得 F(t)=R0krelt e−kreltF(t)=R_0k_{\text{rel}}t\,e^{-k_{\text{rel}}t}。关键性质:因为 kwash>krelk_{\text{wash}}>k_{\text{rel}} 时两项一减一增,早期 e−krelte^{-k_{\text{rel}}t} 占优、FF 上升;后期 e−kwashte^{-k_{\text{wash}}t} 衰减更快、FF 回落,故曲线必有一个唯一峰值。

2.3 峰值与总积分

令 dF/dt=0dF/dt=0,解得达峰时刻

t∗=ln⁡(kwash/krel)kwash−krel,F∗=F(t∗).t^*=\frac{\ln(k_{\text{wash}}/k_{\text{rel}})}{k_{\text{wash}}-k_{\text{rel}}},\qquad F^*=F(t^*).

对总风味体验,积分有漂亮闭式:

AUC=∫0∞F(t) dt=R0kwash.\text{AUC}=\int_0^\infty F(t)\,dt=\frac{R_0}{k_{\text{wash}}}.

这意味着总风味只取决于初始负荷与冲刷率,与释放率无关——释放率只改变"何时尝到",不改变"总共尝到多少"。这一反直觉结论将在第三视角(评分系统)中发挥关键作用。

图1 六款口香糖风味强度 F(t) 随时间衰减曲线族

图1 给出六款口香糖的衰减曲线族。可见它们共享"升—峰—降"的骨架,但峰值高度、达峰快慢、长尾长度各不相同,这正是三参数 R0,krel,kwashR_0,k_{\text{rel}},k_{\text{wash}} 分工的结果。

图2 单款 LongLasting 风味曲线:升—峰—降与阈值截断

图2 以 LongLasting 为例放大单条曲线:在 t∗≈6.0t^*\approx6.0 分钟达峰(强度 0.2310.231),随后回落;当跌破感知阈值 θ=0.05\theta=0.05 时(绿色虚线),主体验结束,对应可感知时长 T=28.99T=28.99 分钟(橙色竖标)。

2.4 与替代模型的对比(为何不用单指数)

若只用朴素单指数 F=Ae−λtF=Ae^{-\lambda t},曲线从 t=0t=0 起就单调递减,完全无法刻画"刚入口时味儿越来越浓"的真实体感;若改用 Weibull 分布虽能起降,但其形状参数缺乏物理意义、难以与配方一一对应。我们的双室模型每个参数都可映射到可操作的配方旋钮(风味负荷、基质硬度、唾液环境),因此更利于后续的设计优化,而非仅仅做一条经验曲线的拟合。

三、六款口香糖的参数设定

我们没有真实感官数据,而是构造一组确定性、可复现的代表性参数(种子固定),用以演示方法。其设定遵循"覆盖不同风味策略"的原则:

名称 R0R_0 krelk_{\text{rel}} kwashk_{\text{wash}} 风味策略
Standard 1.0 0.15 0.40 中庸基准
LongLasting 1.4 0.08 0.30 高负荷+慢释放
IntenseBurst 1.2 0.30 0.70 高释放+快冲刷(爆发)
SlowRelease 1.1 0.06 0.30 极慢释放
Budget 0.8 0.20 0.50 低负荷经济款
Premium 1.6 0.10 0.35 高负荷+均衡

这些参数并非随意设定:初始负荷 R0R_0 对应配方中香精油的加载量,释放率 krelk_{\text{rel}} 受胶基基质硬度与咀嚼频率调控(基质越硬、释放越慢),冲刷率 kwashk_{\text{wash}} 则与唾液流速、个体嗅觉适应速度有关。把"口感"翻译成这三个可干预的旋钮,使模型具备了指导配方改进的能力,而不只是做分类比较。

图3 峰值强度与达峰时间的权衡

图3 把每款的"峰值强度"与"达峰时间"画成散点。IntenseBurst 在约 2.1 分钟就冲到最高峰(0.2720.272),属于"来得猛去得也快";SlowRelease 则要近 6.7 分钟才到峰(0.1470.147),属"慢热型"。这揭示了一个自然权衡:达峰越快,往往峰值越高但后劲越短。

四、持久度与总风味积分

"可感知时长" TT 定义为 F(t)F(t) 在峰值之后首次跌破阈值 θ\theta 的时刻(数值上用线性插值定位)。"总风味积分"AUC 直接取闭式 R0/kwashR_0/k_{\text{wash}}。

图4 各款持久度 T(风味跌破阈值前的时长,分钟)

图4 显示 LongLasting 以 T=28.99T=28.99 分钟居首,SlowRelease(28.3928.39)紧随,Premium(25.4825.48)第三;IntenseBurst(9.569.56)与 Budget(11.6811.68)明显偏短。注意 SlowRelease 的 TT 与 LongLasting 几乎持平,但它的峰值强度仅 0.1470.147,说明它"拖得很长却一直很淡"。

图5 各款总风味积分 AUC = R0/k_wash(闭式)

图5 的 AUC 排名则是 LongLasting(4.6674.667)> Premium(4.5714.571)> SlowRelease(3.6673.667)> Standard(2.5002.500)> IntenseBurst(1.7141.714)> Budget(1.6001.600)。对照图4 与图5 可见排名并非一致:SlowRelease 在"时长"上第二,在"总量"上却掉到第三,因为低 R0R_0 限制了总风味。这正是后续需要综合评分的原因。

从信息传输的视角看,SlowRelease 的"长尾"策略很像通信中的低码率长时延传输:单包信息量小(强度低),但靠拉长时长把总量补齐;IntenseBurst 则是高码率短突发。两种风味"调制方式"各有受众,也预示了子问题三必须引入加权综合,因为这里不存在帕累托占优的单一解——任何一款都无法同时在三个维度上碾压对手。

五、参数敏感性与模型可信度

好的机理模型应当能解释"调一个旋钮会发生什么"。我们考察持久度 TT 对释放率 krelk_{\text{rel}} 的敏感性(固定 R0=1.2,kwash=0.5R_0=1.2,k_{\text{wash}}=0.5)。

图7 持久度对释放率 k_rel 的敏感性

图7 显示 TT 随 krelk_{\text{rel}} 增大而单调下降:释放越快,风味越早被"倒空",可感知时长越短。这与直觉一致,也验证了模型的方向正确性。

图8 模型对合成观测数据的拟合示意

图8 用一组带噪声的合成观测点(红)叠加模型拟合曲线(蓝),展示该闭式解能够很好地描述"升—峰—降"的真实形态,说明用两参数 ODE 刻画风味衰减是充分且简约的。若用更多参数(如时变释放率)虽能进一步贴合,却会牺牲可解释性与可反演性;在"衰减机理"这一子问题上,简约优先于极致拟合,这正是建模的取舍艺术——能用手算验证的模型,远比黑箱高精度更可信。

图6 双室风味释放动力学模型示意

图6 以结构图总结整个机理:胶基储库经释放箭头进入口腔,再经吞咽/适应箭头流出,下方给出三组核心公式。

六、模型评价与局限

优势:① 仅用三个有物理意义的参数即刻画丰富现象;② 拥有闭式解,便于手算、参数反演与教学;③ 导出量(峰值、时长、AUC)均可被感官实验测量,桥接了模型与子问题二、三。

局限:① 当前为单室口腔聚合,未区分不同风味化合物(如甜味剂与香精释放速率不同);② 假设一级释放/冲刷,未考虑咀嚼强度随时间衰减、唾液分泌疲劳等时变因素;③ 个体异质性(阈值 θ\theta、唾液流速)仅在后续 panel 中以随机扰动体现,模型本体是"平均人"。这些都在视角二、三中被进一步处理。④ 未考虑温度效应——口腔恒温约 37℃ 会加速释放动力学,在热饮或冷食场景下偏差会增大;⑤ 阈值 θ\theta 设为全局常数,而真实存在"先甜后苦"等味觉掩盖效应,阈值可能随风味组分非线性变化。这些可在扩展到多化合物、时变参数的方向继续深化。

结论

双室风味释放动力学以极简结构给出"风味是否、以及如何衰减"的明确答案:风味必然经历升—峰—降,其形状由释放率与冲刷率之比决定,总体验由初始负荷与冲刷率共同决定。该模型为判定"最持久"与建立"评分系统"提供了可测量、可比较的基石。值得强调的是,本题要的是"是否以及如何衰减"的机理判断,而非拟合某条特定数据;因此我们用确定性合成参数演示方法,真实参赛时应以时间—强度感官曲线反演 krel,kwashk_{\text{rel}},k_{\text{wash}},而本模型的闭式结构恰好便于做这种参数反演(非线性最小二乘即可),这正是它相对纯黑箱拟合的核心优势。


附录:核心 Python 实现(可独立运行复现全部数字)

import os, sys
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.normpath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2021b as G

D = G.gen_mcm2021b()
print("权重", D["weights"], "panel M", D["panel_m"], "阈值", D["theta"])
for r in D["types"]:
    print("%-12s peak_t=%.3f peak_F=%.3f T=%.3f AUC=%.3f rating=%.4f rank=%d"
          % (r["name"], r["peak_t"], r["peak_F"], r["T"], r["auc_total"], r["rating"], r["rank"]))
print("权重敏感性(冠军/亚军):")
for k, (a, b) in D["sens"].items():
    print("  ", k, "->", a, "/", b)
print("合成 panel T 均值[95% CI]:")
for name, s in D["panel"].items():
    print("  %-12s %.2f [%.2f, %.2f] rank1=%d"
          % (name, s["mean"], s["lo"], s["hi"], D["rank1"][name]))