runtest
Jdiff = 
         0         0         0    1.0000         0         0
         0         0         0         0    1.0000         0
         0         0         0         0         0    1.0000
    1.9007   -1.0509   -0.9406   -0.0083   -0.0099   -0.0155
   -0.4763    3.2214   -0.6506   -0.0057   -0.0068   -0.0107
   -0.5330   -0.8133    2.7854   -0.0064   -0.0076   -0.0120
J = 
         0         0         0    1.0000         0         0
         0         0         0         0    1.0000         0
         0         0         0         0         0    1.0000
    1.9007   -1.0509   -0.9406   -0.0083   -0.0099   -0.0155
   -0.4763    3.2214   -0.6506   -0.0057   -0.0068   -0.0107
   -0.5330   -0.8133    2.7854   -0.0064   -0.0076   -0.0120
[y, M, K, C, F, dMdq, dKdq, dCdq, dCdqd, dFdq] = odefun(q, qd);
    ej = accumarray(j,1,[n 1]);
    yq = odefun(q+hq*ej, qd);
    yqd = odefun(q, qd+hqd*ej);
    Jdiff(:,n+j) = (yqd-y)/hqd;
qdd = -(M \ (K*q + C*qd - F));
Dq = odot(dMdq,qdd) + odot(dKdq,q) + odot(dCdq,qd) - diag(dFdq);
      M\(K+Dq), M\(C+odot(dCdqd,qd))];
A = reshape(A, size(A,1), size(B,1), []);
AB = reshape(AB, size(A,1), []);
function [y, M, K, C, F, dMdq, dKdq, dCdq, dCdqd, dFdq]  = odefun(q, qd)
[C, dCdq, dCdqd] = Cfun(q, qd);
y = Mtilde \ (Ftilde-Ktilde*Q);
function [M, dMdq] = Mfun(q)
dsdq = repelem(reshape(dsdq,1,n),n,n);
function [K, dKdq] = Kfun(q)
dKdq = setdiag((1/2)./sqrt(q));
dsdq = a*q./sqrt(sum(q.^2));
dsdq = repelem(reshape(dsdq,1,n),n,n);
function [C, dCdq, dCdqd] = Cfun(q, qd)
C = 0*diag(sin(q).*cos(qd));
dCdq = 0*setdiag(cos(q).*cos(qd));
dCdqd = 0*setdiag(-sin(q).*sin(qd));
dsdq = repelem(reshape(dsdq,1,n),n,n);
function [F, dFdq] = Ffun(q)