Диагонализация симметричной матрицы в Maxima

Вот моя проблема: у меня есть реальная симметричная матрица M, зависящая от двух параметров a,b (которые считаются положительными), и я хочу найти ортогональную матрицу < em>P такой, что PMP^{-1} — диагональная матрица. Вот пример того, что я сделал:

assume(a>0,b>0);
M : matrix([a,a+b,a+b],[a+b,a,a+b],[a+b,a+b,a]);
load("eigen");
[myeigval,myeigvec]:similaritytransform(ev(M,hermitianmatrix));

или просто,

assume(a>0,b>0);
M : matrix([a,a+b,a+b],[a+b,a,a+b],[a+b,a+b,a]);
load("eigen");
[myeigval,myeigvec]:similaritytransform(M);

Я получаю тот же результат для этих двух тестов:

[[[2*b+3*a,-b],[1,2]],[[[1/sqrt(3),1/sqrt(3),1/sqrt(3)]],[[1/sqrt(2),0,-1/sqrt(2)],[0,1/sqrt(2),-1/sqrt(2)]]]]

Норма векторов равна 1, но эти векторы не дают мне ортогональной матрицы. Может кто-нибудь объяснить мне, в чем проблема?


person user37238    schedule 02.10.2013    source источник


Ответы (1)


Посмотрите на глобальные переменные rightmatrix и leftmatrix после вызова similaritytransform. Когда я пробую ваш пример, я обнаруживаю, что rightmatrix . leftmatrix — это единичная матрица (как и leftmatrix . rightmatrix).

Я согласен, что документация для similaritytransform не совсем ясна. Ну что ж.

person Robert Dodier    schedule 02.10.2013
comment
Спасибо за ваш ответ. Я согласен, что мы получаем rightmatrix.leftmatrix = Identity, но правая матрица не является транспонированной левой матрицей, и это то, что я хочу. Вы знаете, как это получить? - person user37238; 03.10.2013
comment
@user37238 user37238 Хорошо, теперь я понимаю вопрос. Оказывается, когда некоторое собственное значение имеет кратность > 1, соответствующие собственные векторы, возвращаемые similaritytransform, не обязательно ортогональны. (Возможно, это ошибка в similaritytransform.) Вы можете применить функцию gramschmidt для построения ортогональных векторов, хотя, если вы хотите получить ортонормированный вектор, вам придется нормализовать их после gramschmidt. - person Robert Dodier; 03.10.2013
comment
@ user37238 Я думаю, что конкретно вы хотите сделать gramschmidt(transpose(rightmatrix)). - person Robert Dodier; 03.10.2013
comment
@user37238 user37238 Посмотрев на это немного, я думаю, что similaritytransform должен гарантировать, что rightmatrix является ортогональным, если включен флаг hermitianmatrix (поскольку тогда рекламируется, что транспонирование rightmatrix является его инверсией); если флаг отключен, rightmatrix не обязательно должен быть ортогональным, если он обратим. - person Robert Dodier; 04.10.2013
comment
Я пробовал с подобным преобразованием (ev (M, эрмитовой матрицей)) и не получаю транспонирование (правая матрица) = левая матрица. - person user37238; 04.10.2013
comment
@user37238 user37238 Я думаю, вам нужно написать ev(similaritytransform(M), hermitianmatrix=true), то есть вызвать similaritytransform с hermitianmatrix, временно привязанным к true. (Некоторые флаги, которые распознаются ev, связаны с true просто по имени флага; они называются evflag. Но hermitianmatrix не является evflag.) - person Robert Dodier; 04.10.2013