Mercurial > matrix-functions
diff mftoolbox/expm_frechet_quad.m @ 0:8f23314345f4 draft
Create local repository for matrix toolboxes. Step #0 done.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Wed, 06 May 2015 14:56:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mftoolbox/expm_frechet_quad.m Wed May 06 14:56:53 2015 +0200 @@ -0,0 +1,51 @@ +function R = expm_frechet_quad(A,E,theta,rule,k) +%EXPM_FRECHET_QUAD Frechet derivative of matrix exponential via quadrature. +% L = EXPM_FRECHET_QUAD(A,E,THETA,RULE) is an approximation to the +% Frechet derivative of the matrix exponential at A in the direction E +% intended to have norm of the correct order of magnitude. +% It is obtained from the repeated trapezium rule (RULE = 'T'), +% the repeated Simpson rule (RULE = 'S', default), +% or the repeated midpoint rule (RULE = 'M'). +% L = EXPM_FRECHET_QUAD(A,E,THETA,RULE,k) uses either matrix +% exponentials (k = 0, the default) or repeated squaring (k = 1) +% in the final phase of the algorithm. + +% A is scaled so that norm(A/2^s) <= THETA. Defalt: THETA = 1/2. + +if nargin < 3 || isempty(theta), theta = 1/2; end +if nargin < 4 || isempty(rule), rule = 'S'; end +if nargin < 5, k = 0; end + +s = ceil( log2(norm(A,1)/theta) ); +As = A/2^s; + +X = expm(As); + +switch upper(rule) + + case 'T' + R = 2^(-s) * (X*E + E*X)/2 ; + + case 'S' + Xmid = expm(As/2); + R = 2^(-s) * (X*E + 4*Xmid*E*Xmid + E*X)/6; + + case 'M' + Xmid = expm(As/2); + R = 2^(-s) * Xmid*E*Xmid; + + otherwise + error('Illegal value of RULE.') + +end + +for i = s:-1:1 + if i < s + if k == 0 + X = expm(2^(-i)*A); + else + X = X^2; + end + end + R = X*R + R*X; +end