我从数据库中获得的符合特定条件的值创建字典。因此,我既不知道字典中元素的数量也不知道它们的值。
例如,我得到这样的东西: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就会知道
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₀₂
如果您想玩这个here is a SymPy Live version。