我正在尝试制作 Gillespie 算法的变体,并确定反应倾向,我正在尝试使用 lambda 表达式自动生成倾向向量。然而,当创建 SSA.P 时,一切都出错了。代码块中的最后一个循环 PROPLOOP 返回两个倾向,其中使用 P_alternative 生成的倾向是正确的倾向。问题是:如何获得 SSA.P 与 SSA.P_alternative 相同的值?
import numpy as np
from numpy.random import uniform
class Markov:
def __init__(self,z0,t0,tf,rates,stoich):
self.S=stoich
self.z0=z0
self.rates=rates
self.P=self.propensities()
self.P_alternative=[
lambda z,rate:(0.5*rate[0]*z[0]*(z[0]-1)),
lambda z,rate:rate[1]*np.prod(z[0]),
lambda z,rate:rate[2]*np.prod(z[1]),
lambda z,rate:rate[3]*np.prod(z[1]),
lambda z,rate:rate[4]*np.prod(z[np.array([0,1])]),
lambda z,rate:rate[5]]
self.t0=t0
self.tf=tf
def propensities(self):
prop=[]
for i,reac in enumerate(self.S.T):
if all(z>=0 for z in reac):
prop.append(lambda z,rate:rate[i])
if any(z==-1 for z in reac):
j=np.where(reac==-1)[0]
prop.append(lambda z,rate:rate[i]*np.prod(z[j]))
if any(z==-2 for z in reac):
j=np.where(reac==-2)[0][0]
prop.append(lambda z,rate:(0.5*rate[i]*z[j]*(z[j]-1))[0])
return …Run Code Online (Sandbox Code Playgroud)