Sympy는 여러 용어를 수집하여 합리적인 표현을 단순화 할 수 있습니까?

Aug 19 2020

E아래의 것과 같은 합리적인 표현이 주어지면 Sympy를 사용하여 다음과 같은 것으로 단순화하려고합니다 F(아래 Python 코드의 두 번째 블록에 정의 됨).

import sympy as sp

a, b, c, d, n, t, A, B, C = sp.symbols('a, b, c, d, n, t, A, B, C', real = True)

E = n/(c-b) * ( B - (c-b)/(c-a)*A - (b-a)/(c-a)*B ) * (c-t)/(c-b) + n/(c-b) * ( (d-c)/(d-b)*B + (c-b)/(d-b)*C - B ) * (t-b)/(c-b)

print(sp.pretty( E ))
print(sp.pretty( E.simplify() ))

이것은 인쇄

           ⎛     B⋅(-c + d)   C⋅(-b + c)⎞             ⎛  A⋅(-b + c)   B⋅(-a + b)    ⎞
n⋅(-b + t)⋅⎜-B + ────────── + ──────────⎟   n⋅(c - t)⋅⎜- ────────── - ────────── + B⎟
           ⎝       -b + d       -b + d  ⎠             ⎝    -a + c       -a + c      ⎠
───────────────────────────────────────── + ─────────────────────────────────────────
                        2                                           2                
                (-b + c)                                    (-b + c)
                
                
-n⋅((a - c)⋅(b - t)⋅(-B⋅(b - d) + B⋅(c - d) + C⋅(b - c)) + (b - d)⋅(c - t)⋅(A⋅(b - c) + B⋅(a - b) - B⋅(a - c))) 
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
                                                           2                                                    
                                            (a - c)⋅(b - c) ⋅(b - d) 

그러나 표현식은-수동으로-더 단순화 될 수 있으며 그 결과는 F다음과 같습니다.

F = n/(c-a) * (B - A) * (c-t)/(c-b) + n/(d-b) * (C - B) * (t-b)/(c-b)

print(sp.pretty( F ))
print((F-E).simplify())

이 출력

n⋅(-A + B)⋅(c - t)   n⋅(-B + C)⋅(-b + t)
────────────────── + ───────────────────
(-a + c)⋅(-b + c)     (-b + c)⋅(-b + d) 


0

factor(), collect()및 을 포함한 다양한 옵션을 살펴 봤지만 apart()이들 중 어떤 것도 F. 진행 방법에 대한 조언이 있습니까?

또한 Sympy의 예쁜 인쇄 기능을 어떻게 든 조정할 수 있는지 궁금합니다.

  1. 분자와 분모 모두에서 변수의 원래 순서를 유지합니다 (예 : B - A대신 -A + B). 현재 대부분의 경우 순서가 뒤집혀 있으며 앞의 마이너스 기호로 인해 다소 추악 해 보입니다.
  2. 복합 분수를 단순 분수의 곱으로 표시합니다 (예 : a/b c/d대신 ac/bd). 물론 특정 경우 이러한 복합 분수를 "분할"하는 위치 / 방법이 모호 할 수 있습니다.

답변

2 OscarBenjamin Aug 23 2020 at 21:35

여기서 상황 Add은 두 가지 용어 중 하나가 있다는 것 입니다. 각 용어를 사용하여 개별적으로 단순화 할 수 factor있지만 취소 할 요소가 각각 다르므로 factor전체를 호출 Add하여 가능한 취소를 찾지 못합니다.

이를 염두에두고 Add다음에 액세스하여 할 수 있는 독립적으로 조건을 처리 할 때주의해야합니다 .args.

In [122]: E.func(*(factor(term) for term in E.args))
Out[122]: 
n⋅(A - B)⋅(-c + t)   n⋅(B - C)⋅(-b + t)
────────────────── - ──────────────────
 (a - c)⋅(b - c)      (b - c)⋅(b - d) 

변수의 순서는 실제로 표현식을 표시 할 때 프린터에 의해 결정되며 반드시 args의 내부 순서 또는 표현식을 만들 때 사용 된 순서와 동일하지 않을 수도 있습니다. 를 호출 signsimp하면 표현식의 마이너스 기호를 정규화 할 수 있습니다.

In [123]: signsimp(_)
Out[123]: 
  n⋅(A - B)⋅(c - t)   n⋅(B - C)⋅(b - t)
- ───────────────── + ─────────────────
   (a - c)⋅(b - c)     (b - c)⋅(b - d)