2011-11-28 2 views
17

필자는 수학 문제 집합에 대해 Newton의 방법 계산을 수행하기 위해 Python 2에서 다음 프로그램을 작성했으며, 내가 처음에 ipython에서 %run -i NewtonsMethodMultivariate.py으로로드 할 때, 파이썬 3 사업부는 반입되지 않습니다. 내 파이썬 프로그램을로드 한 후 x**(3/4)을 입력하면 "1"이되기 때문에 이것을 알 수 있습니다. 새 부서를 수동으로 가져온 후 x**(3/4)은 예상대로 그대로 x**(3/4)으로 유지됩니다. 왜 이런거야?내 프로그램에서 "from __future__ import division"을 사용하지만 내 프로그램과 함께로드되지 않았습니다.

# coding: utf-8 
from __future__ import division 
from sympy import symbols, Matrix, zeros 

x, y = symbols('x y') 
X = Matrix([[x],[y]]) 
tol = 1e-3 

def roots(h,a): 
    def F(s): 
    return h.subs({x: s[0,0], y: s[1,0]}) 
    def D(s): 
    return h.jacobian(X).subs({x: s[0,0], y: s[1,0]}) 
    if F(a) == zeros((2,1)): 
    return a 
    else: 
    while (F(a)).norm() > tol: 
     a = a - ((D(a))**(-1))*F(a) 
     print a.evalf(10) 

나는이 문제를 방지하기 위해 파이썬 3를 사용하지만 내 리눅스 배포판 전용 선박 SymPy 파이썬 2. 감사 도움말 누구든지 제공 할 수 있습니다에 대한 것입니다.

궁금한 점이 있으면 nxn Jacobians에 대해이 스크립트를 아직 일반화하지 않았으며 문제점 세트에서 2x2 만 처리해야했습니다. 또한 zeros(2,1) 대신에 내 컴퓨터에 설치된 SymPy 0.7.1에 "0이 정확히 하나의 인수를 취합니다"라는 문구가 있기 때문에 2x2 제로 행렬을 분할합니다. 그렇지 않으면 wiki에서 제안합니다. 어쩌면이 명령은 자식 버전에만 해당 될 수 있습니다. ipython 인터프리터 (0을 기능과 함께 문제를 해결 내 표기법을 수정 주셔서 감사합니다 eryksun.)

+0

제로 ((2,1))입니다. 인수는 스. 라 또는 터플입니다. 'print 1/2'로 수입 직후에 부서를 테스트 했습니까? – eryksun

+0

호기심에서, 프로그램 끝 부분에'print division'을 추가하면 어떻게 될까요? '_Feature ((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)'? 그렇다면 동일한 인쇄 문이 ipython 명령 줄에서 무엇을 제공합니까? "ipython from future import division"에는 수만 개의 Google 결과가 있습니다. 당신이 이것을 처음으로 눈치 채지 못했던 것 같습니다. :-) –

+0

@eryksun 제로 명령을 사용하는 것에 대해 저를 시정 해 주셔서 감사합니다. 내 프로그램을 업데이트했습니다. 그래서 ipython을 열고'__future__ import division'을 실행 한 다음'print 1/2 '를 실행하면 결과는 예상대로 0.5가됩니다. 하지만 대신 ipython을 열고'% run -i NewtonsMethodMultivariate.py'를 실행 한 다음'print 1/2 '를 실행하면 0이됩니다. Python 3 부분을 가져 오는 행은 분명히 프로그램에 있으므로, 무슨 일인지 알지 못해. –

답변

12

ipython -i 명령 모두와 run -iprint05.py 스크립트에서 from __future__ import division을 무시합니다.

>>> print 1/2 
0 
>>> execfile('print05.py') 
0.5 
>>> print 1/2 
0 
>>> from __future__ import division 
>>> print 1/2 
0.5 

from __future__ import division, 다른 모듈의 소스 코드에 영향을주지해야하는 것은 그렇지 않으면 끊을 :

In [1]: print 1/2 
0 
In [2]: run -i print05.py 
0.5 
In [3]: division 
Out[3]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192) 
In [4]: print 1/2 
0 
In [5]: from __future__ import division 
In [6]: print 1/2 
0.5 

execfileimport이 같은 결과를 생성 : ipython 콘솔에서

$ cat print05.py 
from __future__ import division 
print(1/2) 

그 존재를 기대하지 않는 다른 모듈의 코드.

$ python -i print05.py 
0.5 
>>> print 1/2 
0.5 
>>> division 
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192) 

이 경우 모듈 이름 print05.py 내부 프롬프트 양쪽 __main__이다 : 여기

, from __future__ import division는 효과가있다. __future__에 대한

$ ipython -i print05.py 
0.5 
In [1]: division 
Out[1]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192) 
In [2]: print 1/2 
0 

워드 프로세서 : 뭔가 잘못

$ python -im print05 
0.5 
>>> print 1/2 
0 

을 그리고 여기에 : 그것은 또한 예상대로 작동 그래서 여기

는 첫 번째 print 1/2print05 모듈에 __main__ 모듈에서 두 번째 하나를 실행 말 :

통역사가 -i 옵션으로 시작하고 실행 스크립트 이름이 전달되고 스크립트에 후속 명령문이 포함되어 있으면 이 실행 된 후 대화식 세션에서 이 시작됩니다.그 -i 옵션은 같은 파이썬 옵션을 모방하려고하면

그래서 그것은 ipython에서 버그가 수 있습니다.

+0

설명에 감사드립니다. 불행한 것은 ipython 명령 줄에 함수 "h"를 입력했기 때문이며 분수 지수가있는 용어가 있지만 미래의 나누기를 수동으로 가져 오지 않으려면 프로그램에 "h"를 하드 코딩해야합니다. –

+0

@Sara Fauzia :'h()'function * before ..'.import division'을 정의한 경우 * integer * division을 사용합니다. 당신은'ipython' 콘솔로부터 함수를 추가하기 위해'edit you_module.py'를 사용할 수 있습니다. – jfs

+0

@ J.F. Sebastian Python을 대화식으로 사용하면, 내가 테스트 한 것처럼 실제로는 제대로 작동한다는 것을 지적했습니다. 이 버그입니까? ipython은 어떻게됩니까? –

0

symPy는 isympy라는 스크립트도 제공합니다. isympy는 미래의 분할을 가져 오는 것을 포함하여 몇 가지 공통 명령을 실행하는 IPython의 래퍼입니다. 그것은 매우 편리합니다. 그리고 최신 IPython 버전 (0.11 이상)에서는 심볼을 자동으로 구성 할 수 있습니다 (항상 잊어 버리는 것처럼 좋음). -a 매개 변수와 함께 실행하십시오.

파이썬 3은 개발 버전에서 지원되며 다음 버전에서는 지원됩니다. 배포판이 그것을 포장하려고 할 때 나는 모른다.