我正在尝试找到一种合适的方法(使用 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)
这个可以改进吗?干杯?
最佳答案
这是来自 SymPy 中 solve
例程的源代码:
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
是 SymPy 中的一个类,用于高效处理多项式),如果多项式是线性的,它会遍历它以构造要求解的矩阵(最后一列是自由系数)。
上面的代码没有显示到多项式的转换。多项式在 polys
中,自由符号在 symbols
中。
关于python - sympy:规范化右侧为常数的线性等式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11147966/