第九届“数维杯”大学生数学建模挑战赛(C题)深度剖析|建模完整过程+详细思路+代码全解析

ops/2024/10/20 4:05:30/

问题1

问题1的建模过程如下:

设勘探区域为 D D D,勘探井位数量为 n n n,每个勘探井位的坐标为 ( x i , y i ) , i = 1 , 2 , . . . , n (x_i,y_i),i=1,2,...,n (xi,yi),i=1,2,...,n。根据勘探数据,假设该区域内天然气水合物资源的分布范围为一个矩形区域,记为 R = [ x m i n , x m a x ] × [ y m i n , y m a x ] R=[x_{min},x_{max}]\times [y_{min},y_{max}] R=[xmin,xmax]×[ymin,ymax]

根据天然气水合物资源的分布特点,可以采用高斯核函数来估计资源的分布情况,即
f ( x , y ) = ∑ i = 1 n 1 2 π σ 2 e − ( x − x i ) 2 + ( y − y i ) 2 2 σ 2 , ( x , y ) ∈ D f(x,y)=\sum_{i=1}^n\frac{1}{2\pi\sigma^2}e^{-\frac{(x-x_i)^2+(y-y_i)^2}{2\sigma^2}},(x,y)\in D f(x,y)=i=1n2πσ21e2σ2(xxi)2+(yyi)2,(x,y)D
其中, f ( x , y ) f(x,y) f(x,y)表示资源分布的概率密度函数, σ \sigma σ为高斯核函数的标准差,可以根据具体情况来确定。

根据资源的分布概率密度函数,可以求得资源的累积分布函数为
F ( x , y ) = ∫ − ∞ x ∫ − ∞ y f ( u , v ) d u d v F(x,y)=\int_{-\infty}^x\int_{-\infty}^yf(u,v)dudv F(x,y)=xyf(u,v)dudv
根据题目给出的勘探数据,可以计算出每个勘探井位对应的天然气水合物资源的概率分布,即每个点 ( x i , y i ) (x_i,y_i) (xi,yi)对应的概率 f ( x i , y i ) f(x_i,y_i) f(xi,yi)。因此,可以根据累积分布函数的性质来确定天然气水合物资源的分布范围,即求解下面的不等式组
{ F ( x , y ) ≤ 0.95 F ( x , y ) ≥ 0.05 ( x , y ) ∈ R \begin{cases} F(x,y)\le 0.95\\ F(x,y)\ge 0.05\\ (x,y)\in R \end{cases} F(x,y)0.95F(x,y)0.05(x,y)R
其中, F ( x , y ) F(x,y) F(x,y)为累积分布函数。

解出上述不等式组即可得到天然气水合物资源的分布范围 R R R

根据所给勘探数据,我们可以确定天然气水合物资源的分布范围为勘探区域内的14口井。每口井都有相应的深度信息和测量的孔隙度和天然气水合物饱和度信息。因此,我们可以根据勘探数据中的深度信息和勘探区域的地质信息,确定每口井的坐标,并绘制出勘探区域的地图。

python示例代码实现:

import pandas as pd
import matplotlib.pyplot as plt
import geopandas as gpd# 读取勘探井位信息数据
well_data = pd.read_excel('well_data.xlsx')# 绘制勘探井位地图
fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(well_data['经度'], well_data['纬度'], color='red', s=5)
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
ax.set_title('勘探井位地图')
plt.show()# 连接勘探井位线段
fig, ax = plt.subplots(figsize=(8, 8))
ax.plot(well_data['经度'], well_data['纬度'], color='red', linewidth=2)
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
ax.set_title('勘探井位连线图')
plt.show()# 利用地理信息系统(GIS)绘制资源分布范围
gdf = gpd.GeoDataFrame(well_data, geometry=gpd.points_from_xy(well_data['经度'], well_data['纬度']))
fig, ax = plt.subplots(figsize=(10, 10))
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
ax.set_aspect('equal')
world.plot(ax=ax, color='lightgray', edgecolor='black')
gdf.plot(ax=ax, color='red', markersize=10)
plt.show()

问题2

问题2的建模过程如下:

假设研究区域内的有效厚度、地层孔隙度和饱和度分别为 T ( x , y ) T(x,y) T(x,y) P ( x , y ) P(x,y) P(x,y) S ( x , y ) S(x,y) S(x,y),其中 x x x y y y分别表示水平和垂直方向的空间坐标。则在勘探区域内,这些参数的概率分布可以表示为:

有效厚度的概率分布:

P ( T ) = N T N P(T) = \frac{N_T}{N} P(T)=NNT

其中, N T N_T NT表示研究区域内有效厚度大于零的点的数量, N N N表示研究区域内总的点的数量。

地层孔隙度的概率分布:

P ( P ) = N P N P(P) = \frac{N_P}{N} P(P)=NNP

其中, N P N_P NP表示研究区域内地层孔隙度大于零的点的数量, N N N表示研究区域内总的点的数量。

饱和度的概率分布:

P ( S ) = N S N P(S) = \frac{N_S}{N} P(S)=NNS

其中, N S N_S NS表示研究区域内饱和度大于零的点的数量, N N N表示研究区域内总的点的数量。

这些参数的变化规律可以通过统计分析得到,比如通过计算不同区域内的平均值、方差等。

3)给出天然气水合物的概率分布,以及估计天然气水合物资源量。

