【问题标题】:Isolate all variables to LHS in sympy?在 sympy 中将所有变量隔离到 LHS?
【发布时间】:2015-07-06 04:58:37
【问题描述】:

我正在使用 sympy 来处理一些方程。我想以规范形式编写方程,以便感兴趣的变量都在 LHS 上。例如。如果有的话,

lhs = sympify("e*x +f")`
rhs = sympify("g*y + t*x +h")`
eq = Eq(lhs,rhs)
e*x + f == g*y + h + t*x

我需要一个可以隔离给定变量列表的函数(我所谓的规范形式),例如

IsolateVariablesToLHS(eq,[x,y]) # desired function
(e-t)*x - g*y == h-f # now x and y are on LHS and remaining are on RHS

我保证我只会得到线性方程,所以这总是可能的。

【问题讨论】:

    标签: python sympy


    【解决方案1】:
    >>> import sympy as sm
    >>> lhs = sm.sympify('e*x + f')
    >>> rhs = sm.sympify('g*y + t*x + h')
    >>> eq = sm.Eq(lhs, rhs)
    

    这是一个简单的构造

    def isolateVariablesToLHS(eq, syms):
        l = sm.S.Zero
        eq = eq.args[0] - eq.args[1]
        for e in syms:
            ind = eq.as_independent(e)[1]
            l += ind
            eq -= ind
        return sm.Eq(l, eq)
    
    >>> isolateVariablesToLHS(eq, [x, y])
    Eq(e*x - g*y - t*x, f - h)
    

    【讨论】:

      【解决方案2】:

      使用问题中提供的等式组合所有术语并构造一个过滤器以发现所需的变量。

      >>> from itertools import filterfalse
      >>> terms = eq.lhs - eq.rhs
      >>> vars = ['x', 'y']
      >>> filt = lambda t: any(t.has(v) for v in vars)
      >>> result = Eq(sum(filter(filt, terms.args)), - sum(filterfalse(filt, terms.args))
      >>> result
      e*x - g*y - t*x == -f + h
      

      我不熟悉 sympy,但我认为这适用于由适当原子组成的方程,例如符号。确保将 vars 列表替换为实际实例化的符号 x、y 而不是“ascii”表示。这可能需要组合具有共同变量的术语。

      filter 和 filterfalse 在 python 2.x 中可能有不同的名称,但这个功能可能仍在 itertools 包中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        相关资源
        最近更新 更多