linalg.matrix_power (A, n) для огромных $ n $ и огромных $ A $ - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь использовать linalg, чтобы найти $ P ^ {500} $, где $ P $ - матрица 9x9, но Python отображает следующее: Матрица, полная inf

Iдумаю, что это слишком много для этого метода, поэтому мой вопрос, есть ли другая библиотека, чтобы найти $ P ^ {500} $?Должен ли я сдаться?Спасибо всем заранее

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Массивы NumPy имеют однородные типы данных, а максимальный тип данных с плавающей запятой равен

>>> np.finfo('d').max
1.7976931348623157e+308

>>> _**0.002
4.135322944991858

>>> np.array(4.135)**500
1.7288485271474026e+308

>>> np.array(4.136)**500
__main__:1: RuntimeWarning: overflow encountered in power
inf

Так что если есть внутренний продукт, результат которого выше, чем прибл.4.135 он собирается взорваться, и как только он взорвется, следующий продукт умножится на бесконечность, и больше записей получат бесконечность, пока все не станет бесконечностью.

Предложение Метахоминида, безусловно, поможет, но не решит проблему, если вашСобственные значения больше, чем это значение.В общем, для получения правильных результатов вам необходимо использовать специализированные высокоточные инструменты.

0 голосов
/ 26 мая 2018

Используйте собственное разложение, а затем возведите в степень матрицу собственных значений.Как это.Вы заканчиваете тем, что получили инфу в первом столбце.Если вы не контролируете тип матрицы по их собственным значениям, этого не произойдет, я верю.Другими словами, ваши собственные значения должны быть ограничены.Вы можете сгенерировать случайную матрицу с помощью разложения Шура , поместив собственные значения вдоль диагонали.У меня есть пост о генерации матрицы с заданными собственными значениями. Это должен быть способ, которым метод работает в любом случае.

    % Generate random 9x9 matrix
    n=9;
    A = randn(n);
   [V,D] = eig(A);
   p = 500;
   Dp = D^p;
   Ap = V^(-1)*Dp*V;

   Ap1 = mpower(A,p);
...