Как определить собственные значения матрицы в Matlab, когда все элементы матрицы являются переменными?

У меня есть матрица с кучей неизвестных констант, как показано ниже:

  a*b     -c     -d     0
   -c      e     -a    -b-d
   -d     -a      d    -e
    0     -b-d   -e     a

Как вы понимаете, он симметричен относительно диагонали, и поэтому все диагональные значения положительны. Все константы больше 0.

Я хотел бы решить это для собственных значений в Matlab. Как мне это сделать? Я не знаю значений a, b, c, d и e. Я хотел бы сделать что-то вроде этого:

d = eig(@getMatrix)

но функция eig не принимает дескрипторы функций.


person user972276    schedule 28.11.2012    source источник
comment
Я думаю, для этого вам понадобится инструментарий символической математики. Если она у вас есть, то функция eig отлично работает с символьной матрицей на входе. См. документацию здесь   -  person Colin T Bowers    schedule 28.11.2012
comment
Да, это символическая задача, а MATLAB — числовой инструмент. Что вам нужно, так это система компьютерной алгебры.   -  person user57368    schedule 28.11.2012
comment
вы должны сделать это в системе компьютерной алгебры, такой как Maxima. Matlab — не лучший инструмент для символьных операций.   -  person carandraug    schedule 28.11.2012
comment
@ColinTBowers Как мне получить этот набор инструментов? Я использую школьный компьютер с предустановленным Matlab. Глядя на их веб-сайт, я подумал, что в MATLAB он уже должен быть. Если это так, как мне его использовать?   -  person user972276    schedule 28.11.2012
comment
@user972276 user972276 Введите ver в командном окне Matlab. Это отобразит список установленных наборов инструментов. Если набора инструментов для символьных вычислений нет в списке, но вы считаете, что он должен быть, сообщите об этом локальному системному администратору. Что касается фактического использования набора инструментов, боюсь, я ничем не могу помочь. Как отмечалось в нескольких других комментариях, Matlab не является отличным инструментом для символьной математики. Я лично использую Mathematica, но если бы я начинал свою жизнь сначала, я бы использовал sage или клен   -  person Colin T Bowers    schedule 28.11.2012


Ответы (1)


В MATLAB проблем нет.

>> syms a b c d e
>> M = [a*b     -c     -d     0
   -c      e     -a    -b-d
   -d     -a      d    -e
    0     -b-d   -e     a];

>> eig(M)
ans =
 a/4 + d/4 + e/4 + (a*b)/4 - ((51*a*d^3)/16 - (117*a^4*b)/16 + (27*a^3*d)/16 + (27*a*e^3)/16 + (57*b*d^3)/2 + (27*a^3*e)/16 + (27*d*e^3)/16 + (51*d^3*e)/16 + 6*((4*(2*b*d - (a*e)/4 - (a*d)/4 - (d*e)/4 - (a^2*b)/4 + (11*a^2)/8 + b^2 + c^2 + (19*d^2)/8 + (11*e^2)/8 + (3*a^2*b^2)/8 - (a*b*d)/4 - (a*b*e)/4)*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + 
...

(a*b*c^2*e)/8 + (3*a*b*d*e^2)/64 + (11*a*b*d^2*e)/64 + (a*b^2*d*e)/4 - (33*a^2*b*d*e)/32 - (5*a^2*b^2*d*e)/64 + (a*b*d*e)/4 + (a*c*d*e)/2 - 2*b*c*d*e) - 256*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + (15*d^2*e^2)/1...

Output truncated.  Text exceeds maximum line length of 25,000 characters for Command Window display.

Я там многое удалил. По общему признанию, это довольно грязно и долго, но можно ли ожидать большего?

Изменить: я должен прокомментировать, что такая длинная расширенная формула может быть опасной с точки зрения точности вычислений. Я видел, как люди вслепую использовали такую ​​путаницу выражений, оценивая их на Fortran или MATLAB. Они думают, что раз оно «символично», то оно и точно. Это полное заблуждение, когда выполняются численные вычисления.

В этих терминах вполне может быть огромное вычитание, когда огромные положительные и отрицательные члены почти компенсируют друг друга, оставляя крошечный результат, который по существу бесполезен из-за ограниченного динамического диапазона вычислений с плавающей запятой. ОСТЕРЕГАТЬСЯ. По крайней мере, сравните вычисления с одинарной и двойной точностью, выполненные с одним и тем же выражением. Если они существенно различаются, попробуйте версию с расширенной точностью, чтобы убедиться, что у двойников нет проблем. Если вы не тестировали такое выражение и тщательно его не проверяли, не доверяйте ему.

person Community    schedule 28.11.2012