Calculate eigenvectors without the function eig

105 views (last 30 days)
Hi! I am trying to write a function which can calculate the eigenvalues and eigenvectors of a generic square matrix, and I want to compute it by myself, without relying on the function eig. Unfortunately my function calculates only the right eigenvalues, while it sets the eigenvectors always = 0. Can someone give me a hint on how to solve this problem? I also would appreciate if anyone can tell me how to avoid the creation of symbolic solution at the end because it boring to have to shift them in numbers every time.
Thanks in advance.
Alberto
function [eigVal,eigVec]=spec_calculation(A)
s = size(A);
if s(1)~=s(2)
error('Error: Input must be square.')
end
I = eye(length(A));
%
syms x
eq1 = det(A-I*x) == 0 ;
eigVal = double(solve(eq1,x));
%
eigVec = zeros(s);
for i = 1:length(A)
syms y
eq2 = (A-eigVal(i)*I)*y == 0;
eigVec(:,i) = double(solve(eq2,y));
end
end
  4 Comments
Sunil Patil
Sunil Patil on 2 Nov 2018
Hi, Can anyone suggest how we can solve for eigen vectors for identity matrix ? Let A = given matrix (A-lamda I)x = 0 rref(A-lamda1*I) => Identity matrix is coming out of it.
and when we solve identity matrix for eigen vectors, it is coming as all values= 1 (thats not correct). can anyone guide me ?
Thanks Sunil

Sign in to comment.

Answers (3)

Bruno Luong
Bruno Luong on 25 Oct 2018
You need to find y, such that
|y| = 1 (for example)
A*y = lambda*y
In otherword
y = null(A - lambda*eye(size(A))

Guillermo Serrano Nájera
SOLVE THIS BY HAND! (A-eigVal(i)*I)*y == 0;
trivial solution is y = 0
try A*y == eigVal*y
to avoid trivial solutions, fixing y1 to 1 or something similar
  1 Comment
Bruno Luong
Bruno Luong on 25 Oct 2018
Edited: Bruno Luong on 25 Oct 2018
Can't see why y=0 is not trivial solution of the later form. It's the same equation.

Sign in to comment.


Nadir Bait Saleem
Nadir Bait Saleem on 12 Dec 2021
Edited: Nadir Bait Saleem on 13 Jun 2022
Hello Alberto!
I like you was struggling with a situation like this for hours and even tried to find a chat board which had an answer but I couldn't find any answer that was sufficient. I finally saw the light and figured it out on my own and I felt I had to share it here.
Anyways, this problem is cut into two parts:
  • Finding eigenvalues
  • Finding eigenvectors from the eigenvalues
I'll do this through the lens of the problem I was working on. A Physics problem where we had to solve for the ω "eigenvalues" and the a "eigenvectors".
To find eigenvalues for that arbitrary matrix, we would have to use the equation and the solutions of this will give us values of ω. You can do this in MATLAB by using the solve() function like so:
%NOTE: insert appropriate "syms" call with variables you're using in K and
%M
% w = omega^2
sub = K - w.*M
%To find omega we need to find the solutions to det(sub) = 0
w = solve(det(sub)==0, w)
This will give us an (nx1) matrix w with every row giving us an "eigenvalue" of . Once we have these values we can use them one by one to find the corresponding eigenvector by using solve() of a system of equations along with the handy trick of specifying (Return Condtions, true). An example of this is shown here:
%NOTE: insert appropriate "syms" call with variables you're using in K and
%M
syms a1_2 a2_2 a3_2
a2 = [a1_2 ; a2_2 ; a3_2];
w_2 = w(2,1) ; %single eigenvalue from eigenvalue matrix
sub2 = K - w_2.*M ; %using eigenvalue
solve2 = sub2*a2
%Getting components
eqn1_2 = solve2(1,1) == 0 ;
eqn2_2 = solve2(2,1) == 0 ;
eqn3_2 = solve2(3,1) == 0 ;
sol2 = solve([eqn1_2,eqn2_2,eqn3_2],[a1_2,a2_2,a3_2],"ReturnConditions",true);
%Below are components of sol2 that you can pull out of its structure
a1_2 = sol2.a1_2
a2_2 = sol2.a2_2
a3_2 = sol2.a3_2
By specifying (Return Condtions, true) and cutting up your combined matrix into the appropriate number of linear equations you will find that MATLAB returns eigenvectors in this form where we can set z to be 1.
Hope this helps!

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!