天然气水合物的概率分布可以表示为:

P ( H ) = P ( T ) × P ( P ) × P ( S ) P(H) = P(T) \times P(P) \times P(S) P(H)=P(T)×P(P)×P(S)

其中, H H H表示天然气水合物的存在概率, P ( T ) P(T) P(T) P ( P ) P(P) P(P) P ( S ) P(S) P(S)分别表示有效厚度、地层孔隙度和饱和度的概率分布。

天然气水合物的资源量可以通过计算总的天然气水合物储量得到,即:

Q = ∑ i = 1 N H i × V i × F Q = \sum_{i=1}^{N} H_i \times V_i \times F Q=i=1NHi×Vi×F

其中, N N N表示勘探区域内的点的数量, H i H_i Hi表示第 i i i个点的天然气水合物的存在概率, V i V_i Vi表示该点的储量, F F F表示产气量因子。

问题3

问题三的建模过程如下:

1)天然气水合物资源的概率分布:
天然气水合物资源的概率分布可以通过计算各个勘探点的水合物饱和度和有效厚度的乘积来得到。假设勘探点数为n,勘探点i的水合物饱和度为 S i S_i Si,有效厚度为h_i,则该点的天然气水合物资源量为 V i = S i ∗ h i V_i = S_i * h_i Vi=Sihi。根据中心极限定理,当样本量较大时,各个勘探点的天然气水合物资源量近似为正态分布,因此可以对各个勘探点的资源量进行求和,得到整个研究区域内天然气水合物资源量的概率分布,即:
P ( V ) = ∑ i = 1 n 1 2 π σ e − ( V − V i ) 2 2 σ 2 P(V) = \sum_{i=1}^{n} \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(V-V_i)^2}{2\sigma^2}} P(V)=i=1n2π σ1e2σ2(VVi)2
其中, σ \sigma σ为资源量的标准差,可以通过样本数据计算得到。

2)估计天然气水合物资源量:
天然气水合物资源量的估计可以通过计算平均资源量和总资源量来得到。平均资源量为各个勘探点的资源量的平均值,即:
V ˉ = 1 n ∑ i = 1 n V i \bar{V} = \frac{1}{n} \sum_{i=1}^{n} V_i Vˉ=n1i=1nVi
总资源量为各个勘探点的资源量的总和,即:
V t o t a l = ∑ i = 1 n V i V_{total} = \sum_{i=1}^{n} V_i Vtotal=i=1nVi

3)具体计算:
假设勘探点数n=14,根据给定的勘探数据,可以计算出各个勘探点的水合物饱和度和有效厚度。假设勘探点i的水合物饱和度为 S i S_i Si,有效厚度为 h i h_i hi,则该点的天然气水合物资源量为 V i = S i ∗ h i V_i = S_i * h_i Vi=Sihi
根据这些数据,可以计算出平均资源量和总资源量:
V ˉ = 1 14 ∑ i = 1 14 V i = 1 14 ( V 1 + V 2 + . . . + V 14 ) \bar{V} = \frac{1}{14} \sum_{i=1}^{14} V_i = \frac{1}{14} (V_1 + V_2 + ... + V_{14}) Vˉ=141i=114Vi=141(V1+V2+...+V14)
V t o t a l = ∑ i = 1 14 V i = V 1 + V 2 + . . . + V 14 V_{total} = \sum_{i=1}^{14} V_i = V_1 + V_2 + ... + V_{14} Vtotal=i=114Vi=V1+V2+...+V14

给出python示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit# 定义产气量因子
gas_factor = 1# 读取勘探数据
depth_data = np.genfromtxt('depth.csv', delimiter=',')
porosity_data = np.genfromtxt('porosity.csv', delimiter=',')
saturation_data = np.genfromtxt('saturation.csv', delimiter=',')# 计算有效厚度
thickness = []
for i in range(len(depth_data)):for j in range(len(depth_data[i])):if saturation_data[i][j] != 0:if i == 0 or saturation_data[i-1][j] == 0:thickness.append(depth_data[i][j])else:thickness.append(depth_data[i][j] - depth_data[i-1][j])# 计算孔隙度和饱和度的概率分布
porosity_hist = np.histogram(porosity_data, bins=10)
saturation_hist = np.histogram(saturation_data, bins=10)# 拟合概率分布曲线
def func(x, a, b, c):return a * np.exp(-b * x) + cpopt_porosity, pcov_porosity = curve_fit(func, porosity_hist[1][:-1], porosity_hist[0])
popt_saturation, pcov_saturation = curve_fit(func, saturation_hist[1][:-1], saturation_hist[0])# 计算天然气水合物资源量
gas_resource = []
for i in range(len(thickness)):gas_resource.append(thickness[i] * porosity_data[i] * saturation_data[i] * gas_factor)# 绘制结果
fig = plt.figure(figsize=(10, 10))# 绘制孔隙度和饱和度的概率分布曲线
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(porosity_hist[1][:-1], porosity_hist[0], 'b-', label='porosity')
ax1.plot(porosity_hist[1][:-1], func(porosity_hist[1][:-1], *popt_porosity), 'r--', label='fit curve')
ax1.set_xlabel('porosity')
ax1.set_ylabel('probability')
ax1.set_title('Porosity Distribution')
ax1.legend()ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(saturation_hist[1][:-1], saturation_hist[0], 'b-', label='saturation')
ax2.plot(saturation_hist[1][:-1], func(saturation_hist[1][:-1], *popt_saturation), 'r--', label='fit curve')
ax2.set_xlabel('saturation')
ax2.set_ylabel('probability')
ax2.set_title('Saturation Distribution')
ax2.legend()# 绘制天然气水合物资源量的柱状图
ax3 = fig.add_subplot(2, 1, 2)
ax3.bar(range(len(gas_resource)), gas_resource)
ax3.set_xlabel('depth')
ax3.set_ylabel('gas resource quantity')
ax3.set_title('Gas Resource Quantity Distribution')plt.tight_layout()
plt.show()# 输出天然气水合物资源量的估计值
print("The estimated gas resource quantity is:", sum(gas_resource))

查看完整思路详见:
【腾讯文档】第九届“数维杯”大学生数学建模挑战赛全题目深度剖析建模完整过程+详细思路+代码全解析(持续更新中!)
https://docs.qq.com/doc/DSHd6UHpNZkZoWmxw


http://www.ppmy.cn/ops/39658.html

相关文章

初始Linux(基础命令)

前言: 我们不能总沉浸在编程语言中,虽然代码能力提升了,但是也只是开胃小菜。我们要朝着更高的方向发展。 最近小编一直在刷力扣,以至于博客更新的比较少。今天就带各位开始学习全新的知识——Linux.至于为啥要学? Lin…

【定制化】在Android平台实现自定义的程序启动页

特别说明:以下仅适用于Android平台。 实现原理 创建安卓端自定义的Activity禁用UnityPlayerActivity的启动Logo改用自定义Activity 示例效果 参考简单步骤或详细步骤都可实现。 自定义的启动动画,效果如下: 简单步骤 三步操作实现启动动画…

Spring-Bean 作用域

作用域 作用域案例 public class BeanScopeDemo {AutowiredQualifier("singletonPerson")Person person;AutowiredQualifier("prototypePerson")Person person1;AutowiredQualifier("prototypePerson")Person person2;AutowiredSet<Person&g…

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…

如何使用google.protobuf.Struct?

google.golang.org/protobuf/types/known/structpb 包提供了一种方式来创建和操作 google.protobuf.Struct 类型的数据。google.protobuf.Struct 是一种灵活的数据类型&#xff0c;可以表示任何结构化数据。 以下是如何使用 structpb 包的一些示例&#xff1a; 创建 Struct&a…

高斯数据库创建函数的语法

CREATE FUNCTION 语法格式 •兼容PostgreSQL风格的创建自定义函数语法。 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | : | } expression ]} [, …] ] ) [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_…

Linux函数

目录 一、脚本函数 1.1 创建函数 1.2 使用函数 二、函数返回值 2.1 默认的退出状态码 2.2 使用return命令 2.3 使用函数输出 三、在函数中使用变量 3.1 向函数传达参数 3.2 在函数中处理变量 四、数组变量和函数 4.1 向函数中传递数组 4.2 从函数中返回数组 五、函数…

【数组算法】598. 区间加法

给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大整数的个数 。 示例 1: …