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))
그것은 나를 위해 SymPy 1.0에서 작동합니다. SymPy를 1.0으로 업데이트 했습니까? 이전 버전의 SymPy는 diffgeom 표현의 대수 특성을 인식 할 때 여러 가지 문제점을 가지고 있었으며, 여러 가지 버그가 생길 수있었습니다. –
예 SymPy 1.0을 사용하고 있습니다. SymPy 라이브를 사용하여 Python 2.7 및 3.5에서 동일한 문제를 겪었습니다. –
당신은 당신이 얻을 수있는 충돌에 대한 자세한 내용을 게시 할 수 있습니까? –