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)