我在Python 2中编写了以下程序来为我的数学问题集进行Newton的方法计算,虽然它完美地工作,但出于我不知道的原因,当我最初使用%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发行版只提供SymPy for Python 2.感谢任何人都能提供的帮助。
另外,如果有人想知道,我还没有为nxn Jacobians推广这个脚本,只需在我的问题集中处理2x2。 此外,我正在切割2x2零矩阵而不是使用命令(感谢eryksun纠正我的符号,用零函数修复了这个问题。)zeros(2,1)
,因为我的机器上安装的SymPy 0.7.1抱怨“zeros()只接受一个参数”,尽管{{ 3}}否则建议。也许这个命令只适用于git版本。
答案 0 :(得分:12)
ipython -i
解释器中的run -i
命令和ipython
都忽略了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
模块中执行,第二个在__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
选项试图模拟相同的python选项,那么它可能是-i
中的错误。
答案 1 :(得分:0)
SymPy还提供了一个脚本 - isympy - 它是IPython的包装器,它执行一些常用命令,包括从未来导入分区。它非常方便,在较新的IPython版本(0.11 +)中它还允许自动构造符号(这总是很好,因为我似乎总是忘记);使用-a参数运行它。
对于Python 3,在开发版本中支持它,下一个版本将拥有它;当分发打包时,我不知道。