4. 产量曲线误差判读的指标体系

历史拟合中“曲线看起来差不多”不能作为验收依据。要把拟合好坏说清楚,必须把观测产量与模拟产量之间的差异压缩成一组可比较、可复现的数值指标。本节围绕绝对误差、相对误差、平均误差与均方根误差四类基础指标展开,并给出在 Eclipse 输出数据上直接计算的方法与判读阈值。

一、先约定符号与参照方向

设某口井或某个区块在时间步 i(i = 1…N)上的实测产量为 qobs,i,Eclipse 模拟产量为 qsim,i。全文统一采用“模拟减实测”作为误差方向:

ei = qsim,i − qobs,i

因此 ei > 0 表示模拟偏高(模型产得太多),ei < 0 表示模拟偏低。这一符号约定在后续所有指标、图表和判读中保持一致,切换参照系时必须显式说明。油、气、水三相分别独立计算,不混算。

二、四类基础指标的定义

绝对误差是最原始的单点差异,即上面的 ei,单位与产量相同(如 m³/d 或 10⁴m³/d)。它直观但不可跨井、跨相横向比较,因为不同井的产量基数差异很大。

相对误差把绝对误差归一化到实测值上:

REi = (qsim,i − qobs,i) / qobs,i × 100%

相对误差解决了量纲与基数问题,但有两个陷阱:一是实测值接近零(如关井、见水初期)时分母极小,相对误差会爆炸;二是正负误差在求和时会相互抵消。因此工程上通常对分母做保护,例如 qobs,i 低于该井历史最大产量的 5% 时,该点不参与相对误差统计,只保留绝对误差。

平均误差(也称偏差,Bias)反映系统性偏高或偏低:

ME = (1/N) · Σ ei

ME 的绝对值小,说明模型整体上没有系统性偏移;但 ME 接近零并不代表拟合好,因为正负误差可能大幅抵消。所以 ME 必须与均方根误差配对使用。

均方根误差(RMSE)衡量误差的整体离散程度,对大误差更敏感:

RMSE = √[ (1/N) · Σ ei² ]

RMSE 恒为非负,单位与产量相同。它惩罚大偏差,因此能捕捉“大部分点贴合、少数点严重偏离”的情形,这正是历史拟合中最需要警惕的问题。

此外,工程上常补充平均绝对相对误差 MAPE = (1/N)·Σ|REi|,用于跨井横向比较;以及决定系数 R²,用于判断模拟曲线对实测趋势的解释能力。R² 对趋势敏感但对幅值偏差不敏感,不能单独作为验收指标。

产量曲线误差指标体系与判读逻辑 Eclipse 输出 WOPR / WGPR / WWPR 时间步汇总 实测数据 井口计量 / 试井 对齐同一时间轴 逐点误差 e = q_sim − q_obs 正=偏高 负=偏低 绝对误差 e 单点幅值,同量纲 相对误差 RE e / q_obs ×100% 平均误差 ME 系统性偏差 均方根 RMSE 离散度,惩罚大偏差 判读决策 |ME| 小 → 无系统偏移 RMSE 小 → 整体贴合 MAPE 小 → 跨井可比 R² 高 → 趋势正确 四者需同时满足 不可单指标验收 判读顺序:先看 RMSE 与 ME 判断整体偏差性质,再看 MAPE 做跨井比较,最后用 R² 确认趋势形态; 任一指标超阈值即回到参数调整,不允许用其他指标“平均掉”异常。

三、在 Eclipse 输出数据上直接计算

Eclipse 的 Summary 文件按时间步输出 WOPR、WGPR、WWPR 等向量,实测数据通常来自生产日报或试井解释。计算前必须做两件事:一是把两者对齐到同一时间轴(建议统一为月步,避免日数据噪声放大 RMSE);二是剔除关井、修井、停产等非模型可控时段,否则这些点的相对误差没有物理意义。

下面是一段可直接复用的 Python 计算示例,输入为两个等长的产量序列(示例数据为教学假设,非实测结果):

import numpy as np

# q_obs: 实测月产量, q_sim: Eclipse 模拟月产量, 单位 m3/d
q_obs = np.array([120.0, 118.0, 115.0, 110.0, 104.0, 98.0])
q_sim = np.array([126.0, 121.0, 119.0, 112.0, 108.0, 103.0])

e = q_sim - q_obs                      # 绝对误差, 正=模拟偏高
mask = q_obs >= 0.05 * q_obs.max()     # 剔除低产点的相对误差
re = np.where(mask, e / q_obs * 100, np.nan)

ME   = e.mean()
RMSE = np.sqrt((e ** 2).mean())
MAPE = np.nanmean(np.abs(re))
R2   = 1 - (e ** 2).sum() / ((q_obs - q_obs.mean()) ** 2).sum()

print(f"ME={ME:.2f}  RMSE={RMSE:.2f}  MAPE={MAPE:.2f}%  R2={R2:.3f}")

以上示例数据代入后,ME ≈ +4.17 m³/d,RMSE ≈ 4.36 m³/d,MAPE ≈ 3.7%,R² ≈ 0.94。这组结果的含义是:模型整体系统性偏高约 4 m³/d,离散度与偏差量级相当,说明偏差以系统性为主而非随机波动,应优先检查压力水平或采液指数,而不是逐点调参。

四、建立量化判读标准

指标算出来只是数字,必须落到阈值上才能判读。阈值不能一刀切,应按“单井—井组—区块”三级分别设定,并区分油、气、水三相。下表给出一套可直接套用的参考标准(适用于中高含水期常规砂岩油藏,示例性质,实际项目应结合资料丰度调整):

层级指标优秀合格需重拟合
单井MAPE≤5%5%–10%>10%
|ME| / 平均产量≤3%3%–8%>8%
R²≥0.950.85–0.95<0.85
井组RMSE / 平均产量≤5%5%–12%>12%
MAPE≤8%8%–15%>15%
区块RMSE / 平均产量≤5%5%–10%>10%
R²≥0.900.80–0.90<0.80

使用这张表时有三个关键约定。第一,归一化:RMSE 和 ME 必须除以该对象历史平均产量,否则高产井的绝对误差天然偏大,无法横向比较。第二,分相判读:油相拟合好不代表水相拟合好,含水率上升阶段的 WWPR 往往是拟合难点,必须单独设阈值。第三,分段判读:把历史期切成投产初期、稳产期、递减期三段分别计算指标,因为整体 RMSE 合格可能掩盖某一阶段的严重偏离。

判读时优先看“误差结构”而非“误差大小”:ME 与 RMSE 量级接近,说明偏差是系统性的,应调压力、相渗或储量参数;RMSE 远大于 |ME|,说明误差正负交替、随机性强,应检查时间对齐、计量误差或局部网格。这一判断直接决定后续调参方向。

五、从指标到行动

指标体系的最终价值是驱动拟合动作。建议按以下顺序使用:先用 RMSE 和 ME 判断偏差性质,再用 MAPE 定位最差的井,最后用 R² 确认趋势形态是否被破坏。若某口井 MAPE 超标但 R² 很高,通常是幅值问题(如采液指数偏大);若 R² 低而 MAPE 尚可,则多为趋势或见水时间问题,应回到相渗曲线和含水饱和度场。所有指标应随拟合迭代记录成表,形成可追溯的收敛过程,而不是只在最终报告里给一个数字。

不要用单一指标“平均掉”异常点。RMSE 对个别大偏差敏感,正是它的价值所在;若发现 RMSE 被少数点拉高,应回到这些时间步检查是否有停产、措施或计量异常,而不是简单剔除数据来让指标变好看。