微信一键登录

科吉思石油论坛

搜索
查看: 5063|回复: 0
打印 上一主题 下一主题

油藏数值模拟中的误差问题浅谈——作者:李健

[复制链接]

23

主题

28

帖子

396

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
396
跳转到指定楼层
楼主
发表于 2016-3-2 10:21:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

——作者:李健


油藏数值模拟技术已经成为油藏开发生产管理不可或缺的一项重要手段。它可以提供比常规的分析手段更为详细的参考信息。另一方面,作为一种数值模拟技术,它包含大量的数值计算,同样无法避免所有数值计算都会面临的问题——误差。这里我们并不讨论数值模拟的数学模型与其描述的真实世界之间的差别,这些差别是科学家们在不断改进模型加以完善解决的。这里讨论的是计算机在进行数值计算时引入的误差。无论是简单的计算还是复杂的模拟,只要是数值计算,这些误差就一定存在,和数学模型无关。

有人认为只要是按照正确的公式实现的算法,计算机就能给出正确的真实的结果。那么问题就来了,这些结果是否就一定是正确的、合理的、符合真实世界的情况呢?要回答这个问题我们先来讨论下面和油藏数模相关的三个问题:

1、不同的模拟器来计算相同的数模模型是否会有误差?

2、同一个模拟器使用不同的解法计算同一个模型是否会有误差?例如全隐式或者IMPES解法?

3、同一个模拟器同一个解法计算相同的数模模型是否可能会有误差?

对于第1个问题,很多人都会很快给出一致的答案:会有误差。因为不同的模拟器对相同的方程采用的解法、变量的计算顺序等都有不同,会产生不同的截断误差,所以计算的结果会有差别。误差的大小与实际的模型相关。第2个问题也显而易见,不同的解法采用了不同的计算过程,也很有可能产生误差。

但是对于第3个问题,大部分人都会回答不会,一些人会认为即便是有也只有很细微的可以忽略不计的误差。不幸的是事实刚好相反,即便是用同一个模拟器使用相同的解法求解同一个模型,如果中间选择的计算时间步有差异,也会导致误差,甚至这个误差会很大,大到什么程度呢?相对误差可能会超过100%!

为了让大家更直观的了解这个问题,我们一起来看一个实例。这是一个40X40X3的油气水三相的黑油模型,层内均质层间非均质,总的来说物性变化不大。有注采井各一口;生产井定液生产并有最小流压限制;注水井定流量注入。生产时间3500天。

我们以这个模型为基础模型创建三个测试模型C1、C2、C3。这三个模型都使用100天作为报告步,一共35个。都使用全隐式解法。不同的是三个模型限制不同的最大计算时间步,用这样的设置来模拟同一个模型在不同收敛性的模型中时间步的选择不同。见下表所示:

模型
时间步控制
C1
计算时间步为默认值
C2
控制最大计算时间步限制为5天
C3
控制最大计算时间步限制为30天

按照以上的设置,这三个模型将使用不同的时间间隔来计算35个100天,其结果会出乎很多人的意料。(见下图)

从上图的结果可以看出,产油量可能变化还较小,但是含水率的误差非常大。2500天到3000天这个时间段C2和C1之间的相对误差已经超过100%,在2600天和2700天时甚至超过200%,不仅结果误差大,甚至曲线的增减规律在某些时间段内也不同,甚至相反;例如3000天附近,C1和C2是在上升而C3是在下降。

类似这样的模型还有很多,比它复杂的模型更多,都可以充分的证明即便是同一个模拟器,如果计算时间步不同——即会导致实际的计算中的变量变化、数值处理过程不同——结果就可能会有明显的差异。到这里很多细心的读者会提出一个问题,那么如果不同的模拟器在计算同一个模型时,如果速度不同或收敛性不同都会导致时间步不同,这样也会产生误差吧?答案是肯定的。如果同一个模型,模拟器A效率高收敛性好,计算了2个小时,而模拟器B效率低且收敛性差,计算了2天甚至更长时间,它们的结果很可能出现较大差异,此时要比较或者强调A 和B的一致性是没有意义的。

