2016-06-30 3 views
1

SymPy 및 SymPy의 diffgeom 패키지를 사용하여 매니 폴드에서 방정식을 정의하려고합니다. 이 방정식은 사용자가 입력하기 때문에 프로그램에 문자열로 전송되므로 코드의 매니 폴드 정의보다 먼저 정의됩니다. 의미있는 계산을 수행하기 위해 "sympified"심볼을 매니 폴드에 정의 된 심볼로 대체하려고합니다.SymPy : 다기능에서 문자열을 구문 분석

다음은 사용자가 제공 한 기능입니다.

H = sympify('m*a - f') 

매니 폴드의 좌표는 사용자가 문자열로도 제공합니다.

# Variables defined as symbols (non-diffgeom) 
a = Symbol('a') 
f = Symbol('f') 

이후 모든 항목이 자동화됩니다.

from sympy.diffgeom import Manifold, Patch, CoordSystem 
from sympy import sympify, Symbol 
# Standard manifold definitions 
M = Manifold(name='Temp', dim=2) 
P = Patch('P', M) 
R = CoordSystem('R', P, ['a','f']) 
coords = R.coord_functions() 
Dx = R.base_vectors() 

print(H.diff(a)) # Returns 'm' as expected 
print(Differential(H)(Dx[0])) # Returns '0' as expected 

첫 번째 대체 기능이 뛰어납니다. Differential()을 사용하여 예상대로 파생물을 가져갈 수 있습니다.

H = H.subs(a,coords[0]) 

print(H.diff(a)) # Returns '0' as expected 
print(Differential(H)(Dx[0])) # Returns 'm' as expected 
print(Differential(H)(Dx[1])) # Returns '0' as expected 

두 번째 대체 항목은 이상하게 보입니다. 새 좌표는 표준 기호가 아닌 다기관에 정의되어 있기 때문에() .diff() 명령은 정상적으로 작동하고 0을 반환하지만 Differential()을 사용하여 더 이상 파생물을 가져갈 수 없습니다.

H = H.subs(f,coords[1]) 

print(H.diff(f)) # Returns '0' as expected 
print(Differential(H)(Dx[0])) # Crashes code 
print(Differential(H)(Dx[1])) # Also crashes code 

diffgeom는 파생 상품을 계산하는 변환을 수행하려고하지만이 같은 좌표 시스템의 모든 때문에 정말 일어나고 어떤 변형이 안 것처럼 나타납니다. 근본적으로 여기서 뭔가를 놓치고 있습니까? 또는 매니 폴드에서 표현식으로 문자열을 파싱하는 더 쉬운 방법이 있습니까?

전체 오류가 발생했습니다. SymPy가 좌표를 변환하려고 시도하는 것 외에는별로 기대하지 않을 정도로 많이 만들 수 없습니다.

Traceback (most recent call last): 
    File "/Users/msparapa/Documents/Python/gprops/examples/test.py", line 37, in <module> 
    print(Differential(H)(Dx[0])) # Crashes code 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/diffgeom/diffgeom.py", line 765, in __call__ 
    return vector_fields[0].rcall(self._form_field) 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/core/basic.py", line 538, in rcall 
    return Basic._recursive_call(self, args) 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/core/basic.py", line 552, in _recursive_call 
    return expr_to_call(*on_args) 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/diffgeom/diffgeom.py", line 592, in __call__ 
    jac = self._coord_sys.jacobian(b._coord_sys, coords) 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/diffgeom/diffgeom.py", line 277, in jacobian 
    to_sys, self._dummies).jacobian(self._dummies) 
    File "/Users/msparapa/anaconda/lib/python3.5/site-packages/sympy/diffgeom/diffgeom.py", line 270, in coord_tuple_transform_to 
    transf = self.transforms[to_sys] 
KeyError: CoordSystem(R, Patch(P, Manifold(Temp, 2)), (a, f)) 
+0

그것은 나를 위해 SymPy 1.0에서 작동합니다. SymPy를 1.0으로 업데이트 했습니까? 이전 버전의 SymPy는 diffgeom 표현의 대수 특성을 인식 할 때 여러 가지 문제점을 가지고 있었으며, 여러 가지 버그가 생길 수있었습니다. –

+0

예 SymPy 1.0을 사용하고 있습니다. SymPy 라이브를 사용하여 Python 2.7 및 3.5에서 동일한 문제를 겪었습니다. –

+0

당신은 당신이 얻을 수있는 충돌에 대한 자세한 내용을 게시 할 수 있습니까? –

답변

1

추가 조사 후 원인에 동일한 이름의 기호가 사용되었습니다. 수정은 본질적으로 here에 설명 된 방법을 사용하거나 다른 이름 지정 규칙을 모두 사용하는 것입니다.

대체를 수행하려면 모든 변수를 한 번에 스왑해야했습니다. 이 작업은 다음 코드 블록으로 수행되었습니다.

set = dict(zip([a,f],coords)) 
H = H.subs(set, simultaneous=True) 

"a"와 "f"는 기본 기호이고 "coords"는 다양체의 기호 목록입니다. 대체가 동시에 수행되지 않고 오히려 순차적으로 수행됩니다 (예 :

).
set = dict(zip([a,f],coords)) 
H = H.subs(set) 

같은 오류가 발생합니다. 이것은 "a"와 "f"가 매니 폴드 좌표 내에 묻혀 있기 때문입니다. 이 부분이 정확히 어디서 오르는 지 알아보기 위해, 좌표 [0]의 Repr 출력을 볼 수 있습니다.

BaseScalarField(CoordSystem(Symbol('R'), Patch(Symbol('P'), Manifold(Symbol('M'), Integer(2))), Tuple(Symbol('f'), Symbol('a'))), Integer(0)) 

좌표계 아래에 기호 ('f')와 기호 ('a')가 모두 표시됩니다. 여기서 일어나는 일은 내가 표현한 두 번째 변수 인 f를 Symphy가 내 매니 폴드 변수 인 a를보고 동일한 이름의 변수를 보는 것입니다.따라서 기본 기호 f를 대체 할뿐만 아니라 내 CoordSystem 정의에 묻혀있는 기호 f를 시도하여 아마도 좌표계 변환을 촉구했습니다.