3. 公差与误差基础

各位好,我是老张。做光机系统这么多年,我最大的体会就是:公差分析不是算账,是赌命。你设计得再漂亮,公差一摊开,可能连焦都对不上。今天咱们就把这四种最核心的分析方法掰开揉碎了讲清楚。

3.1 误差传递公式——老祖宗留下的规矩

先说误差传递公式。说白了,就是告诉你每个零件的误差,最后会怎么叠加到系统性能上。

假设系统性能 y 是多个参数 x₁, x₂, …, xₙ 的函数:

y = f(x₁, x₂, …, xₙ)

那么 y 的方差可以近似为:

σ²_y ≈ Σ (∂f/∂x_i)² · σ²_x_i

这里 ∂f/∂x_i 就是敏感度系数,σ²_x_i 是每个参数的方差。

我的经验:这个公式只适用于线性或弱非线性系统。如果你遇到强非线性(比如离轴三反系统),误差传递公式会严重低估实际偏差。我吃过这个亏,后来就老老实实上蒙特卡洛了。

举个例子,一个简单的透镜系统,焦距 f 受曲率半径 R 和折射率 n 影响:

f = R / (n - 1)

σ²_f ≈ (1/(n-1))² · σ²_R + (R/(n-1)²)² · σ²_n

你看,敏感度系数一目了然。哪个参数对结果影响大,一算就知道。

3.2 蒙特卡洛方法——用随机数砸出真相

蒙特卡洛方法,说白了就是模拟生产。你给每个参数一个分布(正态、均匀、三角都行),然后随机抽样,算一万次、十万次,看看最终性能的分布长什么样。

我习惯用 Python 做这事,代码不长:

import numpy as np

def monte_carlo_simulation(n_sim=10000):
    results = []
    for _ in range(n_sim):
        R = np.random.normal(100, 0.1)  # 曲率半径,均值100mm,公差0.1mm
        n = np.random.normal(1.5, 0.001)  # 折射率,均值1.5,公差0.001
        f = R / (n - 1)
        results.append(f)
    return np.mean(results), np.std(results)
关键点:蒙特卡洛不挑系统,线性非线性都能算。但要注意——输入分布要准。你随便拍个公差,算出来就是垃圾。

我在项目中遇到过一件事:一个客户坚持用均匀分布,说“反正公差范围内概率一样”。结果算出来良率只有60%,实际生产更惨。后来改成正态分布,良率预测才准了。你想想看,加工厂的设备是有系统误差的,正态分布才更接近真实情况。

3.3 敏感度分析——找出那个“要命”的参数

敏感度分析,就是回答一个问题:哪个参数动一动,系统性能就崩了?

常用的方法有两种:

  1. 局部敏感度:固定其他参数,只变一个,看性能变化斜率。就是上面误差传递公式里的 ∂f/∂x_i。
  2. 全局敏感度:所有参数一起变,看每个参数对总方差的贡献比例。常用 Sobol 方法。

我一般先做局部敏感度,快速筛选出“高危参数”。然后对高危参数做全局敏感度,确认它们之间的交互效应。

参数 局部敏感度 全局敏感度 优先级
曲率半径 R 高 高 ★ 严格控制
折射率 n 中 中 ★ 适当控制
镜片厚度 t 低 低 ☆ 放宽
空气间隔 d 高 中 ★ 注意装配
避坑指南:我曾经遇到一个系统,局部敏感度显示“镜片倾斜”影响不大,但全局敏感度一算,倾斜和偏心有强交互,两者同时偏差时性能直接崩了。所以,别只看局部,全局敏感度才是真相。

3.4 最坏情况分析——给老板看的“安全牌”

最坏情况分析,就是假设所有参数都往最差的方向偏,然后算系统性能。公式很简单:

Δy_max = Σ |∂f/∂x_i| · Δx_i_max

这里 Δx_i_max 是每个参数的最大允许偏差。

说实话,最坏情况分析太保守了。所有参数同时坏到极值的概率极低,按这个去定公差,成本会高得离谱。但为什么还要做?

  • 给客户看:“你看,最坏情况都能满足,放心了吧?”
  • 给自己兜底:万一出了问题,至少证明你考虑过极端情况。
  • 筛选关键参数:最坏情况分析能快速告诉你,哪些参数绝对不能放。
我的习惯:最坏情况分析只用来做“红线检查”。真正定公差,我靠蒙特卡洛 + 敏感度分析。最坏情况的结果,我一般乘以一个0.6~0.8的系数,作为工程实际参考。

3.5 四种方法怎么选?一张图说清楚

下面这张图,是我自己总结的公差分析方法选择流程。每次做新项目,我都会先过一遍这个决策树。

公差分析方法选择流程 系统性能要求 系统是否线性/弱非线性? 是 误差传递公式 否 蒙特卡洛方法 需要找出关键参数? 是 敏感度分析 否 最坏情况分析 确定公差分配方案 提示:实际项目中,通常组合使用多种方法。先做敏感度分析,再用蒙特卡洛验证,最后用最坏情况兜底。

3.6 实战中的组合拳

说了这么多,到底怎么用?我分享一个实际项目的流程:

  1. 第一步:用误差传递公式快速估算,看看系统大概的敏感度分布。这一步半小时搞定。
  2. 第二步:对敏感度高的参数,做蒙特卡洛模拟,跑1万次,看良率。这一步可能需要半天。
  3. 第三步:用全局敏感度分析,确认参数间的交互效应。这一步最花时间,但最值。
  4. 第四步:用最坏情况分析做个红线检查,确保极端情况也能接受。
记住:公差分析不是一次性的。设计变了、工艺变了、供应商换了,都要重新跑一遍。我见过太多项目,前期分析做得漂亮,后期一改参数就翻车。

嗯,这四种方法,说白了就是一套组合拳。你单独用哪一个都可能偏,但组合起来,就能把风险控得死死的。下次做项目,不妨试试这个流程。