У меня есть следующая функция для вычисления приращений времени в скрипте, который моделирует серию химических реакций с течением времени
def time_step_calc(propensity_calc, state_change_array, b, epsi):
""" Function to calculate the simulation
time increment delta_t"""
propensity = propensity_calc(LHS, popul_num, stoch_rate)
print("time_step_calc propensity:\n", propensity)
denominator = np.zeros(len(propensity))
a0 = sum(propensity)
# equation 22:
exptd_state_array = 0.0
for x in range(len(propensity)):
exptd_state_array += propensity[x]*state_change_array[x]
# expected states for first two reactions are very large
print("expectd state array:\n", exptd_state_array)
# equation 24: Calculated ad-hoc results in bji matrix
numerator = epsi*a0
for j in range(len(propensity)):
for i in range(len(popul_num)):
denominator[j] += (exptd_state_array[i]*b[j, i])
# ValueError: setting an array element with a sequence
# Type Error only size-1 arrays can be converted to python scalars --> direct cause of the above error
# equation 26
delta_t_array = numerator/abs(denominator)
print("delta_t_array:\n", delta_t_array)
delta_t = min(delta_t_array)
print("The calculated value of delta_t:\n", delta_t)
return delta_t
Входные данные для функции следующие:
propensity_calc
Это еще одна функция, которая вычисляет вероятность срабатывания реакции на основе текущего количества молекул, скорости реакции и соотношения между молекулами в реакции. Выводит массив вероятностей для каждой реакции с именем propensity
state_change_array
- это массив, который описывает разницу в количестве молекул между продуктами и реагентами каждой реакции
epsi
просто константа, которая используется в некоторых расчетах.
LHS
крыса ios между реагентами каждого уравнения (массива)
popul_num
дискретное количество молекул для каждого вида в реакция (массив)
stoch_rate
скорость реакции для каждого вида в реакции (массив)
Но b
- вот где у меня проблемы. Это массив, содержащий частные производные, которые указаны c для моделируемой системы реакций каждой системы реакций.
В одной модели b
был определен как b = np.array([[1.0, 0.0, 0.0], [stoch_rate[1]*(2*(popul_num[0]) - 1)/2, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.4, 0.0]])
, и это работает идеально, как я хочу.
Но в этой модели частные производные изменились, поэтому b
изменилось на b = np.array([[stoch_rate*popul_num[0], stoch_rate*popul_num[1], 0.0, 0.0], [0.0, 0.0, 0.0001, 0.0], [0.0, 0.0, 0.1, 0.0]])
Насколько я могу судить, все остальное между двумя моделями идентично, но в функции показанное выше со вторым значением массива b
, я получаю следующие ошибки
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
File "c:/Users/Mike/visual studio code project/MSc dissertation code/tau_leaping_variant_ssa.py", line 116, in time_step_calc
denominator[j] += (exptd_state_array[i]*b[j, i])
ValueError: setting an array element with a sequence.
и не могу понять, почему это изменение на b
приведет к следующей ошибке, если действительно это моя проблема?
Ура