19

私はPython2で次のプログラムを作成して、数学の問題セットに対してニュートン法の計算を行いました。これは完全に機能しますが、私にはわからない理由で、最初にipythonにロードしたときに、Python3%run -i NewtonsMethodMultivariate.pyの分割がインポートされません。x**(3/4)Pythonプログラムをロードした後、 「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)

この問題を回避するためにPython3を使用しますが、私のLinuxディストリビューションにはPython2用のSymPyしか出荷されていません。誰もが提供できる支援に感謝します。

また、誰かが疑問に思っている場合に備えて、私はまだnxn Jacobians用にこのスクリプトを一般化しておらず、問題セットで2x2を処理するだけで済みました。さらに、私のマシンにインストールされているSymPy 0.7.1は、「zeros()は正確に1つの引数を取る」と文句を言うので、コマンドを使用する代わりに2x2のゼロ行列をスライスしています。たぶん、このコマンドはgitバージョン専用です。zeros(2,1)(ゼロ関数の問題を修正した表記を修正してくれたeryksunに感謝します。)

4

2 に答える 2

12

ipython -iコマンドとインタプリタの両方がスクリプトrun -iで無視します。ipythonfrom __future__ import divisionprint05.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

execfileimport同じ結果が得られます。

>>> 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ステートメントが含まれている場合、スクリプトの実行後に開始される対話型セッションで有効になります。

ipythonそのため、その-iオプションが同じpythonオプションをエミュレートしようとすると、バグになる可能性があります。

于 2011-11-28T02:31:54.183 に答える
0

SymPyはスクリプト--isympy--も提供します。これはIPythonのラッパーであり、futureからの除算のインポートを含むいくつかの一般的なコマンドを実行します。これは非常に便利で、新しいIPythonバージョン(0.11以降)では、シンボルの自動構築も可能です(これは私がいつも忘れているように見えるので便利です)。-aパラメーターを指定して実行します。

Python 3に関しては、開発バージョンでサポートされており、次のリリースでサポートされる予定です。ディストリビューションがいつパックするのかはわかりません。

于 2011-11-28T18:58:54.607 に答える