Детерминанты огромных матриц в MATLAB - PullRequest
5 голосов
/ 03 декабря 2010

из задачи моделирования, я хочу вычислить сложные квадратные матрицы порядка 1000x1000 в MATLAB. Поскольку значения относятся к функциям функций Бесселя, матрицы совсем не редки.

Поскольку меня интересует изменение определителя по некоторому параметру (энергия искомой собственной функции в моем случае), я в настоящий момент решаю проблему, сначала ища коэффициент масштабирования для исследуемого диапазона, а затем вычисляю детерминанты,

result(k) = det(pre_factor*Matrix{k});

Теперь это очень неловкое решение, и оно работает только для размеров матрицы, скажем, максимум 500x500.

Кто-нибудь знает хорошее решение проблемы? Взаимодействие с Mathematica может работать в принципе, но у меня есть сомнения относительно целесообразности. Заранее спасибо

Роберт

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

ln det M = trace ln M

то есть, когда я получаю его по отношению к k

A = trace(inv(M(k))*dM/dk)

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

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Вы должны понимать, что когда вы умножаете матрицу на константу k, тогда вы масштабируете определитель матрицы на k ^ n, где n - размерность матрицы. Таким образом, для n = 1000 и k = 2 вы определяете детерминант на

>> 2^1000
ans =
     1.07150860718627e+301

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

>> realmax
ans =
     1.79769313486232e+308

Нет необходимости выполнять всю работу по повторному вычислению этого детерминанта, не то чтобы вычисление детерминанта огромной матрицы, подобной этой, в любом случае является чрезвычайно корректной задачей.

4 голосов
/ 03 декабря 2010

Если скорость не имеет значения, вы можете использовать det(e^A) = e^(tr A) и принять за A некоторую постоянную масштабирования, умноженную на матрицу (чтобы у A - I спектральный радиус был меньше единицы).

РЕДАКТИРОВАТЬ: В MatLab лог матрицы (logm) рассчитывается с помощью тригонализации.Поэтому вам лучше вычислить собственные значения вашей матрицы и умножить их (или, лучше, добавить их логарифм).Вы не указали, была ли ваша матрица симметричной или нет: если это так, найти собственные значения проще, чем если бы это было не так.

1 голос
/ 03 декабря 2010

Это не совсем решение Matlab, но вы можете рассмотреть возможность использования Mahout . Он специально разработан для крупномасштабной линейной алгебры. (1000x1000 не проблема для весов, к которым он привык.)

Вы бы позвонили в java , чтобы передать данные в / из Mahout.

1 голос
/ 03 декабря 2010

Вы сказали, что текущее значение определителя составляет около 10 ^ -300.

Вы пытаетесь получить определитель с определенным значением, скажем, 1?Если это так, то изменение масштаба неудобно: матрица, которую вы рассматриваете, является плохо подготовленной , и, учитывая точность станка, вы должны считать выходной определитель равным нулю.Другими словами, невозможно получить надежный обратный результат.

Я бы предложил изменить столбцы или строки матрицы, а не масштабировать ее.


Я использовал R, чтобы сделатьнебольшой тест со случайной матрицей (случайные нормальные значения), кажется, определитель должен быть явно ненулевым.

> n=100
> M=matrix(rnorm(n**2),n,n)
> det(M)
[1] -1.977380e+77
> kappa(M)
[1] 2318.188
...