预测d带中心

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import pandas as pd

abdstract

金属的d波段中心已被广泛用于根据线性Brønsted-Evans-Polanyi关系和Hammer-Nørskov d波段模型来理解金属表面催化反应中的活性趋势。在本文中,使用机器学习方法对十一种金属(Fe,Co,Ni,Cu,Ru,Rh,Pd,Ag,Ir,Pt,Au)的d波段中心及其对两种不同结构(1%金属掺杂或覆盖层覆盖的金属表面)的成对双金属中心进行了统计预测,这些方法来自现成的值作为目标金属的描述符(例如每种金属的密度和熔融焓)。使用统计交叉验证定量评估具有不同描述符数量和不同测试集/训练集比率的四种回归方法的预测准确性。结果表明,梯度提升回归(GBR)方法仅使用六个描述符可以很好地预测d波段中心,即使我们从仅给出的25%用于训练的数据中预测75%的数据(平均均方根误差(RMSE)<0.5 eV)。这证明了机器学习方法的潜在用途,与第一性原理方法相比,机器学习方法可以预测金属表面的活动趋势,CPU时间可以忽略不计。
m

introduction

催化科学的最终目标是利用金属的电子结构准确预测催化活性的趋势,从而在不进行大量试错实验的情况下,合理设计具有特殊催化性能的表面。Nørskov及其同事的d波段模型给出了对这些趋势的半定量理解,他们将d波段中心( ξ d \xi_d ξd)的能量相对于费米能级( E F E_F EF ξ d − E F \xi_d-E_F ξdEF,作为金属电子结构的函数。
假设过渡金属的 d 电子在化学吸附中起核心作用,他们使用密度泛函理论 (DFT) 作为解释给定吸附能趋势的指标,计算了各种金属的 d 带中心 ( ξ d − E F \xi_d-E_F ξdEF)吸附物:d 态相对于费米能级的能量越高,反键态越空,吸附能越大(吸附质与金属表面之间的强键合)。该模型随后通过各个研究小组的实验和理论研究进行了验证。在金属表面的反应中,中间体的强结合会导致表面中毒,而弱结合会导致中间体的可用性有限.在这两种情况下,催化速率都不是最佳的(Sabatier 原理)。因此,金属的催化活性可以表现出对 d 带中心的所谓“火山型”依赖性。一些电催化和催化研究中的实验数据表明,催化活性与 d 带中心之间存在良好的相关性。

机器学习 (ML) 方法 越来越多地用于分子科学 和材料科学。在 ML 框架中,预测计算被建模为从某些输入到期望值输出的函数。有监督的 ML 方法统计推断函数,给定称为训练集的输入-输出对实例:它们从数据中归纳学习输入-输出依赖关系的基本原理。由于 ML 方法是通用的、无第一原则的,并且完全由数据驱动,因此它们广泛适用于预测各种物理特性,这些物理特性具有未知或过于复杂的数学模型。考虑到第一性原理 计算过于耗时,无法探索全部可能性,另一方面,该领域正在生成和积累大量数据,ML 方法可以提供一种快速、高精度的第一性原理模型替代方法。然而,催化中的 ML 方法处于起步阶段。

为了证明ML方法在催化中的潜在用途,我们在本文中报告了基于ML的金属和双金属化合物d带中心的预测。DFT方法、Nørskov群计算了11种金属(Fe,Co,Ni,Cu,Ru,Rh,Pd,Ag,Ir,Pt,Au)及其110种双金属的d波段中心,这些金属具有两种不同的结构(表面杂质和干净金属表面上的覆盖层).如本例所示,常规情况下,每种金属或双金属的d波段中心是由第一性原理计算的。 相比之下,本文定量研究了一种基于ML的完全数据驱动的方法,该方法从其他一些金属和双金属的d波段中心推断出金属或双金属的d波段中心。例如,从材料信息学的角度来看,诸如Cu-Co的d-band中心是否可以以某种方式从Cu,Au,Cu-Fe,Ni-Ru,Pd-Co和Rh-Pd中推断出来的问题将非常有趣。我们的结果表明,通过ML方法,使用一小组现成的金属属性作为描述符,d波段中心具有足够的可预测性。鉴于近年来各种数据的快速增长,这表明ML方法在绕过或补充第一性原理计算方面具有广阔的作用。

methods and data

dataset and descriptors

为了评估 ML 预测的准确性,我们使用 11 种金属(Fe、Co、Ni、Cu、Ru、Rh、 Pd、Ag、Ir、Pt、Au)和所有成对的双金属合金(110 对主体金属 M h M_h Mh 和客体金属 Mg)与费米能级 E F E_F EF ϵ d − E F \epsilon_d-E_F ϵdEF相关的d-band中心数据。这些值是在Nørskov等人的DFT研究中获得的,1,2用于两种不同结构的表面杂质(表1)和覆盖层(表2)。在原始表格中,双金属的 d 波段中心以相对于纯净金属值的偏移给出,并将它们转换为相对于费米能级的值。对于表 1,所考虑的表面是最紧密堆积的,并且 1% 的客体金属掺杂在主体金属的表面上。对于表 2,覆盖层结构是赝晶,在主体金属的表面上形成客体金属的单层。尽管这两种结构在物理上非常不同,但表1和表2之间的Pearson相关系数为0.948(p <0.001),并且d波段中心高度相关。因此为了区分这些结构特定值,任何数据驱动的预测都需要一个高度适应性的机制,可以捕捉到这种微妙的差异。

数据地址:https://github.com/lgd-matlab/-.git

#从pdf读取
import camelot
tables = camelot.read_pdf('takigawa2016.pdf', pages=str(2),
                          flavor="stream",
                          strip_text="\n",
                         row_tol=2) #类似于Pandas打开CSV文件的形式
df1=tables[0].df # get a pandas DataFrame!


df1.drop([0,1,2],axis=0,inplace=True)

df_surface=df1.replace('\(cid:1\)','-',regex=True)
df_surface.reset_index(drop=True)
0 1 2 3 4 5 6 7 8 9 10 11
0 Mh Fe Co Ni Cu Ru Rh Pd Ag Ir Pt Au
1 Fe -0.92 -0.87 -1.12 -1.05 -1.21 -1.46 -2.16 -1.75 -1.28 -2.01 -2.34
2 Co -1.16 -1.17 -1.45 -1.33 -1.41 -1.75 -2.54 -2.08 -1.53 -2.36 -2.73
3 Ni -1.20 -1.10 -1.29 -1.10 -1.43 -1.60 -2.26 -1.82 -1.43 -2.09 -2.42
4 Cu -2.11 -2.07 -2.40 -2.67 -2.09 -2.35 -3.31 -3.37 -2.09 -3.00 -3.76
5 Ru -1.20 -1.15 -1.40 -1.29 -1.41 -1.58 -2.23 -1.68 -1.39 -2.03 -2.25
6 Rh -1.49 -1.39 -1.57 -1.29 -1.69 -1.73 -2.27 -1.66 -1.56 -2.08 -2.22
7 Pd -1.46 -1.29 -1.33 -0.89 -1.59 -1.47 -1.83 -1.24 -1.30 -1.64 -1.66
8 Ag -3.58 -3.46 -3.63 -3.83 -3.46 -3.44 -4.16 -4.30 -3.16 -3.80 -4.45
9 Ir -1.90 -1.84 -2.06 -1.90 -2.02 -2.26 -2.84 -2.24 -2.11 -2.67 -2.85
10 Pt -1.92 -1.77 -1.85 -1.53 -2.11 -2.02 -2.42 -1.81 -1.87 -2.25 -2.30
11 Au -2.93 -2.79 -2.93 -3.01 -2.86 -2.81 -3.39 -3.35 -2.58 -3.10 -3.56
df2=tables[1].df
df2.drop(np.arange(0,43,1),axis=0,inplace=True)
df2.drop(55,axis=0,inplace=True)
df_overlayers=df2.replace('\(cid:1\)','-',regex=True)
df_overlayers.drop([7,11],axis=1,inplace=True)
df_overlayers.reset_index(drop=True)
0 1 2 3 4 5 6 8 9 10 12 13
0 Mh Fe Co Ni Cu Ru Rh Pd Ag Ir Pt Au
1 Fe -0.92 -0.78 -0.96 -0.97 -1.65 -1.64 -2.24 -2.17 -1.87 -2.40 -3.11
2 Co -1.18 -1.17 -1.37 -1.23 -1.87 -2.12 -2.82 -2.53 -2.26 -3.06 -3.56
3 Ni -0.33 -1.18 -1.29 -1.17 -1.92 -2.03 -2.61 -2.43 -2.15 -2.82 -3.39
4 Cu -2.42 -2.29 -2.49 -2.67 -2.89 -2.94 -3.71 -3.88 -2.99 -3.82 -4.63
5 Ru -1.11 -1.04 -1.12 -1.11 -1.41 -1.53 -1.88 -1.81 -1.54 -2.02 -2.27
6 Rh -1.42 -1.32 -1.39 -1.51 -1.70 -1.73 -2.12 -1.81 -1.70 -2.18 -2.30
7 Pd -1.47 -1.29 -1.29 -1.03 -1.94 -1.58 -1.83 -1.68 -1.52 -1.79 -1.97
8 Ag -3.75 -3.56 -3.62 -3.68 -3.80 -3.63 -4.03 -4.30 -3.50 -3.93 -4.51
9 Ir -1.78 -1.71 -1.78 -1.55 -2.12 -2.14 -2.53 -2.20 -2.11 -2.60 -2.70
10 Pt -1.90 -1.72 -1.71 -1.47 -2.13 -2.01 -2.23 -2.06 -1.96 -2.25 -2.33
11 Au -3.03 -2.82 -2.85 -2.86 -3.09 -2.89 -3.21 -3.44 -2.77 -3.13 -3.56
Y1=pd.DataFrame(df_surface.iloc[1:,1:].values.astype(float))
Y1#surface的d带中心
0 1 2 3 4 5 6 7 8 9 10
0 -0.92 -0.87 -1.12 -1.05 -1.21 -1.46 -2.16 -1.75 -1.28 -2.01 -2.34
1 -1.16 -1.17 -1.45 -1.33 -1.41 -1.75 -2.54 -2.08 -1.53 -2.36 -2.73
2 -1.20 -1.10 -1.29 -1.10 -1.43 -1.60 -2.26 -1.82 -1.43 -2.09 -2.42
3 -2.11 -2.07 -2.40 -2.67 -2.09 -2.35 -3.31 -3.37 -2.09 -3.00 -3.76
4 -1.20 -1.15 -1.40 -1.29 -1.41 -1.58 -2.23 -1.68 -1.39 -2.03 -2.25
5 -1.49 -1.39 -1.57 -1.29 -1.69 -1.73 -2.27 -1.66 -1.56 -2.08 -2.22
6 -1.46 -1.29 -1.33 -0.89 -1.59 -1.47 -1.83 -1.24 -1.30 -1.64 -1.66
7 -3.58 -3.46 -3.63 -3.83 -3.46 -3.44 -4.16 -4.30 -3.16 -3.80 -4.45
8 -1.90 -1.84 -2.06 -1.90 -2.02 -2.26 -2.84 -2.24 -2.11 -2.67 -2.85
9
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的有终端约束的模型预测控制(MPC)的 Matlab 代码示例。此示例使用了 Quadprog 函数进行优化。 首先,我们需要定义系统的动态模型和约束条件。在此示例中,我们使用一个简单的二次型系统: ``` % System model A = [1.1, 0.4; 0.2, 1.3]; B = [1; 0.5]; C = [1, 0]; D = 0; % Constraints u_min = -1; u_max = 1; y_min = -1; y_max = 1; ``` 接下来,我们定义 MPC 控制器的参数。在此示例中,我们使用一个预测时间步长为 5,控制时间步长为 1,预测模型为系统模型的离散时间版本: ``` % MPC parameters N = 5; % Prediction horizon T = 1; % Control horizon Q = eye(2); % State cost R = 1; % Control cost x0 = [0; 0]; % Initial state ``` 现在我们可以开始实现 MPC 控制器。首先,我们定义一个状态向量 `x`,并将其初始化为初始状态 `x0`。然后,我们进入一个循环,在每个时间步骤中求解一个优化问题,以计算下一个时间步骤的最优控制输入 `u`。优化问题的目标是最小化预测误差的平方和,同时满足约束条件。 ``` % MPC control loop x = x0; for t = 1:T % Build prediction model [Ad, Bd] = c2d(A, B, t); [x_min, x_max, u_min_t, u_max_t] = compute_constraints(x, u_min, u_max, y_min, y_max, C, D, Ad, Bd); [H, f, Aeq, beq, lb, ub] = build_qp_matrices(Ad, Bd, N, Q, R, x, x_min, x_max, u_min_t, u_max_t); % Solve QP problem options = optimoptions('quadprog', 'Display', 'off'); u = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options); u = u(1); % Update state x = Ad*x + Bd*u; % Print results fprintf('Time step %d: u = %f, x = [%f, %f]\n', t, u, x(1), x(2)); end ``` 在每个时间步骤中,我们需要重新计算约束条件。由于终端约束是动态的,因此需要在每个时间步骤中重新计算。我们定义了一个名为 `compute_constraints` 的辅助函数来执行此操作。 ``` function [x_min, x_max, u_min_t, u_max_t] = compute_constraints(x, u_min, u_max, y_min, y_max, C, D, Ad, Bd) x_min = [y_min - C*x; -inf]; x_max = [y_max - C*x; inf]; u_min_t = u_min - D*x; u_max_t = u_max - D*x; for i = 2:size(Ad, 1) x_min = [x_min; y_min - C*Ad^(i-1)*x - C*Ad^(i-2)*Bd*u_min_t]; x_max = [x_max; y_max - C*Ad^(i-1)*x - C*Ad^(i-2)*Bd*u_max_t]; u_min_t = [u_min_t; u_min - D*Ad^(i-2)*Bd*u_min_t]; u_max_t = [u_max_t; u_max - D*Ad^(i-2)*Bd*u_max_t]; end end ``` 最后,我们定义一个名为 `build_qp_matrices` 的辅助函数来构建优化问题的矩阵形式。 ``` function [H, f, Aeq, beq, lb, ub] = build_qp_matrices(Ad, Bd, N, Q, R, x, x_min, x_max, u_min, u_max) n = size(Ad, 1); m = size(Bd, 2); % Build cost matrices Q_bar = kron(eye(N), Q); R_bar = kron(eye(N), R); H = Bd'*kron(eye(N+1), Ad)*Q_bar*kron(eye(N+1), Ad')*Bd + R_bar; f = 2*Bd'*kron(ones(N+1, 1), Ad')*Q_bar*(Ad*x) + 2*R_bar*kron(ones(N, 1), u_min); % Build constraint matrices Aeq = [kron(eye(N), -Bd), kron(eye(N+1), Ad) - eye(n*(N+1))]; beq = [-Ad*x; zeros(n*N, 1)]; lb = [kron(ones(N, 1), u_min); u_min]; ub = [kron(ones(N, 1), u_max); u_max]; for i = 1:N+1 lb = [lb; x_min]; ub = [ub; x_max]; end end ``` 这就完成了一个简单的有终端约束的 MPC 控制器的 Matlab 代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值