Что означает «Дополнительные аргументы должны быть в кортеже»? - PullRequest
0 голосов
/ 18 июня 2020

Когда я пытаюсь запустить приведенный ниже код, я получаю следующее сообщение об ошибке:

error                                     Traceback (most recent call last)
<ipython-input-49-c5d034b4424d> in <module>
      3 k_vals = [0.42, 0.17, 0, 0.17, 0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17]  # arbitrary in this case
      4 c0 = [1, 0.5, 0, 2, 1, 0,0,0,0,0,0,0,0,0]
----> 5 cout = odeint(rhs, c0, tout, k_vals)  # EXERCISE: rhs, c0, tout, k_vals

/opt/anaconda3/lib/python3.7/site-packages/scipy/integrate/odepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)
    243                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
    244                              ixpr, mxstep, mxhnil, mxordn, mxords,
--> 245                              int(bool(tfirst)))
    246     if output[-1] < 0:
    247         warning_msg = _msgs[output[-1]] + " Run with full_output = 1 to get quantitative information."

error: Extra arguments must be in a tuple

Код:

import numpy as np
from scipy.integrate import odeint

def rhs(c, t, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17):

r1 = k1 * c[14] * c[9]
r2 = k2 * c[8] * c[9]
r3 = k3 * c[13]**2 * c[0]**2
r4 = k4 * c[13] * c[2]
r5 = k5 * c[9] * c[4]
r6 = k6 * c[10] * c[12]
r7 = k7 * c[11]**2 * c[0]**2
r8 = k8 * c[11] * c[2]
r9 = k9 * c[10] * c[4]
r10 = k10 * c[10] * c[8]
r11 = k11 * c[12] * c[9]
r12 = k12 * c[0] * c[5]
r13 = k13 * c[6]
r14 = k14 * c[6]
r15 = k15 * c[3]
r16 = k16 * c[2]
r17 = k17 * c[14]

return [2*(r2-r3) + 2*(r6 - r7) + r13 - r12, 
        r17, 
        r5 - r4 + r9 - r8 + r14 + r15 - r16, 
        r16 - r15, 
        r4 - r5 + r8 - r9, 
        r13 - r12, 
        r12 - r13 + 2(-r14), 
        r14, 
        r1 + r3 - r2 + r11 - r10, 
        -r1 + r3 - r2 + r4, 
        r7 - r6 + r8 - r9 + r11 - r10, 
        2(r6 - r7) + r9 - r8, 
        r7 - r6 + r10 - r11, 
        2(r2 - r3) + r5 - r4, 
        -r1 - r17, 
        r1 + r17]

tout = np.linspace(0, 10)

k_vals = [0.42, 0.17, 0, 0.17, 0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17]
c0 = [1, 0.5, 0, 2, 1, 0,0,0,0,0,0,0,0,0]
cout = odeint(rhs, c0, tout, k_vals)  # EXERCISE: rhs, c0, tout, k_vals

Что означает это сообщение об ошибке и как его исправить ?

1 Ответ

0 голосов
/ 18 июня 2020

Измените ваши k_val на кортеж, используя круглые скобки, поскольку аргументы передаются как кортежи, а не списки. Затем вызовите odeint следующим образом:

cout = odeint(rhs, c0, tout, args=k_vals)

Кроме того, похоже, что у вас есть только 14 значений в k_val, в то время как ваша функция rhs принимает 17 k значений. Возможно, вам потребуется добавить три значения к k_values, чтобы удовлетворить всем параметрам rhs, и два значения к c0, чтобы соответствовать размеру списка, который возвращает rhs.

...