Eigenvalues and eigenvectors of a 3x3 matrix (principal stresses)[programming]

Click For Summary

Discussion Overview

The discussion revolves around computing the eigenvalues and eigenvectors of a symmetric 3x3 matrix, specifically a stress tensor, using programming techniques in C++. Participants explore various methods for finding real roots of the characteristic polynomial and approaches for calculating eigenvectors.

Discussion Character

  • Technical explanation
  • Mathematical reasoning
  • Debate/contested

Main Points Raised

  • One participant seeks a simplified formula for finding the three real roots of a cubic equation, noting the challenge of simplification.
  • Another participant suggests solving the system of equations Tv = λv to find eigenvectors corresponding to eigenvalues.
  • Concerns are raised about programming methods for computing a solution space rather than a single solution, with references to methods like Gauss-Seidel and Conjugate Gradients.
  • Mathematica is mentioned as a tool that can compute eigenvalues directly, but one participant emphasizes the need to implement the solution in C++.
  • Jacobi (Givens) rotation is proposed as a potentially easier coding method for 3x3 matrices, with links to relevant resources.
  • One participant expresses skepticism about the efficiency of numerical methods for 3x3 matrices, while another later acknowledges the practicality of numerical methods for their specific application.
  • Discussion includes the idea that the eigenspace of an eigenvalue can be determined through the null space of (A-λI) and the linear independence of the rows of this matrix.
  • Participants discuss the trade-offs between numerical and analytical solutions for cubic polynomials, with one noting that numerical methods can achieve desired accuracy without requiring high precision.

Areas of Agreement / Disagreement

There is no consensus on the best method for computing eigenvalues and eigenvectors, with participants presenting multiple competing views on the effectiveness of numerical versus analytical approaches.

Contextual Notes

Participants express uncertainty regarding the simplification of cubic equations and the applicability of various methods for specific cases, particularly for symmetric 3x3 matrices.

xiss burg
Messages
5
Reaction score
0
I need to compute the 3 eigenvalues and 3 eigenvectors of a symmetric 3x3 matrix, namely a stress tensor, computationaly (in C++). More specific details http://en.wikipedia.org/wiki/Principal_stress#Principal_stresses_and_stress_invariants". Basically 2 questions:

1. I am running into trouble in finding the 3 real roots. http://en.wikipedia.org/wiki/Cubic_equation#General formula of roots" we have the general formula for the roots. According to Wikipedia, again, "The characteristic equation has three real roots λ, i.e. not imaginary due to the symmetry of the stress tensor.", then I'm sure these huge formulas can be simplified, and it is indeed a hard work to try simplifying it. Have you ever seen a simplified formula for cubic equations where the discriminant is always greater than zero (then, three real roots).

2. After finding the eigenvalues how to find the eigenvectors? I read about general purpose methods like the Power Method but these are for nxn matrices. For a 3x3 matrix there must be a much simpler technique.


Thanks in advance.
 
Last edited by a moderator:
Physics news on Phys.org
You can find the eigenvector belonging to eigenvalue \lambda by solving the system of equations Tv=\lambda v. You will get three equations which you can solve for v_1,v_2 and v_3.
 
Cyosis said:
You can find the eigenvector belonging to eigenvalue \lambda by solving the system of equations Tv=\lambda v. You will get three equations which you can solve for v_1,v_2 and v_3.

I know how to do this with pencil and paper, or in my mind perhaps ^^. But how to do it in programming? I don't know methods to compute a solution space (not only a single solution as most usual methods do like Gauss Seidel, Conugate Gradients, etc)..
 
Mathematica would just give you the answer, Eigenvalues[matrix], done. To calculate yourself, sure get your cubic polynomial and figure out a way to solve it, numerically perhaps?
 
Last edited by a moderator:
jrosen13 said:
Mathematica would just give you the answer, Eigenvalues[matrix], done. To calculate yourself, sure get your cubic polynomial and figure out a way to solve it, numerically perhaps?

Actually, I have to implement it myself in C++ code. Since there's a formula for the exact solution of a cubic equation I think its better to use it then. Numerical methods have problems finding all roots, don't they?

Lord Crc said:
There's probably an even easier way for 3x3 matrices, but Jacobi (Givens) rotation is fairly easy to code and should be quick. See http://scholar.lib.vt.edu/theses/available/etd-62597-173629/unrestricted/chapter5a.PDF and http://en.wikipedia.org/wiki/Jacobi_eigenvalue_algorithm.

edit: Actually this page is more describing than the other Wikipedia link imho: http://en.wikipedia.org/wiki/Jacobi_rotation

Uh I think using these methods is a waste for 3x3 matrices. After looking more thoroughly into this problem I got a few conclusions which I am still unsure about. The eigen space of λ (vector space generated by all eigenvectors of λ) is the null space of the matrix (A-λI), or equivalently the solution space of the system (A-λI)x=0. We know that the row space of a matrix is orthogonal to its null space, then we can compute the eigenvector(s) of an eigenvalue by verifying the linear independence of the rows of (A-λI). I could compute the cross product of two pairs of row vectors, like r0Xr1 and r1Xr2 , then
-if these two cross products are zero, the rows of (A-λI) are linearly dependent, then the eigenspace is a plane orthogonal to any of the rows of (A-λI)
-if one of the cross products is different zero, then the cross product is the eigenvector itself
-it should not be possible for both to be different zero because then the eigenspace would be zero dimensional

What you think eh?

Thanks
 
Last edited by a moderator:
xiss burg said:
Uh I think using these methods is a waste for 3x3 matrices.

Perhaps. All I know is that it would get you the eigenvalues and the eigenvectors in one go, and the code I got is shorter than the stable cubic equation solver I use (formatted C).
 
Now I see that its better to use a numerical method, specially because I don't need a very accurate approximation for my specific application. Then I will give a try to that Jacobi method. Do you guys think this is one of the best choices for symmetrical 3x3 matrices?

Thanks.
 
That was my feeling before, that numerically you can solve a cubic polynomial to whatever accuracy you desire, up to some fundamental limit of time cost perhaps, but that you should be able to get really close without too much trouble. However, it is possible to analytically solve it! e.g. http://en.wikipedia.org/wiki/Cubic_function

That should be really fast! And exact too!
 

Similar threads

  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 16 ·
Replies
16
Views
2K
  • · Replies 4 ·
Replies
4
Views
6K
  • · Replies 6 ·
Replies
6
Views
18K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 4 ·
Replies
4
Views
13K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
14K