Есть ли в python аналоги функций digits () и vpa () в matlab? - PullRequest
2 голосов
/ 11 ноября 2019

Предположим, мне нужна очень высокая точность вычислений, или программа, с которой я имею дело, очень чувствительна к ошибкам чисел. В Matlab я могу сделать так:

d = 30;
digits(d);
t = vpa(1);
H = vpa(zeros(2, 2));
H(2, 1) = t;
H(1, 2) = t;
eigenvalues = vpa(eig(H));

Конечно, вышеприведенная программа очень проста, но идея одинакова для больших матриц и регистров.

Как переписатьэто в Python, я не могу найти никаких аналогов в пакетах Python.

1 Ответ

2 голосов
/ 12 ноября 2019

SymPy выполняет вычисления символически, и вы можете запросить оценку с произвольной точностью.

>>> A
Matrix([
[ 1,  1,  1,  1, 0],
[-1,  1,  1,  1, 1],
[ 0, -1,  1,  1, 1],
[ 0,  0, -1,  1, 1],
[ 0,  0,  0, -1, 1]])
>>> evals = solve(A.charpoly().as_expr())
>>> evals[0].n(30)
1.44482461851856062804340583653

В этом случае полином 5-го порядка находится в форме, которая не распознается подпрограммой eigenvals, поэтому A. eigenvals () сгенерирует ошибку. Но если ваша матрица не представляет таких трудностей, возможно, можно сгенерировать собственные значения более непосредственно:

>>> A = Matrix([[75, 74], [73,  4]])
>>> _.eigenvals()
{79/2 - 9*sqrt(329)/2: 1, 79/2 + 9*sqrt(329)/2: 1}
>>> list(_.keys())[0]
79/2 - 9*sqrt(329)/2
>>> _.n(30)
-42.1226071624767447920482826638
...