在 sympy 中将所有变量隔离到 LHS?

Isolate all variables to LHS in sympy?

我正在使用 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

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

使用问题中提供的等式组合所有项并构建过滤器以发现所需变量。

>>> 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,但我认为这适用于由适当的原子组成的方程式,例如 Symbols。确保将 vars 列表替换为实际实例化的符号 x、y 而不是 'ascii' 表示。这可能需要组合具有共同变量的术语。

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

>>> 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)