Грешка в Cryptic matlab при изчисляване на eigs

Опитвам се да намеря 2-те собствени вектора на 2-те най-малки собствени стойности на лапласиан. Правя това чрез

[v,c]=eigs(L,M,2,'SM');

Където L е lapalcian и M е матрицата на масата.

В резултат на това получавам грешката

Error using eigs/checkInputs/LUfactorAminusSigmaB (line 1041)
The shifted operator is singular. The shift is an eigenvalue.
 Try to use some other shift please.


Error in eigs/checkInputs (line 855)
            [L,U,pp,qq,dgAsB] = LUfactorAminusSigmaB;

Error in eigs (line 94)
[A,Amatrix,isrealprob,issymA,n,B,classAB,k,eigs_sigma,whch, ...

Означава ли това, че правя нещо нередно, или това просто matlab избира лошо първоначално предположение за своя процес на итерация?

Матриците, които използвам, трябва да имат номер на условие за спускане...


person olamundo    schedule 26.11.2012    source източник
comment
Сигурен. Къде да ги кача? Доста са големи....   -  person olamundo    schedule 27.11.2012


Отговори (2)


Сблъсках се със същия проблем, докато прилагах сегментиране на нормализирани разфасовки. Номерът на условието всъщност е безкраен, тъй като най-малката собствена стойност е 0 и това е основното, за което се отнася съобщението за грешка на MATLAB. Първо изпълнява LU декомпозиция.

Току-що добавих кратно на I, 10*eps*speye, към нормализирания Laplacian, за да подобря кондиционирането и това го поправи.

person Radu    schedule 19.12.2012
comment
Защо избрахте точно 10*eps*speye, а не някаква друга стойност? - person Andreas K.; 11.02.2016

Имах същия проблем с функцията eigs. Така че минах по дългия (и може би глупав) път, но той свърши работата за мен, тъй като проблемът ми не е толкова голям: (Ще се опитам да запазя вашата нотация)

% Решете проблема със собствените стойности, като използвате пълните матрици

[v,c]=eig(full(L),full(M));

% Сортирайте собствените стойности с помощта на функцията за сортиране (знакът "-" е, защото искате най-малките реални собствени стойности по големина)

[E,P] = sort(real(c),'descend'); % Here I am assuming you know all the eigenvalues have` negative real parts

% Сега P е вектор, който съдържа (по ред) индексите на пермутацията на реда, управлявана от сортирането на функцията %. % За да се получат двата собствени вектора, съответстващи на 2-те най-малки собствени стойности:

for k = 1:2
  index = P(k);
  lambda(k) = c(index,index); % use this to check if c(index,index)=E(k,k)
  eigvec(:,k) = v(:,index); % corresponding eigenvector
end

Надявам се това да помогне

G

person Gunter    schedule 04.11.2014