☰
正交试验法详解:从81组实验到9组,工艺优化与软件测试的高效设计
2026/10/6 5:25:17 网站建设 项目流程

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 组实验:

实验号ABCD
11111
21222
31333
42123
52231
62312
73132
83213
93321

先看均衡性:拿 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水平3
A 料筒温度 (°C)230240250
B 注射压力 (MPa)708090
C 保压时间 (s)51015
D 冷却时间 (s)152025

选范围的经验是:如果完全没把握,第一轮可以拉宽;拉宽后如果分析发现某个因子的效应呈“单边下降趋势”或者“两头高中间低”,说明最优值可能落在边界外,第二轮要把区间往那个方向平移。正交试验法通常不是一轮定终身的,它是响定位、递进式逼近的工具。

3.2 排布实验与采集数据

把 L9 表里的水平编号替换成实际值,得到 9 组工艺组合,直接按表做。这里有一个现场最容易被忽视的细节:实验顺序。常温常压下静电? 不,是“按表从上往下一组一组做”看起来有条理,其实有风险。如果生产环境里的温度、湿度、原料批号在随时间缓慢漂移,按序执行会把“时间效应”混进你的实验误差里。正确做法是先随机化实验顺序再做。机台排期允许的话,尽量把 9 组打乱穿插,实在不行至少要在分析时意识到这个风险。

每组做下来测收缩率,这里为了讨论方便,我用一组模拟数据,数值趋势和我在现场见到的很接近:

实验号ABCD收缩率 (%)
111111.52
212221.38
313331.31
421231.42
522311.35
623121.29
731321.36
832131.25
933211.28

3.3 数据分析:极差法

对三水平表,最常用也最直观的分析法是极差分析,也叫直观分析法。做法分三步:先按每个因子的每个水平把实验指标分组求平均,得到 K 值;再算每个因子的极差 R,也就是该因子“最好水平均值”和“最差水平均值”的差;最后按 R 大小排序,R 越大说明该因子对指标的影响越大。

以 A 因子为例:A 取水平1的实验是第 1、2、3 号,对应收缩率均值是 (1.52+1.38+1.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 (%)极差 R
A 料筒温度1.4031.3531.2970.106
B 注射压力1.4331.3271.2930.140
C 保压时间1.3531.3601.3400.020
D 冷却时间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.054,B3 的偏移是 1.293-1.351 = -0.058,C3 的偏移是 1.340-1.351 = -0.011,D3 的偏移是 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早经济A
2早商务B
3早头等C
4中经济B
5中商务C
6中头等A
7晚经济C
8晚商务A
9晚头等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), start=1): print(f"用例{i}: 时段={case[0]}, 舱位={case[1]}, 航司={case[2]}")

注意 allpairspy 生成的是 pairwise 覆盖阵列,不是严格正交表,如果后续要做统计对比,还是建议手上有张标准正交表。

6.3 工程软件与更远的方向

工业界常用 Minitab、JMP、Design-Expert 做 DOE,它们内置常用正交表、随机化、极差和方差分析,导出报告也方便。SPSS 也有正交设计模块。Excel 插件或在线 DOE 计算器可以应急,但分析深度有限。

最后说一句我的个人习惯:正交试验法我通常当作“第一轮扫描”用,拿到主效应排序和优化方向后,再接响应面实验做精细建模,或者直接转入生产验证。它的价值不在于一步到位,而在于用最小的成本把“哪些参数重要、往哪个方向调”这件事彻底搞清楚。这个习惯帮我省下的机时和返工次数,远比 9 组实验本身的成本高得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询