On Thursday, 8 September 2011 23:55:00 UTC+8, William wrote:
>
> On Thu, Sep 8, 2011 at 8:28 AM, Rado <rki...@gmail.com> wrote:
> > sage: L = [[2,4,16],[1/2,1,2],[1,1,1]]
> > sage: A = matrix(RDF, L)
> > sage: xvalues = [sqrt(2), 2, 4]
> > sage: L2 = [[i^2 for i in xvalues], [log(i, 2) for i in xvalues], [1 for 
> i
> > in xvalues]]
> > sage: A2 = matrix(RDF, L2)
> > sage: print (A - A2).norm()
> > 1.11022302463e-16
> > sage: b = vector(RDF, [5, 20, 106])
> > sage: print A.solve_right(b)
> > (153.25, -37.875, -9.375)
> > sage: print A.inverse() * b
> > (153.25, -37.875, -9.375)
> > sage: print A2.solve_right(b)
> > (128.0, -32.0, -9.375)
> > sage: print A2.inverse() * b
> > (153.25, -37.875, -9.375)
> > The third output is quite off and I don't think it can be attributed to
> > numerical error. Any idea what is happening?
> > Rado
>
> Numerical error.
>
> For double precision matrices, at least in sage-4.7.2, solve_right
> (and solve_left) still just calls the completely generic algorithm
> (from school), which is designed for exact rings... in particular, it
> creates the augmented matrix C:
>
> sage: C = A2.augment(b); C
> [  2.0   4.0  16.0   5.0]
> [  0.5   1.0   2.0  20.0]
> [  1.0   1.0   1.0 106.0]
>
> Then, it calls echelon on that, which just runs a very simple
> "10-line" standard Gauss elimination, which is designed assuming that
> the base ring is exact.  This is "def
> _echelon_in_place_classical(self):" in matrix/matrix2.pyx.
>
even over exact rings, this is by far not the right thing to do, as it can 
lead to explosions in the size.
one should do Bareiss, if possible.
http://en.wikipedia.org/wiki/Bareiss_algorithm
http://www.singular.uni-kl.de/Manual/latest/sing_186.htm

Just in case.
Dima
 

> sage: C.echelon_form()
> [   1.0    0.0    0.0  128.0]
> [   0.0    1.0    0.0  -32.0]
> [   0.0    0.0    1.0 -9.375]
>
> And there's your mystery "answer" in the last column.
>
> Remember that pretty much everything is nonzero and nonequal in RDF,
> which confuses Gauss elimination.  I put a print statement in the
> function mentioned above, and get this output during the
> echelonization.
>
> sage: C.echelon_form()
> Pivoting on self[0,0] = 2.0
> Now self =
> [               1.0                2.0                8.0               
>  2.5]
> [               0.0 -2.22044604925e-16               -2.0             
>  18.75]
> [               0.0               -1.0               -7.0             
>  103.5]
> Pivoting on self[1,1] = -2.22044604925e-16
> Now self =
> [               1.0                0.0 -1.80143985095e+16 
>  1.68884986026e+17]
> [               0.0                1.0  9.00719925474e+15 
> -8.44424930132e+16]
> [               0.0                0.0  9.00719925474e+15 
> -8.44424930132e+16]
> Pivoting on self[2,2] = 9.00719925474e+15
> Now self =
> [   1.0    0.0    0.0  128.0]
> [   0.0    1.0    0.0  -32.0]
> [   0.0    0.0    1.0 -9.375]
>
>
> Note that one source of confusion is missing digits in printing.
> E.g., if you paste the numbers back in,
> then you get the right answer:
>
> sage: C = matrix(RDF,3,4,[2.0, 4.0, 16.0, 5.0, 0.5, 1.0, 2.0, 20.0,
> 1.0, 1.0, 1.0, 106.0])
> sage: C.echelon_form()
>
>

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to