当前位置:   article > 正文

2024年第九届数维杯大学生数学建模挑战赛C 题解题思路1.0版本

2024年第九届数维杯大学生数学建模挑战赛C 题解题思路1.0版本

题目分析:

问题背景:天然气水合物作为一种高效的清洁后备能源,其资源量评估对未来能源开发极为重要。

具体任务:

0.数据预处理

首先将txt中的数据合并到表格里方便后续操作,从Excel文件导入数据,清洗数据,包括删除标记为无效的数据(如-9999)。对其中空缺值使用克里金插值进行补充。

将数据重构成适合分析的格式,为每个钻井分配独立的列(深度、孔隙度、含水合物饱和度)。并进行初始数据的可视化,

首先我们可以对附件二的地理位置以及部分附件一的数据进行可视化。井位可视化:利用钻井的X、Y坐标在地图上绘制井位,以直观展示钻井的空间分布。钻井数据可视化:选择个别钻井(例如w01和w02),绘制孔隙度和含水合物饱和度随深度的变化曲线图,以了解地质参数的分布特征。 

 

 

  1. 确定天然气水合物资源分布范围。

根据钻井数据,确定资源分布的可能边界。这可以通过建立最小外接矩形、Voronoi图或使用空间插值方法(如克里金插值)来完成,以描绘资源的概率分布图。

我们可以绘制单一井的可视化,也可以绘制七个井的可视化,

 

 

最后利用py输出每一个井的高低差即可,并机型可视化表达。 

  1. 研究资源参数的概率分布及变化规律。

描述性统计分析:计算每个参数的统计描述(均值、中位数、方差等)并绘制其分布(直方图、箱形图)。

概率模型选择:根据数据特性选择合适的概率分布模型(如正态分布、对数正态分布或贝塔分布)来拟合各参数。

地统计学分析:利用克里金方法或其他空间插值技术,研究参数在研究区域内的空间变异性,为参数的空间分布提供模型。

我们实际使用了四种不同的分布拟合情况:正态分布、对数正态分布、Weibull分布和Beta分布,结果均不理想,具体结果如下所示

 

各种分布方式P值都很低,因此,使用混合分布模型,最终得出含有5个高斯分布组件的模型作为最佳模型。 

  1. 给出资源量的概率分布估计。

集成模型建立:结合前步骤的地统计模型,计算每个位置的资源量预测值。

蒙特卡洛模拟:利用蒙特卡洛方法对资源量进行随机模拟,以产生资源量的概率分布。

资源量汇总:使用统计方法(如积分或求和)从模拟数据中估计整个区域的总资源量和不确定性。

Q=A*Z*O*S*E 式中,Q为天然气水合物资源量(m3),A是有效面积m2,Z为有效厚度(m),O为孔隙度,S为水合物饱和度,E是产气量因子(取值为 155)。 对于每个井位有效面积m2、有效厚度(m)、产气量因子均不一样。 同一井位有效面积m2、有效厚度(m)、产气量因子一样,水合物饱和度、孔隙度,因此对于给出天然气水合物资的概率分布,对于同一井位的只需要看位两者乘积的变化,对于不同井位需要考虑水合物饱和度、孔隙度水合物饱和度、孔隙度四者的乘积,

  1. 讨论如何安排额外的钻孔位置以优化资源勘探。

数据评估:分析现有钻孔数据,识别数据空白区域或参数高变异性区域。

优化模型:应用地统计学和优化算法(如遗传算法或模拟退火)来选择最佳钻井位置。这些位置应当能最大化潜在资源的发现概率,同时考虑成本效益。

多目标决策分析:考虑多个因素(如成本、资源潜力和环境影响),使用决策支持系统或多标准决策分析来最终确定钻井位置。

  1. 使用了Voronoi图中心作为新井位置的候选点,一个有效的策略是通过计算现有Voronoi区域中未充分覆盖的最大区域,并在这些区域中心放置新井。
  2. 使用K-均值聚类算法确定新钻井点的位置,可以帮助均匀地分布井位,以便均衡资源勘探的效率
  3. 通过蒙特卡洛模拟随机生成新井位置,并计算每种可能位置的效益(如覆盖未探测区域的比例),重复多次以找到最优解。
  4. 最大化覆盖模型

这种模型旨在选择井位以最大化地区资源的勘探覆盖率。这可以通过求解一个最大覆盖问题来完成,其中目标是最大化在新井的影响半径内的未探测区域的覆盖。

 

 数据合并 python代码

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import seaborn as sns
  4. # Load the Excel file
  5. file_path = '附件1:钻井测量数据.xlsx'
  6. data = pd.read_excel(file_path)
  7. # Define the number of wells (from the provided well names)
  8. num_wells = 14
  9. # Create a list for restructured data
  10. well_data_list = []
  11. # Process each well's data block (three columns per well: Depth, Porosity, Saturation)
  12. for i in range(num_wells):
  13. # Extracting each block, naming columns accordingly
  14. start_col = 3 * i
  15. well_data = data.iloc[1:, start_col:start_col+3]
  16. well_data.columns = ['Depth', 'Porosity', 'Saturation']
  17. well_data['Well'] = f"w{i+1:02d}" # Naming wells as w01, w02, ..., w14
  18. well_data_list.append(well_data)
  19. # Combine all well data into a single DataFrame
  20. combined_well_data = pd.concat(well_data_list, ignore_index=True)
  21. # Convert data types and handle missing values marked as -9999
  22. combined_well_data = combined_well_data.replace(-9999, pd.NA).dropna().astype({'Depth': 'float64', 'Porosity': 'float64', 'Saturation': 'float64'})
  23. # Save the cleaned and combined data to a new Excel file
  24. output_file_path = 'Cleaned_Drilling_Data.xlsx'
  25. combined_well_data.to_excel(output_file_path, index=False)
  26. # Given well positions
  27. well_positions = {
  28. 'w01': (34500, 45000), 'w02': (36000, 45050), 'w03': (37050, 45020),
  29. 'w04': (37880, 46000), 'w05': (35000, 46030), 'w06': (36000, 46500),
  30. 'w07': (34000, 47100), 'w08': (36200, 47330), 'w09': (34560, 48530),
  31. 'w10': (35520, 48120), 'w11': (38000, 49300), 'w12': (35700, 50000),
  32. 'w13': (34000, 49600), 'w14': (35800, 49900)
  33. }
  34. # Create a plot for well positions
  35. plt.figure(figsize=(10, 8))
  36. for well, (x, y) in well_positions.items():
  37. plt.scatter(x, y, label=well, s=100)
  38. plt.xlabel('X Coordinate')
  39. plt.ylabel('Y Coordinate')
  40. plt.title('Geographic Positions of Wells')
  41. plt.legend(title='Well Name')
  42. plt.grid(True)
  43. plt.show()
  44. # Selecting two wells for detailed visualization: Well w01 and Well w02
  45. selected_wells = ['w01', 'w02']
  46. # Filtering data for the selected wells
  47. selected_data = combined_well_data[combined_well_data['Well'].isin(selected_wells)]
  48. # Plotting data for the selected wells
  49. fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(14, 10), sharex=True)
  50. # Plotting Porosity and Saturation against Depth for each selected well
  51. for i, well in enumerate(selected_wells):
  52. # Porosity plot
  53. ax = axes[i, 0]
  54. well_data = selected_data[selected_data['Well'] == well]
  55. ax.plot(well_data['Depth'], well_data['Porosity'], label=f"Porosity of {well}")
  56. ax.set_title(f"Porosity Profile for {well}")
  57. ax.set_ylabel('Porosity')
  58. ax.grid(True)
  59. # Saturation plot
  60. ax = axes[i, 1]
  61. ax.plot(well_data['Depth'], well_data['Saturation'], label=f"Saturation of {well}", color='r')
  62. ax.set_title(f"Saturation Profile for {well}")
  63. ax.set_ylabel('Saturation')
  64. ax.grid(True)
  65. # Set common labels
  66. for ax in axes[:, 0]:
  67. ax.set_xlabel('Depth (m)')
  68. for ax in axes[:, 1]:
  69. ax.set_xlabel('Depth (m)')
  70. plt.tight_layout()
  71. plt.show()

数据预处理matlab代码

  1. % 假设已经有了钻井的X和Y坐标
  2. well_positions = [
  3. 34500, 45000;
  4. 36000, 45050;
  5. 37050, 45020;
  6. 37880, 46000;
  7. 35000, 46030;
  8. 36000, 46500;
  9. 34000, 47100;
  10. 36200, 47330;
  11. 34560, 48530;
  12. 35520, 48120;
  13. 38000, 49300;
  14. 35700, 50000;
  15. 34000, 49600;
  16. 35800, 49900
  17. ];
  18. % 创建Voronoi图
  19. figure;
  20. voronoi(well_positions(:,1), well_positions(:,2));
  21. title('Voronoi Diagram of Well Locations');
  22. xlabel('X Coordinate');
  23. ylabel('Y Coordinate');
  24. grid on;
  25. % 创建最小外接矩形
  26. k = convhull(well_positions(:,1), well_positions(:,2));
  27. hold on;
  28. plot(well_positions(k,1), well_positions(k,2), 'r-', 'LineWidth', 2);
  29. legend('Voronoi edges', 'Convex hull boundary');
  30. hold off;
  31. well_data = readtable('Cleaned_Drilling_Data.xlsx');
  32. % 添加X和Y坐标到well_data
  33. well_names = {'w01', 'w02', 'w03', 'w04', 'w05', 'w06', 'w07', 'w08', 'w09', 'w10', 'w11', 'w12', 'w13', 'w14'};
  34. for i = 1:length(well_names)
  35. idx = strcmp(well_data.Well, well_names{i});
  36. well_data.X(idx) = well_positions(i, 1);
  37. well_data.Y(idx) = well_positions(i, 2);
  38. end
  39. [XI, YI] = meshgrid(min(well_positions(:,1)):100:max(well_positions(:,1)), ...
  40. min(well_positions(:,2)):100: max(well_positions(:,2)));
  41. % 创建插值网格
  42. [XI, YI] = meshgrid(min(well_data.X):100:max(well_data.X), ...
  43. min(well_data.Y):100:max(well_data.Y));
  44. % 初始化结果矩阵
  45. ZI = zeros(size(XI));
  46. % 对每个网格点进行插值
  47. for i = 1:size(XI, 1)
  48. for j = 1:size(XI, 2)
  49. ZI(i, j) = simpleKriging(well_data.X, well_data.Y, well_data.Saturation, XI(i, j), YI(i, j));
  50. end
  51. end
  52. % 可视化插值结果
  53. figure;
  54. mesh(XI, YI, ZI);
  55. hold on;
  56. plot3(well_data.X, well_data.Y, well_data.Saturation, 'ro');
  57. title('Spatial Interpolation using Simple Kriging');
  58. xlabel('X Coordinate');
  59. ylabel('Y Coordinate');
  60. zlabel('Resource Saturation');
  61. hold off;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/663191
推荐阅读
相关标签
  

闽ICP备14008679号