免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

正交试验法详解:从81组实验到9组,工艺优化与软件测试的高效设计

正交试验法详解:从81组实验到9组,工艺优化与软件测试的高效设计 1. 从“81组全试一遍”到“9组解决问题”正交试验法到底解决什么问题做工艺优化、产品设计或者测试方案的人应该都有过这种体验手里握着四五个变量每个变量都看着重要想老老实实全试一遍结果一算数量直接劝退。我第一次认真研究正交试验法就是被一个注塑项目逼的。当时要优化四个工艺参数每个参数取三个水平按全因子试验做就是 3 的 4 次方等于 81 组实验按当时机台档期粗算光跑完得花半个多月更别说后面还要返工调整。后来换用一张 L9(3^4) 正交表9 组实验就拿到了可用的优化方向和主次排序。这篇文章就把这套方法掰开揉碎讲清楚包括怎么读表、怎么做数据分析、有哪些坑是我拿实际排期和返工换来的教训。1.1 为什么“单因子轮换”看着省实际上最容易翻车很多工程师第一次接触实验设计时习惯用“单因子变量法”先把其他参数固定只动一个参数找出这个参数的最优值再固定它去动下一个。这种方法不是不能用但它有两个明显的问题。第一效率其实很低四因子三水平的情况下单因子轮换至少也要先定基准、再逐个扫描加上验证实验次数往往不比全因子少多少。第二也是最致命的——它默认参数之间没有交互作用。可现实中两个参数的组合效应经常不是“单独效应加起来”那么简单。一个温度在低压下没问题在高压下可能就过塑一个转速配这个刀具很好配另一个刀具立刻崩刃。单因子轮换发现不了这种耦合甚至会给你一个“局部最优但全局很糟糕”的组合。全因子实验能解决交互作用问题它是统计学上的“金标准”每个参数水平都互相配对一遍信息最全。但代价就是组合数量按照指数爆炸。这就是正交试验法切入的时机。它不追求“所有组合都跑”而是用一张精心构造的表格保证你跑的每一组实验都像“均匀撒网”从 81 组里挑出 9 组仍然能把每个参数的单独主效应估出来并且求得的效应是“干净”的不掺其他参数的影响。1.2 正交试验法的核心承诺正交试验法Orthogonal Array的核心承诺可以拆成两条均衡性和正交性。均衡性指每个因素的每个水平在实验中出现的次数完全相同正交性指任意两个因素的任意两个水平组合都会在实验中出现相同的次数。换句话说实验点在整个参数空间里分布得既均匀又对称没有哪个角落被偏爱也没有哪个组合被遗漏。这两条性质带来一个数学上的好处分析某个因素时其他因素的效应会在求和过程中互相抵消。比如比较 A 因素在水平1和水平2下的平均指标因为 B、C、D 各水平在 A 为水平1和水平2时出现的次数完全一样它们的平均影响被“配平”了。所以你能把每个因素的贡献单独拎出来看这就叫“整齐可比”。实验点分布均匀、任两因素组合配平是用少量实验换取可靠主效应估计的全部秘密。1.3 适用场景与不适用场景我个人的判断标准很简单如果目标是“筛选关键参数、找出主效应、快速逼近最优操作区间”正交试验法几乎总是值得优先考虑。典型场景包括注塑/压铸工艺参数优化、化工反应条件寻优、机械加工参数匹配、配方试验以及软件测试里的参数组合覆盖。它不要求你对系统有很深的先验认识普适性很强。但也要说清楚它的边界。如果你已经明确知道某两个因子之间存在强交互并且你要定量研究这个交互作用的形态L9 这类“主效应设计”就力不从心了需要换用带交互作用列的设计或者响应面方法。另外如果目标是建立高精度的定量预测模型比如精确到小数点后三位的曲面方程正交表只是筛子后续还要补响应面实验。先筛选、后建模这才是工程上最常见的组合拳。2. 看懂正交表L9(3^4) 的结构、均衡性与正交性正交表有一套自己的编号规则第一次接触的人容易看得一头雾水。其实读懂了只需要几分钟就能从表名里读出关键信息。2.1 正交表的编号规则L9(3^4) 这种写法是行业标准。L 来自拉丁方Latin Square的英文首字母9 代表要做 9 组实验括号里的 3 代表每个因素取 3 个水平4 代表这张表最多能放 4 个因素。所以 L9(3^4) 读作9 次实验最多 4 个三水平因素。同理L8(2^7) 就是 8 次实验、最多 7 个二水平因素L18(2^1×3^7) 是混合水平表能放 1 个二水平因素加 7 个三水平因素。选表的本质就是在“因素个数、水平数、实验次数”三者之间做权衡。为什么叫正交表而不叫别的名字因为它的列与列之间满足严格的正交关系。数学上更精确的定义是表里任意两列它们所有可能的水平组合出现的次数相等。这张表不是随便排出来的背后是有限域、拉丁方、差集等组合数学理论你不需要亲手构造它但一定要能验证它。2.2 一个一个看 L9 这张表我们直接把 L9(3^4) 摆出来后面所有案例都用它。这 9 行就是你要依次去做的 9 组实验实验号ABCD111112122231333421235223162312731328321393321先看均衡性拿 A 列举例水平 1、2、3 各出现 3 次B、C、D 列也一样。再看正交性拿 A、B 两列拼在一起数组合 (1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3)、(3,1)、(3,2)、(3,3) 每种恰好出现一次。任何一个两列组合都是这个规律。这就是“9 组试验覆盖了 81 组里的代表性点”。2.3 为什么能省下这么多实验次数自由度账理解正交表为什么“省”而不“亏”最清楚的办法是算自由度。一个三水平因素的主效应占 2 个自由度因为知道两个水平相对差异第三个可由整体平衡推出四个主效应一共占 8 个自由度。9 组实验的总自由度是 9 减 1 等于 8。刚好填满一颗螺丝都不剩。也就是说L9 的全部信息量都用来估计四个主效应了它没有多余的自由度去估计交互作用。全因子 81 组的自由度是 80除了四个主效应占 8 个剩下 72 个全部分给各种交互作用。所以正交表省下的不是“准确性”而是“你不打算关心的高阶交互信息”。如果你确实关心某些交互作用就需要用更大的表、留出交互作用列这是第 5 章要展开的话题。3. 注塑收缩率优化实测用 L9(3^4) 走完全流程理论讲完落到具体项目上。这里以注塑件的收缩率优化为例场景很典型产品尺寸超差模具已经定了能调的只有注塑工艺参数。目标是把收缩率压下来越小越好同时要看哪个参数影响最大好让现场操作工知道盯哪块表。3.1 定因子、定水平我选了四个因子A 料筒温度、B 注射压力、C 保压时间、D 冷却时间。每个因子取三个水平。选水平的时候有一个注意事项水平范围要覆盖生产上实际可行且安全的区间别为了拉开差异把参数设在工艺窗口之外。比如料筒温度不能超过材料分解温度否则做出来的全是废品。我这里的设定如下因子水平1水平2水平3A 料筒温度 (°C)230240250B 注射压力 (MPa)708090C 保压时间 (s)51015D 冷却时间 (s)152025选范围的经验是如果完全没把握第一轮可以拉宽拉宽后如果分析发现某个因子的效应呈“单边下降趋势”或者“两头高中间低”说明最优值可能落在边界外第二轮要把区间往那个方向平移。正交试验法通常不是一轮定终身的它是响定位、递进式逼近的工具。3.2 排布实验与采集数据把 L9 表里的水平编号替换成实际值得到 9 组工艺组合直接按表做。这里有一个现场最容易被忽视的细节实验顺序。常温常压下静电? 不是“按表从上往下一组一组做”看起来有条理其实有风险。如果生产环境里的温度、湿度、原料批号在随时间缓慢漂移按序执行会把“时间效应”混进你的实验误差里。正确做法是先随机化实验顺序再做。机台排期允许的话尽量把 9 组打乱穿插实在不行至少要在分析时意识到这个风险。每组做下来测收缩率这里为了讨论方便我用一组模拟数据数值趋势和我在现场见到的很接近实验号ABCD收缩率 (%)111111.52212221.38313331.31421231.42522311.35623121.29731321.36832131.25933211.283.3 数据分析极差法对三水平表最常用也最直观的分析法是极差分析也叫直观分析法。做法分三步先按每个因子的每个水平把实验指标分组求平均得到 K 值再算每个因子的极差 R也就是该因子“最好水平均值”和“最差水平均值”的差最后按 R 大小排序R 越大说明该因子对指标的影响越大。以 A 因子为例A 取水平1的实验是第 1、2、3 号对应收缩率均值是 (1.521.381.31)/3 1.403水平2对应第 4、5、6 号均值 1.353水平3对应第 7、8、9 号均值 1.297。极差 R 1.403 - 1.297 0.106。把所有因子算完汇总如下因子k1 (%)k2 (%)k3 (%)极差 RA 料筒温度1.4031.3531.2970.106B 注射压力1.4331.3271.2930.140C 保压时间1.3531.3601.3400.020D 冷却时间1.3831.3431.3270.057从极差看影响收缩率的因素主次顺序是 B注射压力 A料筒温度 D冷却时间 C保压时间。这个排序直接决定了现场改善的重点先调压力其次温度保压时间在现有水平范围内影响很小不用花太多精力。因为收缩率是越小越好每个因子选均值最小的水平最优组合是 A3 B3 C3 D3也就是温度 250°C、压力 90 MPa、保压 15 秒、冷却 25 秒。3.4 预测和验证实验注意一个容易忽略的点最优组合 A3B3C3D3 并不在刚才的 9 组实验里表里最接近的是第 8 号 A3B2C1D3以及第 3 号 A1B3C3D3。这恰恰是正交表的优势——它能从没跑过的组合里预测出结果。用最简单的加法模型预测预测值等于总均值加上每个因子最优水平相对总均值的偏移量。总均值 12.16/9 1.351。A3 的偏移是 1.297-1.351 -0.054B3 的偏移是 1.293-1.351 -0.058C3 的偏移是 1.340-1.351 -0.011D3 的偏移是 1.327-1.351 -0.024。预测值 1.351 - 0.054 - 0.058 - 0.011 - 0.024 1.204。然后必须补做一个验证实验按这个组合实际跑一次。我要求现场把这组作为第 10 组补做实测值落在 1.18 到 1.21 之间都算正常。如果预测值和实测值差得很远说明这个加法模型不成立很可能存在明显的交互作用这时候要回头查交互不能强行用这个结论。4. 软件测试里的正交试验法9 条用例覆盖两两组合正交试验法在工业实验里用得广在软件测试里其实也有一块非常成熟的阵地叫“参数组合测试”或者“组合覆盖测试”。做过的都懂接口测试、UI 筛选、配置矩阵这类场景参数和取值一多全组合用例的数量瞬间爆炸。4.1 为什么穷举参数组合在真实系统里不可行举个例子一个机票查询页要测三个参数的取值组合出发时段取早/中/晚舱位取经济/商务/头等航空公司取三家。全组合是 3×3×3 27 条用例看着还行。但真实系统里参数远不止三个一般都有六七个每个又不止三个取值全组合很快就到几百上千条。而根据缺陷数据统计软件缺陷绝大多数由单个参数或两个参数交互触发三个以上参数同时异常交互才能触发的缺陷占比很低。所以工程上普遍接受“两两组合覆盖”作为测试充分性的基线。正交表正好天然满足两两覆盖而且比一般的 pairwise 工具更规整。用 L9(3^4) 容纳这三个参数第四个参数位留空不用用例时段舱位航司1早经济A2早商务B3早头等C4中经济B5中商务C6中头等A7晚经济C8晚商务A9晚头等B这 9 条用例覆盖了任意两个参数之间全部 9 种取值组合每种恰好出现一次。比如“时段早”和“舱位”三个取值各配了一次和“航司”三个取值也各配了一次。27 条全组合压缩到 9 条漏掉的是三个参数同时取特定值的组合这在业务上是可以接受的风险提前和产品、测试负责人确认清楚就行。4.2 建模与用例生成实际建模时的难点不在表本身而在“把参数抽象成因素和水平”这一关。接口字段要决定哪些作为因素、哪些固定为默认值取值要决定哪些是有效等价类、哪些是边界值。比如“出发时段”这种连续时间要切成早/中/晚三段切法本身就要结合业务。原则是你关心的、可能互相影响的参数进表环境类参数如网络、机型固定不去凑因素个数。一张表塞太多因素并不是本事塞进去却不分析结果才是浪费。4.3 正交试验法与 Pairwise 工具的分工现在很多人直接用 pairwise 工具生成用例比如微软的 PICT、NIST 的 ACTS以及 Python 生态里的 allpairspy。这套工具的特点是快、支持条件约束比如“航司 A 不卖头等舱”这种逻辑。生成结果是不完全一样的“覆盖阵列”它的配对覆盖通常比正交表更节省用例数但不一定保持均衡。我的用法是分场景只是要一批回归用例用 pairwise 工具生成追求用例数最少如果要统计测试结果、对比不同配置的缺陷率或者后续要做更正规的测试分析就用正交表因为它均衡每个参数水平被验证的次数一样数据更“干净”。5. 我在实际项目中踩过的坑与补救方法正交试验法在纸面上很完美但只要你真正跑过几个项目一定会撞到下面这些坑。它们都不是正交表本身的问题而是用表的人对前提条件理解不到位。5.1 交互效应L9 不是万能的这是我最想强调的一条。L9 的自由度全部用于估计主效应碰到交互作用强的情况结果会失真。我曾经在一个化工反应条件优化里用 L9 找最优极差分析出来温度越高越好补做验证实验时却怎么都复现不了预测值最后查文献和单因子对照实验才发现温度和催化剂用量存在强交互催化剂低时温度升高反而坏事。主效应分析把它俩拉通一平均得出了一个误导性结论。怎么提前规避第一选因子时想清楚哪些组合可能“化学反应式”地耦合对这类因子要么用支持交互作用的设计比如 L27(3^13) 并查交互作用表分配列要么先做少量双因子全实验摸底。第二任何正交优化的结论都必须用验证实验背书预测值和实测值差异超过工程允许范围就要怀疑交互。第三对于 L8(2^7) 这类二水平表交互作用表是现成的。查表可知 A(第1列)、B(第2列) 的交互作用应放在第3列所以第3列不能再放其他主因子照着这个规则设计才能研究交互。三水平的 L9 没有干净的交互作用列这就是它不适合深度交互研究的根本原因。5.2 因素水平数不一致怎么办现实里常遇到“三个因子是三水平、一个因子只能取两水平”的情况。硬往 L9 里塞把两水平因子写成 1、2、1、2 的伪三水平表面跑得通但正交性和均衡性已经破坏了分析结果不再可靠。我的解决顺序是三步。第一能合并就合并把某个水平调整到接近另一个水平让它变成真正的三水平。第二用混合水平表L18(2^1×3^7) 可以容纳一个两水平因子加最多七个三水平因子是田口类实验里非常常用的表。第三如果两水平因子确实关键、又需要看交互就退回到 L8 系列或者干脆拆分成两个子实验分别验证。5.3 空白列、误差估计与随机化正交表允许的因子数往往比你实际有的多多出来的列我不是直接删掉而是留着当空白列。空白列不是没用的它的波动可以用来估算实验误差。L9 里四个因子刚好把四列占满没有空白列这时想估误差就得靠空白列缺失下的“合并小效应”或者补做重复实验。这是很多初学者踩的坑为了充分利用实验次数把表填得满满当当结果分析时没有误差项显著性检验也做不了。我的习惯是宁可少放一个因子也要至少空一列出来。随机化的问题前面提过再补一句现场执行时操作员为了省事经常把相同参数水平的组排在一起连做这在统计学上等同于把工艺漂移效应系统性塞进了某个水平。如果你做不了严格随机至少要做到“打乱顺序、分两天穿插”并且在分析时留个心眼。5.4 最优组合不在表里要有预期很多第一次用正交表的人翻开实验结果一看最优的那一组不是第 9 组里数据最好的那一行就开始怀疑方法错了。其实这恰恰说明主效应模型在起作用——你预测出的是一个从未跑过的组合它的优势来自多个因子的利好水平叠加。当然这也提醒一件事预测出的组合必须做确认实验确认结果和预测基本一致整个闭环才算成立。我见过不止一个项目前期做得头头是道最后忘了补做最优组合直接把预测值当生产方案投产就翻车。6. 选表指南与工具清单最后一部分把选表逻辑和一些我用着顺手的工具整理出来方便直接抄作业。6.1 常用正交表速查选表先看因子个数和水平数再看你想不想留空白列和研究交互。常用表大致如下正交表实验次数因素能力典型用途L4(2^3)4最多3个二水平因子极小的筛选实验L8(2^7)8最多7个二水平因子二水平筛选可查交互作用列L9(3^4)9最多4个三水平因子三水平筛选与工艺优化L12(2^11)12最多11个二水平因子因子很多时的快速筛选注意它没有空白列L16(4^5)16最多5个四水平因子四水平因子筛选L18(2^1×3^7)181个二水平 7个三水平混合水平、交互相对稳定的场景L27(3^13)27最多13个三水平因子三水平交互研究、响应曲面前的筛选选择逻辑很简单在满足“能放下所有因子”的前提下选实验次数最小的表并尽量留空白列。因子数量和实验次数之间是线性增长关系这就是正交表最大的实用价值。6.2 Python 快速上手很多工程师拿到正交表后卡在“把水平编号翻译成实际参数”这一步。用 Python 处理很方便。L9 表本身可以直接当作数组定义L9 [ [1, 1, 1, 1], [1, 2, 2, 2], [1, 3, 3, 3], [2, 1, 2, 3], [2, 2, 3, 1], [2, 3, 1, 2], [3, 1, 3, 2], [3, 2, 1, 3], [3, 3, 2, 1], ] levels { 料筒温度: {1: 230, 2: 240, 3: 250}, 注射压力: {1: 70, 2: 80, 3: 90}, 保压时间: {1: 5, 2: 10, 3: 15}, 冷却时间: {1: 15, 2: 20, 3: 25}, } for row in L9: print([levels[name][row[i]] for i, name in enumerate(levels)])跑出来就是可以直接下发给现场的实验清单。软件测试场景则可以直接用 allpairspy 这类库from allpairspy import AllPairs parameters [ [早, 中, 晚], [经济舱, 商务舱, 头等舱], [A航, B航, C航], ] for i, case in enumerate(AllPairs(parameters), start1): print(f用例{i}: 时段{case[0]}, 舱位{case[1]}, 航司{case[2]})注意 allpairspy 生成的是 pairwise 覆盖阵列不是严格正交表如果后续要做统计对比还是建议手上有张标准正交表。6.3 工程软件与更远的方向工业界常用 Minitab、JMP、Design-Expert 做 DOE它们内置常用正交表、随机化、极差和方差分析导出报告也方便。SPSS 也有正交设计模块。Excel 插件或在线 DOE 计算器可以应急但分析深度有限。最后说一句我的个人习惯正交试验法我通常当作“第一轮扫描”用拿到主效应排序和优化方向后再接响应面实验做精细建模或者直接转入生产验证。它的价值不在于一步到位而在于用最小的成本把“哪些参数重要、往哪个方向调”这件事彻底搞清楚。这个习惯帮我省下的机时和返工次数远比 9 组实验本身的成本高得多。
返回列表