Python sympy:规范化右边有常数的线性等式

Python sympy:规范化右边有常数的线性等式,python,math,sympy,Python,Math,Sympy,我正试图找到一种合适的方法(使用sympy)来规范化右边有常数的线性等式。例如: x + 1 = y 变成: x - y = -1 这是我相当老套的解决方案: def canonical_linear(f): """ canonicalise a linear equality """ lhs = f.lhs - f.rhs const_l = [ x for x in lhs.as_ordered_terms() if x.is_number ] if len(

我正试图找到一种合适的方法(使用sympy)来规范化右边有常数的线性等式。例如:

x + 1 = y
变成:

x - y = -1
这是我相当老套的解决方案:

def canonical_linear(f):
""" canonicalise a linear equality """

    lhs = f.lhs - f.rhs
    const_l = [ x for x in lhs.as_ordered_terms() if x.is_number ]

    if len(const_l) == 0:
        const = 0
    elif len(const_l) == 1:
        const = const_l[0]
    else:
        raise NotImplementedError("SHIT")

    return sympy.Eq(lhs - const, -const)

这能改进吗?干杯?

这是来自Symphy中
求解
例程的源代码:

1262         if all(p.is_linear for p in polys):
1263             n, m = len(polys), len(symbols)
1264             matrix = zeros(n, m + 1)
1265 
1266             for i, poly in enumerate(polys):
1267                 for monom, coeff in poly.terms():
1268                     try:
1269                         j = list(monom).index(1)
1270                         matrix[i, j] = coeff
1271                     except ValueError:
1272                         matrix[i, m] = -coeff
1273 
1274             # returns a dictionary ({symbols: values}) or None
1275             result = solve_linear_system(matrix, *symbols, **flags)
它将每个方程转换为多项式(
Poly
是Symphy中有效处理多项式的一个类),如果多项式是线性的,它将遍历它以构造要求解的矩阵(最后一列是自由系数)


上面的代码没有显示到多项式的转换。多项式在
polys
中,自由符号在
symbols

中,这仅仅是为了印刷和美学,还是解决更大问题的一部分?这是通过在专用例程中考虑这段代码的方式传递给线性解算器。如果我们决定这样做,我会更新这个答案。另外,当我有一个Symphy开发人员的注意时,我能提醒您注意这个(不相关的)错误吗:。这让我抓狂。一个可能的解决办法是:我们可以继续在那里讨论。