Как да разбера собствените стойности на матрица в 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 Въведете ver в командния прозорец на Matlab. Това ще покаже списък с инсталираните кутии с инструменти. Ако кутията с инструменти за символична математика не е в списъка, но смятате, че трябва да бъде, тогава уведомете локалния системен администратор. Що се отнася до действителното използване на кутията с инструменти, страхувам се, че не мога да помогна. Както отбелязаха няколко други коментара, Matlab не е чудесен инструмент за символична математика. Аз лично използвам Mathematica, но ако започвах живота си отначало, бих използвал sage или maple   -  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