Я написал следующую программу на Python 2 для вычислений по методу Ньютона для моего набора математических задач, и хотя она прекрасно работает, по неизвестным мне причинам, когда я первоначально загружаю ее в ipython с %run -i NewtonsMethodMultivariate.py
, разделение 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 для Python 2. Спасибо за помощь, которую кто-либо может оказать.
Также, если кому-то интересно, я еще не обобщал этот скрипт для nxn якобианов, и в моем наборе задач я имел дело только с 2x2. Кроме того, я нарезаю нулевую матрицу 2x2 вместо того, чтобы использовать команду (Спасибо eryksun за исправление моей нотации, которое устранило проблему с функцией zeros.)zeros(2,1)
, потому что SymPy 0.7.1, установленный на моей машине, жалуется, что "zeros() принимает ровно один аргумент", хотя wiki говорит об обратном. Возможно, эта команда предназначена только для git-версии.