我在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 Jacobians,并且在我的问题集中只需要处理2x2矩阵。此外,我正在使用切片操作2x2的零矩阵,而不是使用命令(感谢eryksun纠正我的符号表示,这解决了与零函数的问题。)zeros(2,1)
,因为安装在我的机器上的SymPy 0.7.1会抱怨“zeros()需要一个参数”,尽管wiki中显示的是相反的情况。也许这个命令只适用于git版本。
zeros((2,1))
;参数可以是标量或元组。你是否在导入后立即使用print 1/2
测试了除法? - Eryk Sunprint division
,会发生什么?它是否会打印出类似这样的内容:_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
?如果是这样,那么从ipython命令行中执行相同的打印语句会得到什么结果?请注意,“ipython from future import division”有数万个谷歌搜索结果。看来您不是第一个注意到这个问题的人。 :-) - Kirk Strauserfrom __future__ import division
,然后print 1/2
,结果是0.5,与预期相符。但是如果我在打开 ipython 并运行%run -i NewtonsMethodMultivariate.py
后,再运行print 1/2
,则得到了0。明显地,在我的程序中导入了 Python 3 的除法,所以我不知道出了什么问题。 - Sara Fauziaprint division
时,我得到了你所说的结果。从命令行中也是如此。 - Sara Fauziah
函数或考虑转移到 py3,而不是输入x**(3/4.)
或x**0.75
? - John Machina
中有分数(硬编码的h
无法解决),在第一次迭代中,矩阵a
中的分数条目给出了更好的解决方案。 - Sara Fauzia