看到这里很多人已经明白造成这些误差的原因,那就是截断误差。对于一部分不太了解的读者,我们先来解释一下截断误差。这里我们需要说明一下计算机中的数值表示。计算机的底层是大量的开关电路,形象一点就是众多的0和1,它将连续的数值与离散的状态联系起来,使得我们可以近似真实世界的东西,但是这也有它的局限性。例如,在真实世界中我们可以写

,但是在计算机中我们很难对进行描述,在计算时它必须表示为具体的数值。众所周知,是一个无理数,它的值为1.4142135623730950488016887242097……,小数点的后面是无穷多个数字。那么能不能用1.414或者1.41421356237来描述 呢?下表对比了不同类型下的值。

数值类型
的值
实际值
1.4142135623730950488016887242097……
单精度
1.414214
双精度
1.4142135623731

从上表可以看出,无论在用单精度还是双精度来代替进行数值计算,从某种程度上都是对其实际值进行了截断,这种利用有限项来近似无穷项所产生的误差,就称为截断误差。它在数值计算中无处不在,如简单的加减乘除、复杂积分或微分等等。可以说,截断误差是数值计算中造成数值结果与真实结果差别的主要原因。

看到这里很多人会提出,用尽量多的有效位数来可以解决这个问题,避免截断或者减轻它的影响。例如使用64位或者更高的位数。这样固然可以增加精度,但是会增加数据项长度,在数值计算时不仅会占用更多内存空间而且会增加单个数据的操作时间,这些成本都需要考虑进去。更重要的是截断误差的影响往往伴随着不同的计算过程发生,这些过程并不因使用更多的有效位数而发生改变。为了说明这个问题,我们来计算下面的一个简单公式:

在数模计算中所用到的公式可能比这个要复杂很多,同时我们也会遇到很多小的数值,例如刚刚脱气网格的含气饱和度、水刚刚可以流动时的相渗值以及其他很多的中间结果等等。这里我们x取双精度类型,当x取不同值时计算

值。同时我们用另外一种方法来计算并与原式比较结果,将进行如下变形得到新的函数 :

与是相等的。取不同的x值计算后得到下表(注:下表在Excel2016的Visual Basic中计算,x定义为double类型):

x取值
对的相对误差(%)
1E-2
99.9987499609363
99.9987499609354
8.95295E-13
1E-8
99999999.4975241
100000000
5.02476E-07
1E-10
9999999172.59636
10000000000
8.27404E-06
1E-13
10007999171934.4
10000000000000
0.079927784
1E-15
1.12589990684262E+15
1E+15
11.18215803

从计算结果可以看出,在x在取较小值的的时候,两种方法计算出的结果误差逐渐变得显著。一部分读者可能已经指出变形才是比原式更理想的计算方法(由于篇幅关系不深入讨论,请读者自行查阅相关资料),可以认为变形后计算的结果更接近真实世界,而直接用原式计算反而与结果在x较小时产生很大误差,这是增大有效位数无法解决的误差问题。

不敢想象如果这些发生在油藏数值模拟的计算中,将会产生怎样不可思议的结果。但是这些情况确实一直在油藏数值模拟中发生,不同的计算过程再加上计算机的"截断"过程造就了这些误差。庆幸的是很多的科学家都在不断的改进算法来求解数学模型,使得这个影响逐步降低,例如本例对的变形处理。很多时候一些数学方程在经过算法改造后,可以更容易收敛。

综上所述,我们在油藏数值模拟中要正视造成这些误差的原因,如不同的解法、不同的时间步、采用并行计算等都会引起这些误差。于是收敛性差计算慢的模型会产生更多的误差,对于这样的模型要先尝试解决其收敛性问题,有时需要对数模数据体的一些错误数据进行适当修正;对于修正了问题但是收敛仍然很慢的情况,说明当前模拟器对模型的求解效率降低,则需要使用采用新算法新架构的模拟器来计算,否则花了大量时间勉强计算出的结果通常是误差较大的无效结果。

本文中所用的数模数据体请从以下连接下载:

示例数据体

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|服务支持:DZ动力|科吉思石油技术咨询有限公司 ( 京ICP备15057753号

GMT+8, 2024-5-3 05:36 , Processed in 0.265625 second(s), 37 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表