我从数据库中获得的符合特定条件的值创建字典。因此,我既不知道字典中元素的数量也不知道它们的值。

例如,我得到这样的东西:

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元素求解这些等式。

有没有办法做到这一点?

最佳答案

您不必担心为变量重新创建Symbol对象。 SymPy将为您创建单例对象,每次调用Symbol('P01')时,都会返回相同的单个对象:

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


因此,只需将结构直接转换为SymPy对象,SymPy就会知道P02P02 = ...等式表达式和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₀₂


如果您想玩这个here is a SymPy Live version

10-07 15:16