考虑一个微分方程,确切地说,Polanyi-Wigner方程:
dy/dt = - v*(y(t))^n * exp(-E/(kt))/b (*)
该等式描述了颗粒从表面的解吸行为。一种称为热解吸光谱的实验技术绘制dy/dt
因此可以从实验数据中提取动力学信息,如解吸能量E,解吸顺序n
和指前因子v
。
根据dy / dt和y来观察解吸能E通常是有趣的:
E(y) = -kt*ln((dy/dt * b)/(v*(y(t))^n)) (**)
正如我们所看到的,当应用eq(*
)时,eq(**
)可描述的热解吸谱应导致恒定的解吸能E(y)
。
通过应用*
来解决eq(odeint
)非常简单:
def polwig_single(coverage,E,n,v, beta, Tmin,Tmax):
k=8.6173/100000.
def f(y, t):
Si = y[0]
# the Polanyi-Wigner Equation
f0 = -v*np.power(Si,n)*np.exp(-E/(k*t))/beta
return [f0]
S0 = coverage
y0 = [S0]
t = np.linspace(Tmin, Tmax, 10*(Tmax-Tmin))
soln = odeint(f, y0, t)
S = soln[:, 0]
S1=[0 if x<0 else x for x in S]
pw=-np.gradient(S1)
return[S1,pw]
但是,如果我尝试用这个定义来解决eq(**
):
def inv_pol_wig(pw,S,n,v,beta,Tmin,Tmax):
t = np.linspace(Tmin, Tmax, 10*(Tmax-Tmin)) # time grid
k=8.6173/100000# Boltzmann constant
list1=[x / y for x,y in zip(pw,S)]
list2=[beta * elem0 for elem0 in list1]
list3=[elem1 / v for elem1 in list2]
list4=[np.log(elem2) for elem2 in list3]
Edes=[-(k * t) * elem3 for t,elem3 in zip(t,list4)]
return[Edes]
我遇到了问题,当我假设一个太大的v
(10倍)时,我只能获得恒定的解吸能量。我犯了一些错误吗?
- 编辑:我在inv_pol_wig的代码中发现了一个小错误,因为我忘了包含解吸顺序n
:
def inv_pol_wig(pw,S,n,v,beta,Tmin,Tmax):
t = np.linspace(Tmin, Tmax, 10*(Tmax-Tmin)) # time grid
k=8.6173/100000# Boltzmann constant
list1=[x / np.power(y,n) for x,y in zip(pw,S)]
list2=[beta * elem0 for elem0 in list1]
list3=[elem1 / v for elem1 in list2]
list4=[np.log(elem2) for elem2 in list3]
Edes=[-(k * t) * elem3 for t,elem3 in zip(t,list4)]
return[Edes]
不幸的是,此调试无法解决问题。
- 编辑Nr。 2: 仍然没有解决方案,但我做了一些故障排除并更改了polwig_single-function:
def polwig_single(coverage,E,n,v, beta, Tmin,Tmax):
k=8.6173/100000.
def f(y, t):
Si = y[0]
# the Polanyi-Wigner Equation
f0 = -v*np.power(Si,n)*np.exp(-E/(k*t))/beta
return [f0]
S0 = coverage
y0 = [S0]
t = np.linspace(Tmin, Tmax, 10*(Tmax-Tmin))
soln = odeint(f, y0, t)
S = soln[:, 0]
S1=S
pw=-np.gradient(S1)
return[S1,pw]