2012-06-21 2 views
1

저는 sympy를 사용하여 오른쪽에있는 상수와 선형 평등을 표준화하려고합니다. 예를 들어 :sympy : 오른쪽에 상수가있는 선형 평등을 정규화 할 수 있습니다.

x + 1 = y 

가된다 :

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) 

이이

을 향상시킬 수 :

x - y = -1 

이 내 오히려 해키 솔루션입니다? 건배?

+0

이것은 인쇄 및 미학을위한 것일뿐 더 큰 문제를 해결하는 부분입니까? – Krastanov

+0

선형 솔버로 전달해야합니다 –

답변

2

이 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입니다.

+0

그런데이 코드를 전용 루틴에 포함시키는 것이 합리적입니다. 우리가 결정한다면이 대답을 업데이트 할 것입니다. – Krastanov

+0

정말 유용 할 것입니다! –

+0

sympy 개발자의 관심이있는 동안 http://code.google.com/p/sympy/issues/detail?id=1625와 관련된 (관련없는) 버그에주의를 기울일 수 있습니까? 이것은 나를 미치게 만든다. –

관련 문제