(maxima.info)Functions and Variables for diag
51.1 Functions and Variables for diag
=====================================
-- Function: diag (<lm>)
Constructs a matrix that is the block sum of the elements of <lm>.
The elements of <lm> are assumed to be matrices; if an element is
scalar, it treated as a 1 by 1 matrix.
The resulting matrix will be square if each of the elements of <lm>
is square.
Example:
(%i1) load("diag")$
(%i2) a1:matrix([1,2,3],[0,4,5],[0,0,6])$
(%i3) a2:matrix([1,1],[1,0])$
(%i4) diag([a1,x,a2]);
[ 1 2 3 0 0 0 ]
[ ]
[ 0 4 5 0 0 0 ]
[ ]
[ 0 0 6 0 0 0 ]
(%o4) [ ]
[ 0 0 0 x 0 0 ]
[ ]
[ 0 0 0 0 1 1 ]
[ ]
[ 0 0 0 0 1 0 ]
(%i5) diag ([matrix([1,2]), 3]);
[ 1 2 0 ]
(%o5) [ ]
[ 0 0 3 ]
To use this function write first 'load("diag")'.
-- Function: JF (<lambda>,<n>)
Returns the Jordan cell of order <n> with eigenvalue <lambda>.
Example:
(%i1) load("diag")$
(%i2) JF(2,5);
[ 2 1 0 0 0 ]
[ ]
[ 0 2 1 0 0 ]
[ ]
(%o2) [ 0 0 2 1 0 ]
[ ]
[ 0 0 0 2 1 ]
[ ]
[ 0 0 0 0 2 ]
(%i3) JF(3,2);
[ 3 1 ]
(%o3) [ ]
[ 0 3 ]
To use this function write first 'load("diag")'.
-- Function: jordan (<mat>)
Returns the Jordan form of matrix <mat>, encoded as a list in a
particular format. To get the corresponding matrix, call the
function 'dispJordan' using the output of 'jordan' as the argument.
The elements of the returned list are themselves lists. The first
element of each is an eigenvalue of <mat>. The remaining elements
are positive integers which are the lengths of the Jordan blocks
for this eigenvalue. These integers are listed in decreasing
order. Eigenvalues are not repeated.
The functions 'dispJordan', 'minimalPoly' and 'ModeMatrix' expect
the output of a call to 'jordan' as an argument. If you construct
this argument by hand, rather than by calling 'jordan', you must
ensure that each eigenvalue only appears once and that the block
sizes are listed in decreasing order, otherwise the functions might
give incorrect answers.
Example:
(%i1) load("diag")$
(%i2) A: matrix([2,0,0,0,0,0,0,0],
[1,2,0,0,0,0,0,0],
[-4,1,2,0,0,0,0,0],
[2,0,0,2,0,0,0,0],
[-7,2,0,0,2,0,0,0],
[9,0,-2,0,1,2,0,0],
[-34,7,1,-2,-1,1,2,0],
[145,-17,-16,3,9,-2,0,3])$
(%i3) jordan (A);
(%o3) [[2, 3, 3, 1], [3, 1]]
(%i4) dispJordan (%);
[ 2 1 0 0 0 0 0 0 ]
[ ]
[ 0 2 1 0 0 0 0 0 ]
[ ]
[ 0 0 2 0 0 0 0 0 ]
[ ]
[ 0 0 0 2 1 0 0 0 ]
(%o4) [ ]
[ 0 0 0 0 2 1 0 0 ]
[ ]
[ 0 0 0 0 0 2 0 0 ]
[ ]
[ 0 0 0 0 0 0 2 0 ]
[ ]
[ 0 0 0 0 0 0 0 3 ]
To use this function write first 'load("diag")'. See also
'dispJordan' and 'minimalPoly'.
-- Function: dispJordan (<l>)
Returns a matrix in Jordan canonical form (JCF) corresponding to
the list of eigenvalues and multiplicities given by <l>. This list
should be in the format given by the 'jordan' function. See
'jordan' for details of this format.
Example:
(%i1) load("diag")$
(%i2) b1:matrix([0,0,1,1,1],
[0,0,0,1,1],
[0,0,0,0,1],
[0,0,0,0,0],
[0,0,0,0,0])$
(%i3) jordan(b1);
(%o3) [[0, 3, 2]]
(%i4) dispJordan(%);
[ 0 1 0 0 0 ]
[ ]
[ 0 0 1 0 0 ]
[ ]
(%o4) [ 0 0 0 0 0 ]
[ ]
[ 0 0 0 0 1 ]
[ ]
[ 0 0 0 0 0 ]
To use this function write first 'load("diag")'. See also 'jordan'
and 'minimalPoly'.
-- Function: minimalPoly (<l>)
Returns the minimal polynomial of the matrix whose Jordan form is
described by the list <l>. This list should be in the format given
by the 'jordan' function. See 'jordan' for details of this format.
Example:
(%i1) load("diag")$
(%i2) a:matrix([2,1,2,0],
[-2,2,1,2],
[-2,-1,-1,1],
[3,1,2,-1])$
(%i3) jordan(a);
(%o3) [[- 1, 1], [1, 3]]
(%i4) minimalPoly(%);
3
(%o4) (x - 1) (x + 1)
To use this function write first 'load("diag")'. See also 'jordan'
and 'dispJordan'.
-- Function: ModeMatrix (<A>, [<jordan_info>])
Returns an invertible matrix <M> such that (M^^-1).A.M is the
Jordan form of <A>.
To calculate this, Maxima must find the Jordan form of <A>, which
might be quite computationally expensive. If that has already been
calculated by a previous call to 'jordan', pass it as a second
argument, <jordan_info>. See 'jordan' for details of the required
format.
Example:
(%i1) load("diag")$
(%i2) A: matrix([2,1,2,0], [-2,2,1,2], [-2,-1,-1,1], [3,1,2,-1])$
(%i3) M: ModeMatrix (A);
[ 1 - 1 1 1 ]
[ ]
[ 1 ]
[ - - - 1 0 0 ]
[ 9 ]
[ ]
(%o3) [ 13 ]
[ - -- 1 - 1 0 ]
[ 9 ]
[ ]
[ 17 ]
[ -- - 1 1 1 ]
[ 9 ]
(%i4) is ((M^^-1) . A . M = dispJordan (jordan (A)));
(%o4) true
Note that, in this example, the Jordan form of 'A' is computed
twice. To avoid this, we could have stored the output of
'jordan(A)' in a variable and passed that to both 'ModeMatrix' and
'dispJordan'.
To use this function write first 'load("diag")'. See also 'jordan'
and 'dispJordan'.
-- Function: mat_function (<f>,<A>)
Returns f(A), where <f> is an analytic function and <A> a matrix.
This computation is based on the Taylor expansion of <f>. It is
not efficient for numerical evaluation, but can give symbolic
answers for small matrices.
Example 1:
The exponential of a matrix. We only give the first row of the
answer, since the output is rather large.
(%i1) load("diag")$
(%i2) A: matrix ([0,1,0], [0,0,1], [-1,-3,-3])$
(%i3) ratsimp (mat_function (exp, t*A)[1]);
2 - t 2 - t
(t + 2 t + 2) %e 2 - t t %e
(%o3) [--------------------, (t + t) %e , --------]
2 2
Example 2:
Comparison with the Taylor series for the exponential and also
comparing 'exp(%i*A)' with sine and cosine.
(%i1) load("diag")$
(%i2) A: matrix ([0,1,1,1],
[0,0,0,1],
[0,0,0,1],
[0,0,0,0])$
(%i3) ratsimp (mat_function (exp, t*A));
[ 2 ]
[ 1 t t t + t ]
[ ]
(%o3) [ 0 1 0 t ]
[ ]
[ 0 0 1 t ]
[ ]
[ 0 0 0 1 ]
(%i4) minimalPoly (jordan (A));
3
(%o4) x
(%i5) ratsimp (ident(4) + t*A + 1/2*(t^2)*A^^2);
[ 2 ]
[ 1 t t t + t ]
[ ]
(%o5) [ 0 1 0 t ]
[ ]
[ 0 0 1 t ]
[ ]
[ 0 0 0 1 ]
(%i6) ratsimp (mat_function (exp, %i*t*A));
[ 2 ]
[ 1 %i t %i t %i t - t ]
[ ]
(%o6) [ 0 1 0 %i t ]
[ ]
[ 0 0 1 %i t ]
[ ]
[ 0 0 0 1 ]
(%i7) ratsimp (mat_function (cos, t*A) + %i*mat_function (sin, t*A));
[ 2 ]
[ 1 %i t %i t %i t - t ]
[ ]
(%o7) [ 0 1 0 %i t ]
[ ]
[ 0 0 1 %i t ]
[ ]
[ 0 0 0 1 ]
Example 3:
Power operations.
(%i1) load("diag")$
(%i2) A: matrix([1,2,0], [0,1,0], [1,0,1])$
(%i3) integer_pow(x) := block ([k], declare (k, integer), x^k)$
(%i4) mat_function (integer_pow, A);
[ 1 2 k 0 ]
[ ]
(%o4) [ 0 1 0 ]
[ ]
[ k (k - 1) k 1 ]
(%i5) A^^20;
[ 1 40 0 ]
[ ]
(%o5) [ 0 1 0 ]
[ ]
[ 20 380 1 ]
To use this function write first 'load("diag")'.
automatically generated by info2www version 1.2.2.9