Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function Eigen
- A = [2, -1, -8; -1, -3, 4; -8, 4, -3]
- len = length(A);
- [L, V] = jacobi(A, len);
- eigenvalues = diag(L);
- I = eye(len);
- printf('\nsobstvennye znachenia lambda:\n')
- for i = 1:len
- printf(' lambda%i = %i\n', i, eigenvalues(i));
- end
- printf('\nsobstvennye vektory v:\n')
- for i = 1:len
- printf(' v%i = (%i, %i, %i)\n', i, V(1,i), V(2,i), V(3,i));
- end
- printf('\nA*V = lambda*V \n');
- for i = 1:3
- printf('\n %i-e:\n', i);
- printf('\nA*v%i =\n', i);
- disp(A*V(:,i));
- printf('\nlambda%i*v%i =\n', i, i);
- disp(eigenvalues(i)*V(:,i));
- printf('\n');
- end
- end
- function [L, V] = jacobi(A, len)
- t = 1;
- e = 0.0001;
- T = E = eye(len);
- q = 0;
- while t > e
- nondiagonal = A - diag(diag(A));
- [a, I] = max(abs(nondiagonal));
- [a, i] = max(a);
- I = [I(i), i]; %нашли индексы максимального (по модулю) недиагонального элемента матрицы A
- U = U_(A, I, len); % вычисляем матрицу U
- A = U'*A*U;
- E *= U;
- q += 1;
- t = t_(nondiagonal);
- end
- q %количество итераций
- L = A;
- V = E;
- end
- function U = U_(A, I, len)
- U = eye(len); % сначала U - единичная матрица размера A
- i = I(1); j = I(2); % распаковываем индексы
- fi = fi_(A, i, j); % считаем угол φ
- U(j, i) = sin(fi);
- U(i, j) = -U(j, i);
- U(i, i) = U(j, j) = cos(fi);
- end
- function fi = fi_(A, i, j)
- fi = 0;
- fi = 0.5*atan(2*A(i, j)/(A(i, i) - A(j, j)));
- end
- function t = t_(ND)
- t = 0;
- t = sqrt((sum(sum(ND.^2))));
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement