Собственные векторы подписывают в последовательных степенных итерациях

Я должен определить собственные значения и собственные векторы симметричной матрицы. Я использую метод мощных итераций с hotelling дефляции.

Рассмотрим контрольный пример:

A =

    66    78    90
78    93   108
90   108   126

Для этого доминантный собственный вектор равен [0,4797 0,5724 0,6651]. И мой код дает тот же вывод. Однако после применения дефляции Хотеллинга второй доминирующий собственный вектор, который я получаю, равен [0,7766 0,0756 -0,6253]. Тем не менее, MATLAB говорит, что это должно быть [-0,7766 -0,0756 0,6253]. Третий собственный вектор неверен, так как второй имел неправильный знак. Мой вопрос: как мы определяем направление собственного вектора (т.е. его знак) после применения степенной итерации?

void eig(vector <vector<double> > A, vector <vector <double> > &eigen_vectors, vector <double> &eigen_values){
int n = data.size();
for(int loop=0;loop<n;loop++){
double c[n]; //Will store A*x
vector <double> x(n); //Will store the current eigen vector
for(int i=0;i<n;i++){
x[i] = 1;
}
double y,k=0;
do{
y=k;
k = 0;
for(int i=0;i<n;i++){
c[i]=0;
for (int j=0;j<n;j++){
c[i]+=A[i][j]*x[j];
}
k += c[i]*c[i];
}
k = sqrt(k);
for(int i=0;i<n;i++)
x[i]=c[i]/k;
}while (fabs(k-y)>0.000001);

/* The eigen value has been determined.
Now we have to determine the sign of eigen value.
To do this I am calculating A*v and comparing the sign with lambda*v */
for(int i=0;i<n;i++){
c[i]=0;
for(int j=0;j<n;j++){
c[i]+=A[i][j]*x[j];
}
}
//Determine the sign of k
if((x[0]<0 && c[0]>0) || (x[0]>0 && c[0]<0)){
k = -k;
}eigen_values.push_back(k);
eigen_vectors.push_back(x);
double v[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
v[i][j] = x[i]*x[j];
}
}
// Apply hotelling deflation
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
A[i][j] = A[i][j] - k*v[i][j];
}
}
}
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector