原油数据处理:1.聚类、盐含量测定与近红外光谱快速评估

一、原油种类的聚类分析

在塔里木盆地塔河油田的原油处理过程中,需要对原油进行地球化学特征研究,以了解其成因和特征。根据地球化学手段的综合研究结果,塔河油田奥陶系原油属于海相沉积环境,成熟度较高,正构烷烃分布较完整,具有UCM(Unresolved Complex Mixture)鼓包现象,25-降藿烷普遍存在,伽马蜡烷含量较低,C29藿烷丰度高,规则甾烷(αββ构型)丰度高于ααα构型。这些特征表明塔河油田的原油经历了较强的微生物降解作用,并存在至少两个期次的原油充注。

我们不妨假设将塔河油田原油划分为三类I类原油具有多期充注特征,但主要表现出早期生物降解原油的特征,早期生物降解原油的贡献高于后期充注正常原油的贡献;II类原油可能经历过强烈的微生物降解,部分样品正构烷烃缺失,UCM鼓包明显;III类原油受热成熟度影响较大,正构烷烃热裂解导致低碳数正构烷烃相对富集,代表混合原油但正常原油的贡献较大。

首先,我们生成三个特征('三环萜烷/五环萜烷'、'Ts/17αC30藿烷'、'重排甾烷/规则甾烷')的随机数值作为原油样本数据,生成了100个样本。接着,通过导入的sklearn.cluster库中的KMeans类,创建了一个KMeans对象,并设定聚类数目为3。然后,调用fit方法对样本数据进行聚类分析。

完整代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from matplotlib.font_manager import FontProperties# 设置字体
font = FontProperties(fname=r'C:\Users\Lenovo\PycharmProjects\allModels0119\Draw\wordcloud\fonts\msyh.ttc', size=12)# 模拟原油样本数据
data = {'三环萜烷/五环萜烷': np.random.uniform(0.5, 7.82, size=100),'Ts/17αC30藿烷': np.random.uniform(0.33, 2.01, size=100),'重排甾烷/规则甾烷': np.random.uniform(0.25, 2.11, size=100)
}df = pd.DataFrame(data)# 使用KMeans算法进行聚类分析
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)# 获取聚类结果
labels = kmeans.labels_# 将聚类结果添加到数据框中
df['label'] = labels# 绘制三维散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')scatter = ax.scatter(df['三环萜烷/五环萜烷'], df['Ts/17αC30藿烷'], df['重排甾烷/规则甾烷'], c=df['label'])# 添加图例,并设置中文显示
handles, labels = scatter.legend_elements()
plt.legend(handles, labels, loc='best', prop=font)ax.set_xlabel('三环萜烷/五环萜烷', fontproperties=font)
ax.set_ylabel('Ts/17αC30藿烷', fontproperties=font)
ax.set_zlabel('重排甾烷/规则甾烷', fontproperties=font)plt.show()

记得把字体地址改为你的电脑上字体所在地址,或者直接注释掉,用英文图例

运行结果如下:

二、基于X射线荧光光谱的盐含量测定

        原油中的无机盐含量对设备腐蚀、管线结垢堵塞、加热设备效率以及最终产品质量等方面有影响。为了分析原油中的盐含量,目前常用的方法有电量法、电位滴定法和电导法等。然而,这些方法存在一些问题,如对仪器和环境要求高、操作复杂等。因此,为了解决这些问题,提出了一种新的方法,即单波长色散X射线荧光光谱法。该方法通过将原油中的无机盐萃取至乙醇水溶液中,然后利用已做好的标准曲线来快速测定无机氯含量,从而计算出原油中的盐含量。这种方法具有准确性高、重复性好、分析速度快、仪器维护简单等优点,可以作为传统方法的替代方法。

