我在 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 零矩阵而不是使用该命令(感谢 eryksun 更正了我的符号,它解决了 zeros 函数的问题。)zeros(2,1)
,因为安装在我的机器上的 SymPy 0.7.1 抱怨“zeros() 只采用一个参数”,尽管wiki另有建议。也许这个命令只适用于 git 版本。