1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- function [s,u] = spm_ssm2s(P,M,TOL)
- % Converts state-space (M) representation to eigenspectrum
- % FORMAT [s,u] = spm_ssm2s(P,M)
- %
- % P - model parameters
- % M - model (with flow M.f and expansion point M.x and M.u)
- % TOL - optional upper bound for principality exponent (default -4)
- %
- % S - (sorted) eigenspectrum or Lyapunov exponents
- % V - associated eigenvectors
- %
- % csd - cross spectral density
- %__________________________________________________________________________
- % Copyright (C) 2012 Wellcome Trust Centre for Neuroimaging
-
- % Karl Friston
- % $Id: spm_ssm2s.m 6233 2014-10-12 09:43:50Z karl $
- % preliminaries
- %--------------------------------------------------------------------------
- if nargin < 3, TOL = -4; end
- % Steady state solution
- %--------------------------------------------------------------------------
- M.x = spm_dcm_neural_x(P,M);
- try
- M.u;
- catch
- M.u = zeros(M.l,1);
- end
- % Jacobian and delay operator - if not specified already
- %--------------------------------------------------------------------------
- if nargout(M.f) >= 3
- [f,dfdx,D] = feval(M.f,M.x,M.u,P,M);
-
- elseif nargout(M.f) == 2
- [f,dfdx] = feval(M.f,M.x,M.u,P,M);
- D = 1;
- else
- dfdx = spm_diff(M.f,M.x,M.u,P,M,1);
- D = 1;
- end
- dfdx = D*dfdx;
- dfdu = D*spm_diff(M.f,M.x,M.u,P,M,2);
- [u,s] = eig(full(dfdx),'nobalance');
- s = diag(s);
- % eigenvectors
- %--------------------------------------------------------------------------
- u = u*diag(pinv(u)*dfdu);
- % condition slow eigenmodes
- %--------------------------------------------------------------------------
- s = 1j*imag(s) + min(real(s),TOL);
- % principal eigenmodes (highest imaginary value)
- %--------------------------------------------------------------------------
- [d,i] = sort(imag(s),'descend');
- u = u(:,i);
- s = s(i);
- % principal eigenmodes (highest real value)
- %--------------------------------------------------------------------------
- j = find(~imag(s));
- [d,i] = sort(real(s(j)),'descend');
- u(:,j) = u(:,j(i));
- s(j) = s(j(i));
|