次のプログラムをPython 2で記述して、数学の問題セットに対してニュートン法の計算を行いました。これは完全に機能しますが、私にはわからない理由で、最初に%run -i NewtonsMethodMultivariate.py
を使用してipythonにロードしました。 Python 3除算はインポートされません。これは、Pythonプログラムをロードした後、x**(3/4)
と入力すると、「1」になるためです。新しい部門を手動でインポートすると、予想どおりx**(3/4)
はx**(3/4)
のままになります。これはなぜですか?
# 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)
この問題を回避するためにPython 3を使用しますが、私のLinuxディストリビューションはPython 2。のSymPyのみを出荷します。誰でも提供できるヘルプに感謝します。
また、誰かが疑問に思っている場合に備えて、私はまだnxnヤコビアン用にこのスクリプトを一般化しておらず、問題セットで2x2を処理するだけで済みました。 さらに、コマンド (ゼロ関数の問題を修正した表記を修正してくれたeryksunに感謝します。)zeros(2,1)
を使用する代わりに、2x2のゼロ行列をスライスしています。これは、私のマシンにインストールされているSymPy 0.7.1が、 wiki は別の方法を提案します。たぶん、このコマンドはgitバージョン専用です。
ipython -i
コマンドとipython
インタープリターのrun -i
はどちらも、from __future__ import division
スクリプトのprint05.py
を無視します。
$ cat print05.py
from __future__ import division
print(1/2)
ipython
コンソールの場合:
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
execfile
とimport
は同じ結果を生成します:
>>> 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
は、異なるモジュールのソースコードに影響を与えないようにする必要があります。そうしないと、その存在を予期しない他のモジュールのコードが破損します。
ここで、from __future__ import division
は効果があります:
$ python -i print05.py
0.5
>>> print 1/2
0.5
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
この場合のモジュール名は、__main__
内とプロンプト内の両方でprint05.py
です。
ここで、最初のprint 1/2
はprint05
モジュールで実行され、2番目は__main__
モジュールで実行されるため、期待どおりに機能します。
$ python -im print05
0.5
>>> print 1/2
0
そして、ここに何か問題があります:
$ 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
__future__
のドキュメントは次のように述べています。
インタプリタが-iオプションで開始され、実行するスクリプト名が渡され、スクリプトにfutureステートメントが含まれている場合、スクリプトの実行後に開始される対話型セッションで有効になります。
したがって、-i
オプションが同じpythonオプション)をエミュレートしようとすると、ipython
のバグになる可能性があります。
SymPyは、futureからの除算のインポートなど、いくつかの一般的なコマンドを実行するIPythonのラッパーであるスクリプト--isympy--も提供します。これは非常に便利であり、新しいIPythonバージョン(0.11以降)では、シンボルの自動構築も可能です(これは私がいつも忘れているように思えます)。 -aパラメーターを指定して実行します。
Python 3については、開発バージョンでサポートされており、次のリリースでサポートされる予定です。ディストリビューションでパックされる時期はわかりません。