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