当X射线与原子相互作用时,会发生散射和荧光现象。在荧光现象中,X射线会激发原子中的电子,使其跃迁到更高能级,然后再从高能级跃迁回到较低能级时放出能量。这些放出的能量形成了荧光光谱,可以用来分析样品中的元素。盐类元素在荧光光谱中具有特定的特征峰,不同元素对应着不同的特征峰。通过测量荧光光谱中这些特征峰的强度和位置,可以确定样品中各种元素的含量。对于原油中的盐含量分析,主要关注氯元素。实验中,使用X射线源发出的X射线经入射光单色器衍射形成一束能够激发氯元素K层电子的单色激发光束。将这束光照射到原油样品上,样品中的氯元素会发出特定波长为0.473nm的Ka特征X射线荧光。这个波长的X射线荧光由一固定通道单色器收集并聚集到探测器上,从而得到原油样品的X射线荧光强度(计数/s)。通过使用事先制备好的标准溶液进行校准,可以将样品X射线荧光强度转换为样品中氯的含量(以毫克/千克计)。根据氯的含量,可以计算出相应的氯化钠含量(以毫克/千克计)。

在实验中,需要制备标准溶液,选择干燥的NaCl作为溶质,用超纯水溶解。通过称取适量的NaCl溶解后,稀释并混合均匀,以制备出所需浓度的标准溶液。

完整代码如下:

import numpy as np
import matplotlib.pyplot as plt# 生成原油样品的荧光光谱数据
def generate_fluorescence_spectrum():# 生成荧光光谱的波长范围和强度wavelength = np.linspace(0.4, 1.0, 100)  # 波长范围0.4到1.0intensity = np.random.rand(100)  # 荧光强度随机生成return wavelength, intensity# 计算样品中的盐含量
def calculate_salt_content(fl_spectrum):# 假设荧光光谱中的特征峰对应盐类元素的含量salt_peak_intensity = np.max(fl_spectrum[1])  # 荧光光谱的最大强度salt_content = salt_peak_intensity * 10  # 假设强度和盐含量的线性关系return salt_content# 生成标准溶液的荧光光谱数据
def generate_standard_fluorescence_spectrum(salt_content):# 假设标准溶液的荧光光谱与盐含量成正比intensity = salt_content * np.random.rand(100)  # 荧光强度与盐含量成正比# 假设标准溶液的波长范围与原油样品相同wavelength = np.linspace(0.4, 1.0, 100)  # 波长范围0.4到1.0return wavelength, intensity# 校准曲线拟合
def calibrate_curve(standard_spectrum):# 假设标准曲线是线性拟合salt_content = np.linspace(0, 100, 100)  # 盐含量范围0到100calibration_curve = np.polyfit(standard_spectrum[1], salt_content, 1)  # 线性拟合return calibration_curve# 生成测试样品的荧光光谱数据
sample_fl_spectrum = generate_fluorescence_spectrum()
sample_salt_content = calculate_salt_content(sample_fl_spectrum)# 生成标准溶液的荧光光谱数据
standard_fl_spectrum = generate_standard_fluorescence_spectrum(sample_salt_content)# 校准曲线拟合
calibration_curve = calibrate_curve(standard_fl_spectrum)# 转换测试样品的盐含量
sample_salt_content_converted = np.polyval(calibration_curve, sample_fl_spectrum[1])# 绘制荧光光谱图
plt.figure(figsize=(8, 6))
plt.plot(sample_fl_spectrum[0], sample_fl_spectrum[1], label='Sample Fluorescence Spectrum')
plt.plot(standard_fl_spectrum[0], standard_fl_spectrum[1], label='Standard Fluorescence Spectrum')
plt.xlabel('Wavelength')
plt.ylabel('Intensity')
plt.title('Fluorescence Spectrum Comparison')
plt.legend()
plt.show()# 打印样品盐含量和转换后的盐含量
print("测试样品的盐含量:", sample_salt_content)
print("转换后的盐含量:", sample_salt_content_converted)

运行结果:

