【问题标题】:Python - dynamically create equations from a dictionaryPython - 从字典动态创建方程
【发布时间】:2022-03-16 22:09:15
【问题描述】:

我根据从数据库中获得的符合特定条件的值创建字典。因此,我事先不知道字典中元素的数量和值。

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

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 元素的这些方程式。

有没有办法做到这一点?

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    您不必担心为变量重新创建Symbol 对象。 SymPy 将为您创建 singleton 对象,每次调用 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

    【讨论】:

      【解决方案2】:

      我只是想把一个简单的符号和表达式字典转换成一个等式列表

      >>> d2e = lambda d: [*map(lambda i:Eq(*i), d.items())]
      >>> d2e({x:y+1, z:2})
      [Eq(x, y + 1), Eq(z, 2)]
      

      这可以通过将其转换为简化形式与您的字典一起使用(可以通过调用 Dict 来完成:

      >>> s = Dict(dict1)
      

      然后可以将作为值出现的字典转换为表达式:

      >>> s = {k: Add(*[s*n for s,n in v.items()]) for k,v in s.items()}; s
      {P01: 0.4*F1 + 0.6*P02, P02: 0.3*F2 + 0.7*P03, P03: 0.2*F3 + 0.8*P02}
      

      然后可以将字典转换为表达式列表;其中第一个显示:

      >>> d2e(s)[:1]
      [Eq(P01, 0.4*F1 + 0.6*P02)]
      

      (并且可以通过像solve(d2e(s), list(s), dict=True) 这样的调用来解决这些值以提供一个字典,其中值独立于P 值。)

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 2016-11-20
        • 2012-12-08
        • 1970-01-01
        相关资源
        最近更新 更多