2010-12-03 5 views
5

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

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

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

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

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

Роберт

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

ln det M = trace ln M 

, который, когда я его вывода относительно к

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

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

+1

Есть ли что-то особенное в структуре вашей матрицы, которая может помочь? Вы упомянули k = {A1, B1; A2, B2}, где A1, A2 симметричны. Что-нибудь еще? А1 и А2 коммутируют, или любая из подматричек легко инвертируется? – 2010-12-03 18:24:20

+0

@ Джонатан Дурси: Благодарю вас за ваши продуманные вопросы. Но я боюсь, что в целом я не вижу причины, по которой A1 и A2 должны переключаться, а также почему любая из подматричек должна быть обратимой. Кроме того, поскольку интересные случаи близки к det (M) = 0, инверсия не очень хорошо работает. – 2010-12-03 20:33:04

+0

Матрица, являющаяся единственной, не обязательно говорит ничего интересного о подматрицах; если B1 и B2 равны нулю, M не будет обратим, хотя A1 и A2 могут быть очень хорошо себя вести. – 2010-12-03 22:29:00

ответ

4

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

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

5

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

>> 2^1000 
ans = 
    1.07150860718627e+301 

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

>> realmax 
ans = 
    1.79769313486232e+308 

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

+0

По определению определитель является единственным чередующимся * полилинейным * отображением из Mn (K) в K, для которого F (Id) = 1. – Wok 2010-12-03 10:53:08

1

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

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

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


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

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

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

Вы должны были бы получить call into java для передачи данных в/из Mahout.

 Смежные вопросы

  • Нет связанных вопросов^_^