Корни характеристического многочлена и собственные значения не совпадают

Это матрица B

B = [1 2 0 ; 2 4 6 ; 0 6 5]

Результат eig(B):

{-2.2240, 1.5109, 10.7131}

а характеристический полином B по этой ссылке равен

syms x
polyB = charpoly(B,x)
x^3 - 10*x^2 - 11*x + 36

но ответ solve(polyB) есть

133/(9*(3^(1/2)*5492^(1/2)*(i/3) + 1009/27)^(1/3)) + ((3^(1/2)*5492^(1/2)*i)/3 + 1009/27)^(1/3) + 10/3
 (3^(1/2)*(133/(9*(3^(1/2)*5492^(1/2)*(i/3) + 1009/27)^(1/3)) - ((3^(1/2)*5492^(1/2)*i)/3 + 1009/27)^(1/3))*i)/2 - 133/(18*(3^(1/2)*5492^(1/2)*(i/3) + 1009/27)^(1/3)) - ((3^(1/2)*5492^(1/2)*i)/3 + 1009/27)^(1/3)/2 + 10/3
 10/3 - 133/(18*(3^(1/2)*5492^(1/2)*(i/3) + 1009/27)^(1/3)) - ((3^(1/2)*5492^(1/2)*i)/3 + 1009/27)^(1/3)/2 - (3^(1/2)*(133/(9*(3^(1/2)*5492^(1/2)*(i/3) + 1009/27)^(1/3)) - ((3^(1/2)*5492^(1/2)*i)/3 + 1009/27)^(1/3))*i)/2

что я не знаю, что это такое, хотя я ожидаю, что это будут собственные значения B. В чем проблема?


person M a m a D    schedule 20.04.2018    source источник


Ответы (2)


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

B = [1 2 0 ; 2 4 6 ; 0 6 5]
cp=charpoly(B)
eig2=roots(cp)

возвращает:

eig2 =

   10.7131
   -2.2240
    1.5109

Однако, если по какой-то причине вы настаиваете на использовании символа (чего не следует делать в числовой задаче), вы можете сделать

double(solve(polyB))

ans =

  10.7131 + 0.0000i
  -2.2240 - 0.0000i
   1.5109 - 0.0000i

(обратите внимание, что мнимые части равны нулю)

person Ander Biguri    schedule 20.04.2018
comment
@RodrigodeAzevedo не беспокойтесь;) - person Ander Biguri; 17.05.2018

Поскольку на этой машине у меня нет MATLAB, вместо этого я буду использовать SymPy:

>>> from sympy import *
>>> B = Matrix([[1, 2, 0],
                [2, 4, 6],
                [0, 6, 5]])

Вычисление характеристического многочлена и его корней:

>>> s = Symbol('s')
>>> p = (s*eye(3) - B).det()
>>> p
s**3 - 10*s**2 - 11*s + 36
>>> roots = solve(p,s)

Вычисление аппроксимаций трех корней с плавающей запятой:

>>> [ r.evalf() for r in roots ]
[1.51092975992931 - 0.e-22*I, -2.22404024437578 + 0.e-22*I, 10.7131104844465 - 0.e-20*I]

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

При печати в LaTeX точные значения корней:

Корни LaTeX

Обратите внимание, что некоторые корни «длиннее», чем другие, т. е. для них требуется больше символов. Однако они точные. Используя арифметику с плавающей запятой, все корни имеют одинаковый «размер», но они являются приблизительными.

person Rodrigo de Azevedo    schedule 17.05.2018