✨ 长期致力于改性MXenes、小分子活化、密度泛函理论、机器学习研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)构建高通量密度泛函理论计算流程:
针对二维碳氮化物表面官能团改性对析氢反应活性的影响,开发了一套自动化工作流。采用维也纳第一性原理计算包,设置平面波截断能为五百二十电子伏特,布里渊区采样采用伽马中心网格。计算了二百九十九种不同组分和官能团的MXenes材料的氢吸附自由能。以Ti2CO2为基准,发现硫官能团修饰可以显著降低氢吸附自由能,其中Sc2CS2的ΔGH*达到负零点零九电子伏特。通过Bader电荷分析揭示,硫官能团增强了表面金属原子到吸附氢的电荷转移量,平均转移零点二三个电子,比氧官能团多零点零七电子伏特。
(2)发展基于图神经网络的快速预测模型:
为绕过昂贵的第一性原理计算,构建了考虑原子种类、配位数及局部环境的消息传递神经网络。每个原子节点通过三层图卷积更新特征,全局池化后输出ΔGH*预测值。训练集包含一千二百个吸附构型,验证集三百个。模型在测试集上的平均绝对误差达到零点零五电子伏特,预测速度比密度泛函理论快五个数量级。利用该模型从六万种虚拟MXenes中筛选出四十种潜在高性能析氢催化剂,其中一种双金属MXenes Mo2TiC2S2的预测ΔGH*为负零点零二电子伏特,接近铂催化剂。
(3)揭示甲烷部分氧化制甲醇的反应路径:
采用密度泛函理论结合爬坡弹性带方法研究了Pd单原子和双原子负载于Mo2CO2上的催化机理。计算发现Pd二聚体比单原子更有利于甲烷碳氢键的活化,活化能垒仅零点六八电子伏特。反应遵循氧解离路径,首先氧分子在Pd二聚体上解离生成原子氧,然后甲烷与原子氧反应生成甲氧基中间体,最后加氢生成甲醇。整个反应的限速步骤为碳氢键断裂,能垒零点七三电子伏特。与Pt基催化剂相比,Pd2/Mo2CO2对深度氧化产物二氧化碳的选择性降低百分之四十,因为甲醇脱附能垒(零点四五电子伏特)低于甲醇进一步氧化的能垒(零点九一电子伏特)。
import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from torch_geometric.nn import MessagePassing, global_mean_pool class MXeneGNN(MessagePassing): def __init__(self, in_channels=64, hidden=128, out_channels=1): super().__init__(aggr='add') self.lin1 = nn.Linear(in_channels, hidden) self.lin2 = nn.Linear(hidden, hidden) self.lin_out = nn.Linear(hidden, out_channels) def forward(self, x, edge_index, batch): x = self.lin1(x) x = self.propagate(edge_index, x=x) x = F.relu(x) x = self.lin2(x) x = global_mean_pool(x, batch) return self.lin_out(x) def message(self, x_j): return x_j def calculate_band_center(dos_energies, dos_states): # simple d-band center calculation if len(dos_energies) == 0: return 0.0 weighted = np.sum(dos_states * dos_energies) total = np.sum(dos_states) return weighted / total if total != 0 else 0.0 def nudge_elastic_band(initial_path, forces_fn, n_images=9, max_iter=200): path = initial_path.copy() spring_k = 0.02 for it in range(max_iter): gradients = [] for i, r in enumerate(path): grad = forces_fn(r) if i == 0 or i == len(path)-1: grad = grad * 0 # fix endpoints else: tangent = (path[i+1] - path[i-1]) tangent = tangent / (np.linalg.norm(tangent)+1e-6) # spring force along tangent spring = spring_k * (2*path[i] - path[i-1] - path[i+1]) spring_proj = np.dot(spring, tangent) * tangent grad = grad + spring_proj gradients.append(grad) step = 0.1 path = path - step * np.array(gradients) if np.max(np.abs(gradients)) < 0.001: break return path