19

我在 Python 2 中编写了以下程序来为我的数学问题集进行牛顿法计算,虽然它工作得很好,但由于我不知道的原因,当我最初用%run -i NewtonsMethodMultivariate.py. 我知道这一点,因为在我加载我的 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 Jacobians 推广这个脚本,只需要在我的问题集中处理 2x2。此外,我正在切片 2x2 零矩阵而不是使用该命令zeros(2,1),因为安装在我的机器上的 SymPy 0.7.1 抱怨“zeros() 只采用一个参数”,尽管wiki另有建议。也许这个命令只适用于 git 版本。(感谢 eryksun 更正了我的符号,它解决了 zeros 函数的问题。)

4

2 回答 2

12

ipython -i命令和解释器都在脚本run -iipython忽略。from __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,第二个在__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 选项启动,传递了要执行的脚本名称,并且脚本包含未来语句,它将在脚本执行后启动的交互式会话中生效。

ipython因此,如果它的-i选项试图模拟相同的 python 选项,这可能是一个错误。

于 2011-11-28T02:31:54.183 回答
0

SymPy 还提供了一个脚本——isympy——它是 IPython 的包装器,它执行一些常用命令,包括从未来导入除法。它非常方便,并且在较新的 IPython 版本(0.11+)中,它还允许自动构造符号(这很好,因为我似乎总是忘记);使用 -a 参数运行它。

至于 Python 3,在开发版中已经支持,下个版本会支持;我不知道什么时候发行版会打包它。

于 2011-11-28T18:58:54.607 回答