三、近红外光谱数据库快速评估

        为了解决近红外光谱数据库快速评估的问题,提高识别速度和准确性,研究人员通过将主成分分析和移动窗口相关系数技术相结合,构建了一个小数据库来快速识别与待测原油最相似的样本。针对原油性质的微小变化和采集差异引起的识别问题,他们采用蒙特卡罗方法生成了虚拟原油样本,并通过主成分分析来确定与待测原油一致的样本。通过这种方式,他们能够快速获得准确的评价数据,从而提高了近红外光谱原油识别的效率和准确性。

        完整代码如下:

import numpy as np
import matplotlib.pyplot as plt# 模拟近红外光谱数据库
database_spectrum = np.random.rand(100, 1000)# 生成待测原油光谱
unknown_spectrum = np.random.rand(1, 1000)# 主成分分析压缩数据库光谱
compressed_database = np.dot(database_spectrum, np.transpose(database_spectrum))
compressed_unknown_spectrum = np.dot(unknown_spectrum, np.transpose(database_spectrum))# 寻找与待测原油最相似的4个样本
distances = np.linalg.norm(compressed_database - compressed_unknown_spectrum, axis=1)
top_4_indices = np.argsort(distances)[:4]# 移动窗口相关系数法在小库中识别与待测原油一致的库光谱
similar_spectra = database_spectrum[top_4_indices]# 蒙特卡罗方法生成更多的虚拟原油样本
D = 1000
virtual_samples = []
for i in range(D):random_index = np.random.choice(top_4_indices)virtual_samples.append(np.random.normal(database_spectrum[random_index], scale=0.1, size=(1000,)))# 主成分分析取前两个主成分作图
virtual_samples = np.array(virtual_samples)
virtual_samples_compressed = np.dot(virtual_samples, np.transpose(database_spectrum))
pc1 = virtual_samples_compressed[:, 0]
pc2 = virtual_samples_compressed[:, 1]# 图像绘制
fig, (ax1, ax2) = plt.subplots(2, 1)# 绘制蒙特卡罗模拟结果
ax1.scatter(pc1, pc2)
ax1.set_xlabel('PC1')
ax1.set_ylabel('PC2')
ax1.set_title('Monte Carlo Simulation')# 绘制主成分分析结果
pc1 = compressed_database[:, 0]
pc2 = compressed_database[:, 1]
ax2.scatter(pc1, pc2)
ax2.set_xlabel('PC1')
ax2.set_ylabel('PC2')
ax2.set_title('Principal Component Analysis')plt.tight_layout()
plt.show()

        运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存映射实现父子进程通信

创建内存映射区: void *mmap(void *addr ,size_t length,int prot,int flags,int fd,off_t offset); 参数: addr 指定映射区的首地址。通常NULL,表示让系统自动分配length 共享内存映射区的长度prot 共享内存的读写属性 PROT_READ PR…

【记录37】VueBaiduMap 踩坑一

截图 错误 Error in callback for watcher “position.lng”: “TypeError: Cannot read properties of undefined (reading ‘setPosition’)” 解释 回调观察程序“content”时出错:“TypeError:无法读取未定义的属性(读取’setContent’)”…

数据结构:Heap(二叉树)的基本操作

目录 1.有关二叉树必须知道的几个基本概念 2.有关二叉树的基本操作 2.0有关元素的定义以及要进行的操作 2.1初始化和销毁操作 2.2插入操作以及上调操作 2.2.1插入操作以及上调操作的图解 2.2.2插入操作以及上调操作的代码 2.3删除根元素及其下调操作 2.3.2删除根元素及…

Android studio Gradle下载失败,如何手动配置解决该问题详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 前言: 今天在打开公司一个项目时,突然要重新下载相关的gradle&am…

Websocket实时音视频传输应用实战

背 景 随着互联网技术的发展,越来越多的企业和开发者开始寻求更高效、更稳定的通信解决方案。在这种背景下,WebSocket协议应运而生。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它可以实现服务器和客户端之间的实时数据交换&#…

图像处理 mask掩膜

