+1 vote
asked by (170 points)

I'm using iTensor to simulate a certain 1D process with MPS. The Schmidt values (i.e. singular values) across any cut for this particular process decay really fast. There are typically on the order of only 5 values that are smaller than 10^-5, and then they quickly decay to values smaller than 10^-25. I'm interested in studying the functional form of the spectrum of these singular values if possible.

I noticed that iTensor seems to have a hardcoded "truncation error" cutoff of 10^-13 if the truncation error parameter is not specified, for example in the .orthogonalize function. However, if the truncation error cutoff parameter is set to 0, then no singular values are automatically truncated. For my particular simulation, singular values as small as ~10^-55 can be recovered if the truncation error is set to zero.

My question is: if an MPS simulation is performed with zero truncation error as above, and the list of Schmidt/singular values across some cut is obtained, can extremely tiny values (smaller than 10^-15 or so) be considered reliable? Or should these extremely small values be considered garbage due to numerical precision issues? I'm wondering if 10^-13 is the default truncation error because anything less should not be trusted.

Thank you!

1 Answer

+1 vote
answered by (70.1k points)
selected by
Best answer

Good question, though I don't feel comfortable giving a totally absolute answer. It's one of those "it depends" things as with any very technical matter.

But as a rule of thumb, when working with double-precision floating point numbers most operations are only trustworthy to about a precision of 10^-13 or so. This is because, among other reasons, that while double can store numbers much more precise than that, precision losses occur when subtracting two similar numbers for example. It's hard to avoid these kinds of operations in most algorithms of course.

Here is a sample calculation I just did in the Julia REPL to illustrate this:

Start by generating some random numbers:

julia> r1 = rand()

julia> r2 = rand()

julia> r3 = rand()

Now do some arithmetic and then undo it

julia> x = (r1/r2)*r3-100

julia> y = (100+x)/r3*r2 # y should equal r1 if using exact arithmetic

julia> r1
0.034238108102722764 # you can see the last few digits differ from y

julia> y-r1

Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.