Почему небольшое изменение во вводе функции python нарушает мой код? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующая функция для вычисления приращений времени в скрипте, который моделирует серию химических реакций с течением времени

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 приведет к следующей ошибке, если действительно это моя проблема?

Ура

...