Передача списка в качестве аргумента в систему уравнений - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь передать список в качестве входных данных для системы функций. Моя функция выглядит так:

beta[i] - (1 - a[i]*beta[i])*(gamma + sum(other betas)

gamma = 0.49
a = [1.57, 2.731, 2.32, 4.681, 1.878]

def g(beta):
    return ((beta[0] - (1 - 1.57 * beta[0])*(gamma + np.sum([beta[1], beta[2], beta[3], beta[4]]))),
            (beta[1] - (1 - 2.731 * beta[1])*(gamma + np.sum([beta[0], beta[2], beta[3], beta[4]]))),
            (beta[2] - (1 - 2.32 * beta[2])*(gamma + np.sum([beta[0], beta[1], beta[3], beta[4]]))),
            (beta[3] - (1 - 4.681 * beta[3])*(gamma + np.sum([beta[0], beta[1], beta[2], beta[4]]))),
            (beta[4] - (1 - 1.878 * beta[4])*(gamma + np.sum([beta[0], beta[1], beta[2], beta[3]]))),
           )

, который решается после звонка:

optimize.fsolve(g, [1, 1, 1, 1, 1])

ответ:

array([0.46713148, 0.30731229, 0.3502582 , 0.1932526 , 0.41133453]

Очевидно, что должен быть более элегантный способ сделать это для произвольной длины аргументов. Я пытаюсь следующее:

def other_betas(lst, index):
    return sum(lst)-lst[index]

def temp(beta):
    for i in range(len(e)):
        beta[i] = (1 - e[i]*beta[i])*(gamma + np.sum(other_betas))
    return beta

, оканчивающийся на:

TypeError: unsupported operand type(s) for +: 'float' and 'function'

Ответы [ 3 ]

0 голосов
/ 23 марта 2019

Вы можете сделать это в одной функции следующим образом:

def g(beta,a):
    n = len(a)
    summation = [beta[i] - (1 - a[i] * beta[i]) * (gamma + np.sum([beta[j] for j in range(n) if not j==i])) for i in range(n)]
    return tuple(summation)
0 голосов
/ 23 марта 2019

Собственно, оба кода работают:

gamma = 0.49
a = [1.57, 2.731, 2.32, 4.681, 1.878]

def g(beta,n):
    lookup = {'0' : 1.57, '1' :  2.731, '2' : 2.32, '3' : 4.681, '4' : 1.878}
    summation = [( (1 - lookup[str(i)] * beta[i])) * (gamma + np.sum([beta[j] for j in range(n) if not j==i])) for i in range(n)]
    return tuple(summation)

и

def tempI(beta):
    mySum = gamma + np.sum(beta)

    return [(1 - a[i]*beta[i])*(gamma + np.sum(other_betas(beta, i))) for i,_ in enumerate(a)]

после вызова функции с помощью:

optimize.fsolve(lambda beta: beta - g(beta, 5), [1, 1, 1, 1, 1])

у нас есть:

array([0.46713148, 0.30731229, 0.3502582 , 0.1932526 , 0.41133453])
0 голосов
/ 23 марта 2019

Вы не вызвали функцию other_betas() надлежащим образом, так как вы забыли скобки, а также передали аргументы функции.

def other_betas(lst, index):
    return sum(lst)-lst[index]

def temp(beta):
    for i in range(len(a)):
        beta[i] = (1 - a[i]*beta[i])*(gamma + np.sum(other_betas(a, i)))
    return beta

print(temp(beta))

Однако вы можете просто сложить список и вычестьсоответствующий элемент a в цикле for.С пониманием списка вам даже не нужен цикл for.

def tempI(beta):
    mySum = gamma + np.sum(a)

    return [(1 - a[i]*beta[i])*(mySum - a[i]) for i,_ in enumerate(a)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...