Python - динамически создавать уравнения из словаря - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю словарь из значений, полученных из базы данных, которые соответствуют определенным критериям.Поэтому я заранее не знаю ни числа, ни значений элементов в словаре.

Например, я получаю что-то вроде этого:

ditc1 = {"P01":{"F1":0.4,"P02":0.6}, "P02":{"F2":0.3, "P03":0.7}, "P03":{"F3":0.2, "P02":0.8}}

То, что я хотел бы сделать, это динамически создавать математические уравнения из этих элементов, например:…

P01 = 0,4 * F1 + 0,6 * P02

P02 = 0,3 * F2 + 0,7 * P03

P03 = 0,2 * F3 + 0,8 * P02

Мне нужно, чтобы ссылки по уравнениям оставались неизменными (например, P02 в первом уравнении - это P02 из второго уравнения), поэтому я могу решитьэти уравнения относительно элементов P0X.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 29 ноября 2018

Вам не нужно беспокоиться о воссоздании Symbol объектов для ваших переменных.SymPy создаст для вас singleton объектов, каждый раз, когда вы вызываете Symbol('P01'), возвращается один и тот же объект:

>>> from sympy import Symbol
>>> p = Symbol('P01')
>>> p
P01
>>> p is Symbol('P01')
True

Так что просто конвертируйте вашу структуру в объекты SymPy напрямую, и SymPy узнаетчто P02 является одним и тем же символом как в выражении равенства P02 = ..., так и в умножении 0.6*P02.

Поскольку вы, вероятно, можете иметь произвольное количество элементов во вложенном словаре, вы можете использовать sympy.Add()построить дополнение из любого количества компонентов.Я предполагаю, что вы также хотите записать символ = в уравнении, поэтому используйте для этого sympy.Eq():

from sympy import Symbol, Add, Eq

expressions = []
for p, equation_components in ditc1.items():
    p = Symbol(p)
    expression = []
    for name, multiplier in equation_components.items():
        expression.append(Symbol(name) * multiplier)
    expressions.append(Eq(p, Add(*expression)))

Это даст

>>> from sympy import pprint
>>> for expr in expressions:
...     pprint(expr)
...
P₀₁ = 0.4⋅F₁ + 0.6⋅P₀₂
P₀₂ = 0.3⋅F₂ + 0.7⋅P₀₃
P₀₃ = 0.2⋅F₃ + 0.8⋅P₀₂

Если вы хотите поиграть с этим , вот версия SymPy Live .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...