我正在使用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
我确信我只会得到线性方程式,所以这总是可行的。
答案 0 :(得分:2)
>>> 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)
答案 1 :(得分:0)
使用问题中提供的等式组合所有术语并构建用于发现所需变量的过滤器。
>>> 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
我不熟悉同情,但我认为这适用于由符号等适当原子组成的方程式。确保将vars列表替换为实际实例化的符号x,y而不是' ascii'表示。这可能需要结合具有共同变量的术语。
filter和filterfalse在python 2.x中可能有不同的名称,但此功能可能仍在itertools包中。