Re: Inverse of symbolic matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg88351] Re: Inverse of symbolic matrix
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Fri, 2 May 2008 06:03:07 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <fvegrd$5d4$1@smc.vnet.net>
Hugh Goyder wrote:
> The expressions a and b below seem reasonable. However when I assemble
> them into a matrix and take the inverse I get the message
> Inverse::"sing" :Matrix...is singular. However the determinant seems
> fine. If I rationalize the matrix and then take its inverse then
> everything seems fine and I can almost get the unit matrix by
> multiplying back onto the original matrix. Is there a problem with
> approximate numbers in symbolic matrices?
The issue is whenever you mix machine-size numbers with symbolic or
exact arithmetic entries, the machine-size numbers poison the
symbolic/exact matrix, which is not symbolic anymore. So 1.0 is not the
same as 1 w.r.t. the accuracy of each entry and the numeric stability
that result of different algorithms in use with each computational model.
> Is this a bug?
No.
> Is Rationalize the best method for working around this problem?
Rationalize as early as possible (see below). Note the given matrix is
not invertible for s == -0.0122 - 1.544 I or s == -0.0122 + 1.544 I
> Thanks
> Hugh Goyder
>
> a = -((4.739*^-6 - 0.0008*I)/((0.0122 + 1.544*I) +
> s)) - (4.7395*^-6 + 0.00088*I)/
> ((0.0122 - 1.544*I) + s);
>
> b = -((0.000015 - 0.00022*I)/((0.0122 + 1.544*I) +
> s)) - (0.000015 + 0.000226*I)/
> ((0.0122 - 1.544*I) + s);
>
> mat = {{a, 0}, {0, b}};
>
> Inverse[mat]
>
> Det[mat]
>
> matr = Rationalize[mat, 0];
>
> inv = Inverse[matr]
>
> Rationalize[Factor[Together[mat . inv]], 1.*^-8]
Here is an example of how to deal with your matrix so exact arithmetic
is use all along the computations.
In[1]:= a = Simplify[
Map[Rationalize[#,
0] &, -((4.739*^-6 - 0.0008*I)/((0.0122 + 1.544*I) + s)) -
(4.7395*^-6 +
0.00088*I)/((0.0122 - 1.544*I) + s), Infinity]]
b = Simplify[
Map[Rationalize[#,
0] &, -((0.000015 - 0.00022*I)/((0.0122 + 1.544*I) + s)) -
(0.000015 +
0.000226*I)/((0.0122 - 1.544*I) + s), Infinity]]
mat = {{a, 0}, {0, b}}
inv = Inverse[mat]
Factor[Together[mat.inv]]
Reduce[Denominator[Simplify[Det[mat]]] == 0]
% // N
Out[1]=
(-25938043623 + 9767720 I) + (94785000 + 800000000 I) s
-(-------------------------------------------------------)
2
400000 (59602121 + 610000 s + 25000000 s )
Out[2]=
(-1720645 + 183 I) + (75000 + 15000 I) s
-(----------------------------------------)
2
100 (59602121 + 610000 s + 25000000 s )
Out[3]=
(-25938043623 + 9767720 I) + (94785000 + 800000000 I) s
{{-(-------------------------------------------------------), 0},
2
400000 (59602121 + 610000 s + 25000000 s )
(-1720645 + 183 I) + (75000 + 15000 I) s
{0, -(----------------------------------------)}}
2
100 (59602121 + 610000 s + 25000000 s )
Out[4]=
2
400000 (59602121 + 610000 s + 25000000 s )
{{-(-------------------------------------------------------), 0},
(-25938043623 + 9767720 I) + (94785000 + 800000000 I) s
2
100 (59602121 + 610000 s + 25000000 s )
{0, -(----------------------------------------)}}
(-1720645 + 183 I) + (75000 + 15000 I) s
Out[5]= {{1, 0}, {0, 1}}
Out[6]=
61 193 I 61 193 I
s == -(----) - ----- || s == -(----) + -----
5000 125 5000 125
Out[7]= s == -0.0122 - 1.544 I || s == -0.0122 + 1.544 I
Best regards,
-- Jean-Marc