1,图像算术运算 图像的算术运算有很多种,比如两幅图像可以相加,相减,相乘,相除,位运算,平方根,对数,绝对值等;图像也可以放大,缩小,旋…

(二十一)从零开始搭建k8s集群——kubernates核心组件及功能介绍

前言 Kubernetes是一个可移植、可扩展、开源的平台,用于管理容器化的工作负载和服务,它促进了声明性配置和自动化。Kubernetes容器可以持续开发、集成和部署:可靠且频繁地构建和部署容器镜像,快速有效地回滚;开发与运…

点胶缺陷视觉检测都是怎么检测的?

点胶工艺是许多工业生产中不可或缺的一环,而点胶缺陷的存在往往直接影响到产品质量。为了提升点胶工艺的品质控制,点胶缺陷的视觉检测成为了一个重要的技术手段。 一、点胶缺陷的类型 点胶缺陷主要包括胶点大小不均、位置偏移、漏点、多点等。这些缺陷如…

IntelliJ IDEA 2020.2.4试用方法

打开idea,准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项,并点击重置 查看免费试用时长

启动查看工具总结

启动目标:2s内优秀,2-5s普通,之后的都需要优化,热启动则是1.5s-2s内 1 看下大致串联启动流程: App 进程在 Fork 之后,需要首先执行 bindApplication Application 的环境创建好之后,就开始activ…

【Web前端】Vue核心基础

文章目录 1. Vue简介2. Vue官网使用指南3. 初识Vue3.1 搭建Vue开发环境3.2 HelloWorld案例3.3 el与data的两种写法3.4 MVVM模型3.5 模板语法 4. 数据绑定4.1 v-bind单向数据绑定4.2 v-model双向数据绑定 5. 事件处理5.1 v-on绑定事件5.2 事件修饰符5.3 键盘事件 6. 计算属性6.1…

typescript学习(更新中)

目录 开发环境搭建类型如何声明有哪些类型编译配置文件 开发环境搭建 npm i -g typescripttsc检查是否安装成功 类型如何声明 // 先声明再赋值 let a: number a 1// 直接赋值 let b 1function sum(a: number, b: number): number {return a b } console.log(sum(1, 2))有…

leetcode72. 编辑距离

leetcode72. 编辑距离 题目 思路 dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数,所以, 当 word1[i] word2[j],dp[i][j] dp[i-1][j-1]; 当 word1[i] ! word2[j],dp[i][j] 1 min(dp[i-1][j-1]…

Ubantu 18.04 如何映射IP到公网,外网可以访问

介绍一种简单的方式,就是通过路由侠 inux 系统安装路由侠,可通过两种方式进行,一种是通过直接脚本安装,一种是通过 Docker 安装。 windows下载地址:路由侠-局域网变公网 方式一:通过脚本安装 1、获取安…

java算法第十七天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 leetcode链接 思路: 使用后序遍历分别求左右子树的高度,若高度只差大于一,则返回-1,否则返回当前节点的最大高度。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tree…

【数据分享】2013-2022年全国范围逐日SO2栅格数据

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2013-2022年全国范围逐月SO2栅格数据和逐年SO2栅格数据(均可查看之前的文章获悉详情)。 本次我们给大家带来的是2013-2022年全国范围的逐日的SO2栅格数据,原始…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择?CPU内存、公网带宽和系统盘怎么选择?个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例,企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器,阿里云服务器网aliyunfuwuqi.com整…

OJ_二叉排序树

题干 C实现 循环双指针法(一个指向父亲&#xff0c;一个指向待插入结点) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <queue> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };void InsertBST(TreeNode* …

C# OpenCvSharp DNN FreeYOLO 人脸检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 人脸检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…

每日OJ题_链表⑤_力扣25. K 个一组翻转链表

目录 力扣25. K 个一组翻转链表 解析代码 力扣25. K 个一组翻转链表 25. K 个一组翻转链表 难度 困难 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总…