在python中乘以列表的问题

时间:2013-09-22 20:13:36

标签: python differential-equations equation-solving

考虑一个微分方程,确切地说,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]

0 个答案:

没有答案