5

My problem is that I have a matrix A and the computer says is not Hermitian (self-adjoint). Then I check which elements make A be not Hermitian by calculating:

B=A-ConjugateTranspose[A]

In case A is Hermitian, this difference should be zero. What I get is that A is not Hermitian, but the terms I get in matrix B all are smaller than 10^(-15).

So how can I fix it at the beggining of the code, Mathematica to consider two numbers equal, up to 10^(-10) precision for example, that is it to consider:

0.00000000010 = 0.00000000012

or saying it in an alternative way, I want Mathematica to consider the following matrix Hermitian:

C={{0,I*1.1^(-10)},{-I*1.2^(-10),0}}

throughout the whole code.

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
Mencia
  • 1,324
  • 12
  • 26
  • 1
    You can force it to consider c Hermetian by instead using cHerm=1/2(c + ConjugateTranspose[c]) – bill s Oct 30 '13 at 18:00

2 Answers2

23

There are two undocumented functions which control the tolerance of Equal and SameQ: Internal`$EqualTolerance and Internal`$SameQTolerance. I refer you to this answer of mine for further information.

Alexey Popkov
  • 61,809
  • 7
  • 149
  • 368
  • Accidentally hit touch-screen and downvoted. Will reverse when timeout happens. Sorry. – ciao Apr 06 '15 at 08:58
  • 1
    @rasher Moderators cannot change votes. You can make a dummy edit, reverse your vote and then undo the edit within the minute. (there will be a note in the history that you edited the post, but the contents will remain the same) – rm -rf Apr 06 '15 at 12:59
5

You can check to see if the difference is less than the desired amount, and if so, to force it to be symmetric:

c = {{0, I 1.1*10^(-10)}, {-I 1.2*10^(-10), 0}}; 
cOut = If[Abs[Total[c - ConjugateTranspose[c], 2]] < 10^(-10), 
           1/2 (c + ConjugateTranspose[c]),c]

This returns cOut which is a symmetrized version of c if c is close to Hermetian and returns c otherwise (i..e, if it really isn't Hermetian).

bill s
  • 68,936
  • 4
  • 101
  • 191