🍍Python和R水力电导率和达西流神经算子

Python | R | 水力电导率 | 物理 | 达西流 | 神经算子 | 土壤 | 三维 | 静态 | 交互式 | 模拟 | 流体 | 模型 | 浅水 | 平流 | 流量 | 河流 | 蒸发散

🏈指点迷津 | Brief

📜水力电导率和达西流 - 用例

📜水力电导率机器学习预测土壤特性变化 | 📜三维体达西流静态和交互式模拟

📜Python流体数据统计模型和浅水渗流平流模型模拟

📜Python高克勒-曼宁-斯特里克勒公式计算一维流量

📜Python和Julia河流湖泊沿海水域特征数值算法模型

📜Python蒸发散物理问题(微积分-线性代数-拉普拉斯和傅立叶变换)

✒️Python多孔材料流体渗透性

由于材料的渗透性,不同的物质可以穿过它们。它允许气体、液体和磁场的移动。然而,流体渗透性是水文学、土壤力学和石油工程的主要关注点。这调节液体通过多孔材料的流动。了解流体渗透性很重要。它允许开发有效的过滤器,预测地下水运动,并增强石油开采。

达西定律描述了流体通过多孔材料的流动。这是与渗透性相关的基本概念。在许多领域,达西定律都具有重要意义。它提供了有关材料特性、流体动力学和地质过程的信息。虽然渗透性有好处,但也有缺点。由于渗透性因材料而异,并且取决于温度和压力等变量,因此很难预测和适当调节。此外,由于渗透性物质的复杂性和众多元素的相互作用,准确的测量和计算经常带来困难,需要先进的实验和计算技术。

从井中提取岩心数据后,这些数据会被带到实验室进行分析。沿着取回的岩心样本的长度,会进行一系列测量。其中两个是孔隙度和渗透率,这两者都是岩石物理分析的关键组成部分。

孔隙度是渗透率的关键控制因素,孔隙越大,储层流体流过的通道就越宽。测井工具不能直接测量渗透率,因此必须通过与来自同一油田或油井的岩心数据的关系或根据经验导出的方程来推断。

一种常用方法是绘制孔隙度(线性标度)与渗透率(对数标度)的关系图,并观察趋势。由此,可以将回归应用于孔隙度渗透率(孔隙度-渗透率)交会图以得出一个方程,该方程随后可用于根据任何井中计算出的孔隙度预测连续渗透率。

在本文中,我将介绍如何使用 Python 中的两种方法进行孔隙度-渗透率回归。

 import pandas as pd
 import matplotlib.pyplot as plt
 import numpy as np

在分析岩心板时,会不定期地进行有限数量的测量。在某些情况下,可能无法进行测量,例如在非常紧密(渗透性低)的部分。因此,我们可以告诉 pandas 加载任何缺失值。

 core_data = pd.read_csv("Data/CORE.csv", na_values=' ')

加载数据后,我们可以通过调用 .head() 和 .describe() 方法来查看其中内容的详细信息。.head() 方法返回数据帧的前五行和标题行。

 core_data.head()
 DEPTH  OrigDepth  CORE_NO  SAMPLE  CKHG  CKHL  CKVG  CKVL  CPOR  CPORV  So  Sw  CGD  CGDV 03838.603837.001113.8011.500NaNNaN17.0NaNNaNNaN2.66NaN13838.853837.2512NaNNaNNaNNaN14.8NaNNaNNaN2.67NaN23839.153837.551325.2021.4003.943.1610.8NaNNaNNaN2.69NaN33839.403837.80141.020.694NaNNaN12.8NaNNaNNaN2.70NaN43839.483837.8815NaNNaNNaNNaNNaN18.852.936.4NaN2.68\begin{array}{llllllllllllllll} & \text { DEPTH } & \text { OrigDepth } & \text { CORE\_NO } & \text { SAMPLE } & \text { CKHG } & \text { CKHL } & \text { CKVG } & \text { CKVL } & \text { CPOR } & \text { CPORV } & \text { So } & \text { Sw } & \text { CGD } & \text { CGDV } \\ \hline 0 & 3838.60 & 3837.00 & 1 & 1 & 13.80 & 11.500 & NaN & NaN & 17.0 & NaN & NaN & NaN & 2.66 & NaN \\ 1 & 3838.85 & 3837.25 & 1 & 2 & NaN & NaN & NaN & NaN & 14.8 & NaN & NaN & NaN & 2.67 & NaN \\ \hline 2 & 3839.15 & 3837.55 & 1 & 3 & 25.20 & 21.400 & 3.94 & 3.16 & 10.8 & NaN & NaN & NaN & 2.69 & NaN \\ 3 & 3839.40 & 3837.80 & 1 & 4 & 1.02 & 0.694 & NaN & NaN & 12.8 & NaN & NaN & NaN & 2.70 & NaN \\ \hline 4 & 3839.48 & 3837.88 & 1 & 5 & NaN & NaN & NaN & NaN & NaN & 18.8 & 52.9 & 36.4 & NaN & 2.68 \end{array}

.describe() 方法返回有关数据帧中包含的数值数据的有用统计信息,例如平均值、标准差、最大值和最小值。

 DEPTH  OrigDepth  CORE_NO  SAMPLE  CKHG  CKHL  CKVG  CKVL  CPOR  CPORV  So  Sw  count 728.000000728.000000728.00000728.000000557.000000557.000000141.000000141.000000593.00000071.00000071.00000071.000000 mean 3920.5283383920.1533383.93956364.500000649.801463627.972549490.086071472.87528416.82934219.49718356.94366228.309859 std 46.54569546.9028161.75976210.2997862160.1273872116.3070231973.6010981929.4200186.5525235.65776321.08431919.203758min3838.6000003837.0000001.000001.0000000.0180000.0100000.0300000.0170002.9000002.7000000.0000004.50000025%3882.5800003881.9800003.00000182.7500002.6200002.0300000.8740000.59000012.00000018.15000052.00000018.20000050%3921.7250003921.1250004.00000364.50000059.90000052.30000027.30000023.30000018.10000021.20000062.30000022.80000075%3960.2875003960.4875005.00000546.250000213.000000194.000000108.00000096.30000021.70000023.50000068.50000029.950000max3999.9500003999.7500007.00000728.00000020800.00000020500.00000014800.00000014500.00000036.00000027.80000086.00000090.800000\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline & \text { DEPTH } & \text { OrigDepth } & \text { CORE\_NO } & \text { SAMPLE } & \text { CKHG } & \text { CKHL } & \text { CKVG } & \text { CKVL } & \text { CPOR } & \text { CPORV } & \text { So } & \text { Sw } \\ \hline \text { count } & 728.000000 & 728.000000 & 728.00000 & 728.000000 & 557.000000 & 557.000000 & 141.000000 & 141.000000 & 593.000000 & 71.000000 & 71.000000 & 71.000000 \\ \hline \text { mean } & 3920.528338 & 3920.153338 & 3.93956 & 364.500000 & 649.801463 & 627.972549 & 490.086071 & 472.875284 & 16.829342 & 19.497183 & 56.943662 & 28.309859 \\ \hline \text { std } & 46.545695 & 46.902816 & 1.75976 & 210.299786 & 2160.127387 & 2116.307023 & 1973.601098 & 1929.420018 & 6.552523 & 5.657763 & 21.084319 & 19.203758 \\ \hline \min & 3838.600000 & 3837.000000 & 1.00000 & 1.000000 & 0.018000 & 0.010000 & 0.030000 & 0.017000 & 2.900000 & 2.700000 & 0.000000 & 4.500000 \\ \hline 25 \% & 3882.580000 & 3881.980000 & 3.00000 & 182.750000 & 2.620000 & 2.030000 & 0.874000 & 0.590000 & 12.000000 & 18.150000 & 52.000000 & 18.200000 \\ \hline 50 \% & 3921.725000 & 3921.125000 & 4.00000 & 364.500000 & 59.900000 & 52.300000 & 27.300000 & 23.300000 & 18.100000 & 21.200000 & 62.300000 & 22.800000 \\ \hline 75 \% & 3960.287500 & 3960.487500 & 5.00000 & 546.250000 & 213.000000 & 194.000000 & 108.000000 & 96.300000 & 21.700000 & 23.500000 & 68.500000 & 29.950000 \\ \hline \max & 3999.950000 & 3999.750000 & 7.00000 & 728.000000 & 20800.000000 & 20500.000000 & 14800.000000 & 14500.000000 & 36.000000 & 27.800000 & 86.000000 & 90.800000 \\ \hline \end{array}

使用我们的 core_data 数据框,我们可以通过在数据框末尾添加 .plot 并提供一些参数来简单快速地绘制数据。在本例中,我们需要一个散点图(在岩石物理学中也称为交叉图),x 轴为 CPOR(岩心孔隙度),y 轴为 CKH(岩心渗透率)。

从这个散点图中,我们注意到低渗透率的点集中度很高,而高渗透率的点则很少。我们可以通过将 y 轴转换为对数刻度并添加网格来整理我们的图。这将生成我们在岩石物理学中熟悉的孔隙-渗透率交叉图。

 core_data.plot(kind="scatter", x="CPOR", y="CKH")
 plt.yscale('log')
 plt.grid(True)

如果我们想要访问其中一个参数,例如 CPOR 值的斜率或常数,我们可以像访问列表一样访问它:

 results.params[1]

返回结果是:0.174287

然后我们可以拼凑出用于预测渗透率的方程:

 渗透率 =100.174287( 孔隙度 100)1.556078\text { 渗透率 }=10^{0.174287 *(\text { 孔隙度 } * 100)-1.556078}

最后,我们可以使用以下代码将方程应用到散点图上:

 ax.semilogy(core_data['CPOR'], 10**(results.params[1] * core_data['CPOR'] + results.params[0]), 'r-')

散点图的完整代码:

 from matplotlib.ticker import FuncFormatter
 fig, ax = plt.subplots()
 ax.axis([0, 30, 0.01, 100000])
 ax.semilogy(core_data['CPOR'], core_data['CKHG'], 'bo')
 ax.grid(True)
 ax.set_ylabel('Core Perm (mD)')
 ax.set_xlabel('Core Porosity (%)')
 ax.semilogy(core_data['CPOR'], 10**(results.params[1] * core_data['CPOR'] + results.params[0]), 'r-')
 ​
 for axis in [ax.yaxis, ax.xaxis]:
     formatter = FuncFormatter(lambda y, _: '{:.16g}'.format(y))
     axis.set_major_formatter(formatter)

现在我们有了方程且满意的结果,我们可以将其应用于测井孔隙度以生成连续的渗透率曲线。

Last updated