PharmaPy 干法制粒二次开发教程(16):细粉占比与 CQA 工艺窗口——把 CQA/CPP 链成模型,扫描 SCF×间隙×辊速定位 QbD 设计空间
版本声明块
- 工具/软件:本项目二次开发的 CQA/CPP 扫描函数(本系列二次开发示例),基于篇 7-15 的动力学链
- 语言/环境:Python 3.9 + numpy/scipy/matplotlib
- 本文目标:把干法制粒的"输入变量(CPP)"和"输出质量(CQA)"牢牢焊成一张可扫描的图,并用等值线把"细粉达标区"圈出来。
一句话结论:CPP→CQA 链的骨架是SCF↑ 或 间隙↓ ⇒ SF_ribbon↑ ⇒ 颗粒粒径↑(D50↑)⇒ 细粉↓,辊速RS另加物料依赖(塑性物料RS↑⇒细粉↑);把这条链做成f(SCF,间隙,RS)→(D50,细粉,强度)的扫描函数,网格扫描后把"细粉 < 目标"这条 CQA 阈值画成SCF×间隙 等值线工艺窗口(QbD 设计空间),窗口外标X展示"不合格区""。
〇、本篇要解决的认知问题
- CPP 和 CQA 到底是什么关系?为什么干法把"细粉占比"当成核心 CQA?
- SCF、间隙、辊速三条"输入轴"分别通过什么mechanism 影响细粉?哪些是单向的?
- 怎么把篇 7-15 的零散动力学聚合成一个"输入→CQA"的确定性扫描模型?
- "工艺窗口 / 设计空间(QbD)"到底指什么?为什么不能只看单点而要看边界?
- 那张"?细粉达标区"的等值线图是怎么一步步画出来的,边界的含义是什么?
一、机制解析
CQA/CPP:质量与工艺的耦合语言
QbD 的核心是把"质量"与"工艺"用一张映射焊起来:CPP(关键工艺参数,如辊压SCF/辊间隙S/辊速RS、粉碎转子速)是输入;CQA(关键质量属性,如 ribbonSF、颗粒D50、细粉占比、颗粒强度)是输出。工艺研发的目标不是"调一个参数让它过"而是画出整条"输入→CQA"的逆边界——知道哪些输入能让所有 CQA 同时达标,这就是设计空间(design space / 工艺窗口)(底账 H)。
主链路:SCF/间隙 → ribbon SF → 粒径 → 细粉
干法最核心的 CPP→CQA 链路(底账 H)几乎线性:SCF↑或间隙↓⇒SF_ribbon↑⇒ 颗粒粒径D50↑⇒细粉(<125µm)↓
物理:辊压更紧 → 更多颗粒被压成粗大 ribbon → 粉碎后粒径更大、细粉更少。这条链单调、单向,是设计窗口最可信的主轴。所以"想降细粉"的首要手段是加 SCF(或收拢间隙)。
辊速 RS 的物料依赖(第二轴)
RS↑的影响取决于物料塑性(底账 B4):塑性物料(MCC 类)RS↑ ⇒ SF_ribbon↓、细粉↑(辊速快→接触时间短→压实不足);脆性物料影响小。这在窗口里是"存在但方向取决于配方"的变量——设计窗口要用两组(塑性/脆性)分别画,而不是塞一条万能曲线。本篇先做"塑性物料"的典型趋势(以文献/实测为准)。
为什么"画边界"而非"看单点"
单点合格(比如某组 SCF/间隙下细粉刚好过)不代表稳健——工艺总有小扰动,落在边界边缘就会时而合格时而超标。工艺窗口给出的是足够余量的达标区域:避开边界、留出抗扰动裕量,才是可生产的稳健设计(QbD 强调 design space + control strategy)。这就是为什么我们要画等值线而非只看一个点。
二、完整代码与逐行剖析
下面把 CPP→CQA 链做成扫描模型:window_model(SCF,S,RS)返回(D50, fine, strength),然后网格扫描 SCF×间隙,画"细粉<目标(如 10% 演示阈值)"的达标区等值线,窗口外标X。
importnumpyasnpimportmatplotlib.pyplotasplt# ---- CPP→CQA 模型(示意趋势,复核底账B/C;数值以文献/实测为准)----defwindow_model(SCF,S,RS,K=3.84,rho_true=1500.,Py=65.0):"""SCF kN/cm, S cm, RS rpm -> (D50 µm, 细粉份额, 强度量级)"""# 1) SF_ribbon:Midoux 链(篇7/8),SCF↑→SF↑,RS↑→SF↓(塑性示意)Pmax=(2*SCF/25.0)*np.sqrt(2*K*25.0/(np.pi*S))# 见篇7 口径(D=25cm)mi=Pmax/0.35sf=np.clip((360./rho_true)*(mi**(1.0/K)),0.4,0.85)sf=sf*(1.0-0.10*max(0,(RS-3.0)/10.0))# RS↑→SF↓(塑性,示意)# 2) D50:随 SF 增大而增大(粒径右移)D50=150.0+900.0*(sf-0.45)/(0.80-0.45)# 近似映射# 3) 细粉:<125µm 份额随 D50↑ 而↓(单调反向)fine=0.30-0.35*((D50-150.0)/(1050.0-150.0))fine=np.clip(fine,0.0,0.30)# 4) 强度量级(篇15):随 SF↑ 单调升(相对量,工程近似,以实测为准)strength=0.5+2.0*(sf-0.45)# 相对刻度,量纲仅为"相对"returnD50,fine,strength# ---- 网格扫描 SCF × S ----SCF=np.linspace(2.0,8.0,24)S=np.linspace(0.15,0.30,24)# 1.5-3.0mmFINE=np.zeros((len(S),len(SCF)))fori,svinenumerate(S):forj,scinenumerate(SCF):_,fine,_=window_model(sc,sv,RS=4.0)FINE[i,j]=fine target=0.10# 细粉阈值(演示,企业内控可改)passed=FINE<target# ---- 等值线:细粉填充 + 达标区边界(工艺窗口) + 不合格区 X ----fig,ax=plt.subplots(figsize=(7.5,5.5))cf=ax.contourf(SCF,S*10.,FINE,levels=np.linspace(0,0.30,13),cmap='RdYlBu_r')cb=fig.colorbar(cf,ax=ax);cb.set_label('细粉占比 (CQA)')cs=ax.contour(SCF,S*10.,FINE,levels=[target],colors='k',linewidths=2)ax.clabel(cs,fmt=lambdav:f'细粉={target:.0%}',fontsize=9)# 达标窗口用浅色高亮 + 边界外打 Xax.contourf(SCF,S*10.,passed.astype(float),levels=[0,0.5,target>0and1.0],colors=['none','#9db9d6'],alpha=0.35)ok=np.argwhere(passed)bad=np.argwhere(~passed)ax.scatter(SCF[bad[:,1]],S[bad[:,0]]*10.,marker='x',color='maroon',s=30,label='不合格(细粉超标)')ax.set_xlabel('SCF (kN/cm)');ax.set_ylabel('间隙 (mm)')ax.set_title('QbD 工艺窗口:SCF × 间隙 → 细粉占比(CQA)\n浅蓝=达标窗口,黑线=细粉阈值边界')ax.legend();plt.tight_layout();plt.savefig('fig10_window.png',dpi=150)print(f"达标窗口占比 ={passed.mean():.1%},边界=黑线,窗口外打X")逐行要点:
window_model把篇 7/8/14/15 的链聚合成一个(SCF,S,RS)→(D50,fine,strength)的确定性函数——这是篇 20 完整项目扫描引擎的内核。RS对SF的负向(塑性示意,sf*(1-0.10*max(0,(RS-3)/10)))体现"塑性物料 RS↑→SF↓→细粉↑"(底账 B4)。D50随SF单调升、fine随D50单调降——还原"SCF↑→D50↑→细粉↓"主链。strength留给篇 15 函数接(此处占位)。- 网格扫描
SCF×S双循环填FINE矩阵(24×24 工况,内存可控,呼应篇 19 性能)。target=0.10是演示阈值(底账 F 明确"细粉<10%质量标准无权威通用来源",须标注为企业内控演示)。 - 绘图三步:
contourf填连续细粉、contour画target边界黑线、达标区contourf浅蓝 + 界外scatter('x')——把"设计空间"画成"达标浅蓝块 + 不达标叉点",边界即细粉=target的等值线,是 QbD 设计空间的直观表达。
三、常见报错与排查
等值线levels用了target但没圈出边界。
现象:contour(..., levels=[target])没画出线。根因:FINE全域未跨过target(网格步长太粗或模型单调曲使边界落在两格中间)。解法:加密网格(24→48),或对FINE-target用plt.contour(...,levels=[0])画零等高线(更稳)。
fine负值或超界。
现象:FINE出现负数/ >0.30。根因:fine=0.30-0.35*θ当θ>0.857时变负,clip兜住就好;但若把 D50 映射错、θ 超范围会先算出错误值。解法:np.clip(fine,0,0.30)并且断言D50在[150,1050]合理带内,别让模型跑出物理域。
RS影响没体现,窗口与 RS 无关。
现象:换RS后窗口形状完全不变。根因:window_model里RS只影响sf,若sf的分支让所有工况都落在同一区间或因子太小,D50/fine变化被吞。解法:把RS影响系数调大到能移动sf几个百分点,并给RS单独一维扫描(见练习 3),确保"物料依赖"这条轴真的生效。
X标记画在达标窗口内。
现象:ax.scatter的点混进浅蓝区。根因:ok/bad用np.argwhere的坐标与S/SCF数组索引错位(i/sv 与 j/sc 对齐颠倒)。解法:bad的行列索引严格对应(i=S 下标, j=SCF 下标),可视化前打印一个bad[:3]与对应(SCF,S)核对。
阈值target与某轴分辨率冲突,窗口碎了。
现象:达标区呈"噪声碎块"而非连续块。根因:模型在此区域陡变、网格太粗,或fine在阈值附近反复穿 line。解法:加密网格 + 对FINE做轻微平滑(scipy.ndimage.gaussian_filter)后画线,确保窗口连通、可读。
四、动手练习
- 阈值敏感性:把
target从0.10逐步试0.08/0.12/0.15,重画窗口并算达标占比。判定:阈值越严达标窗口越小且边界外移(更多工况被标 X)——理解"更严 CQA 缩小设计空间"的 QbD 代价。 - 间隙分辨率:把
S网格加[0.20,0.21,...0.29]细到 0.01,观察窗口边界随间隙的灵敏度。判定:边界的"陡峭"程度 = 该 CPP 对细粉的敏感度,是篇 18 灵敏度分析的前序手感。 - RS 物料依赖轴:在
window_model里给RS单独扫描一维,分别用plastic=True(RS↑→SF↓)与rad=False(忽略),看窗口变化。判定:塑性物料下 RS 会显著迁移窗口边界、脆性忽略时边界基本不动——把"RS 依赖配方"写在设计空间里。
五、小结与下一篇预告
本篇把 CQA/CPP 焊成了一张可扫描的图:SCF/间隙/RS → D50/细粉/强度的确定性模型、网格扫描、以及"细粉<目标"的等值线工艺窗口(达标浅蓝块 + 边界黑线 + 不达标 X)。你掌握了 QbD 里"设计空间"的落地语言——它把观测从"单点够不够"升维成"哪片区域稳得住"。这套窗口扫描器正是篇 20 完整平台的黑箱核心。
下一篇:篇 17《参数估计与模型标定实战》——前面用的都是示意参数,现在用curve_fit/least_squares从实验数据反演S_i、B_ij、破碎核参数,并用 AIC/R² 选模,把"示意"升级成"标定"。
本篇认知问题回显(FAQ)
Q1:CPP 和 CQA 是什么关系?细粉为何是核心 CQA?
A1:CPP(关键工艺参数)= 输入(辊压 SCF/间隙/辊速、粉碎转子速);CQA(关键质量属性)= 输出(ribbon SF、颗粒 D50、细粉占比、颗粒强度)。QbD 用一张映射把两者焊起来。细粉(<125µm)直接影响流动性/压片性/一致性,是干法颗粒粒度分布的核心 CQA。
Q2:SCF/间隙/辊速各自怎么影响细粉?
A2:主链单调:SCF↑ 或 间隙↓ ⇒ SF_ribbon↑ ⇒ D50↑ ⇒ 细粉↓——辊压更紧→颗粒变粗→细粉少(降细粉首要手段是加 SCF)。辊速 RS 依赖物料:塑性物料(MCC 类)RS↑⇒SF↓⇒细粉↑;脆性物料影响小。所以 RS 是"方向看配方"的轴。
Q3:怎么聚合成"输入→CQA"扫描模型?
A3:把篇 7/8/14/15 的链写成window_model(SCF,S,RS)→(D50,fine,strength)一个确定性函数:Midoux 链给 SF_ribbon → 映射 D50 → 反向给 fine → 篇 15 给强度。用网格双循环填FINE矩阵即得全工况预测,是篇 20 平台扫描引擎的内核。
Q4:工艺窗口/设计空间指什么,为什么看边界不看单点?
A4:QbD 的 design space 是"能让所有 CQA 同时达标"的输入区域。单点合格不代表稳健——工艺总有扰动,边缘工况会时而超标。窗口给的是带余量的达标区,避开边界留裕量才能稳健生产。画等值线(而非只看一点)正是为看清这个区域与边界。
Q5:那张达标等值线图怎么画出来、边界含义?
的 design space 是"能让所有 CQA 同时达标"的输入区域。单点合格不代表稳健——工艺总有扰动,边缘工况会时而超标。窗口给的是带余量的达标区,避开边界留裕量才能稳健生产。画等值线(而非只看一点)正是为看清这个区域与边界。
Q5:那张达标等值线图怎么画出来、边界含义?
A5:网格扫描得FINE矩阵 →contourf填连续细粉、contour画target等值线(即细粉=目标的边界)、达标区contourf浅蓝高亮 + 界外scatter('x')。边界 = "细粉恰达标"的 CPP 组合线;线内为设计空间,线外(X)为不合格区。阈值越严、边界越外缩。