On 7/16/07, Charles R Harris <[EMAIL PROTECTED]> wrote:
On 7/16/07, Robert Kern <[EMAIL PROTECTED]> wrote:
>
> Kevin Jacobs <[EMAIL PROTECTED]> wrote:
> > Mea culpa on the msqrt example, however I still think it is wrong to
> get
> > a complex square-root back when a real valued result is expected and
> exists.
>
> No, in floating point you accumulate error. Those 1e-22j's are part of
> the
> actual result. Some systems like MATLAB implicitly silent such small
> imaginary
> components; we don't.
The problem is that the given matrix has a conditon number of about 10**17
and is almost singular. A singular value decomposition works fine, but
apparently the sqrtm call suffers from roundoff and takes the sqrt of a
negative number. Sqrtm returns real results in better conditioned cases.
In [2]: sqrtm(eye(2))
Out[2]:
array([[ 1., 0.],
[ 0., 1.]])
Perhaps we aren't using the best method here.
Here is a better conditioned example:
a
array([[ 1. , 0.5 , 0.3333, 0.25 ],
[ 0.5 , 0.3333, 0.25 , 0.2 ],
[ 0.3333, 0.25 , 0.2 , 0.1667],
[ 0.25 , 0.2 , 0.1667, 0.1429]])
b=sqrtm(a)
dot(b,b)
array([[ 1. +0.j, 0.5 +0.j, 0.3333+0.j, 0.25 +0.j],
[ 0.5 +0.j, 0.3333+0.j, 0.25 +0.j, 0.2 +0.j],
[ 0.3333+0.j, 0.25 +0.j, 0.2 +0.j, 0.1667+0.j],
[ 0.25 +0.j, 0.2 +0.j, 0.1667+0.j, 0.1429+0.j]])
dot(b,b)-a
array([[ -1.99840144e-15+0.j, -9.43689571e-16+0.j, -5.55111512e-16+0.j,
-5.55111512e-16+0.j],
[ -1.05471187e-15+0.j, -5.55111512e-17+0.j, 5.55111512e-17+0.j,
0.00000000e+00+0.j],
[ -6.66133815e-16+0.j, 1.11022302e-16+0.j, 1.66533454e-16+0.j,
1.11022302e-16+0.j],
[ -5.55111512e-16+0.j, 1.11022302e-16+0.j, 1.38777878e-16+0.j,
8.32667268e-17+0.j]])
Also verified the results against svd and eigenvalue methods for computing
msqrt. I suppose I'm just used to seeing msqrt() implemented completely
using real valued arithmetic.
-Kevin
_______________________________________________
Numpy-discussion mailing list
[email protected]
http://projects.scipy.org/mailman/listinfo/numpy-discussion