Within movement adjustments of internal representations during reaching (Crevecoeur et al 2020)

 Download zip file 
Help downloading and running models
"An important function of the nervous system is to adapt motor commands in anticipation of predictable disturbances, which supports motor learning when we move in novel environments such as force fields (FFs). Here, we show that movement control when exposed to unpredictable disturbances exhibit similar traits: motor corrections become tuned to the FF, and they evoke after effects within an ongoing sequence of movements. We propose and discuss the framework of adaptive control to explain these results: a real-time learning algorithm, which complements feedback control in the presence of model errors. This candidate model potentially links movement control and trial-by-trial adaptation of motor commands."
1 . Crevecoeur F, Thonnard JL, Lefèvre P (2020) A Very Fast Time Scale of Human Motor Adaptation: Within Movement Adjustments of Internal Representations during Reaching. eNeuro [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s):
Gap Junctions:
Simulation Environment: MATLAB;
Model Concept(s):
Implementer(s): Crevecoeur, Frédéric ;
% A very fast timescale of human motor adaptation: within movement
% adjustments of internal representations during reaching
% Crevecoeur F., Thonnard J.-L., lefèvre P.

% This script reproduces the simualtions shown in Fig. 6. Different version
% or packages in Matlab my produce errors. Users should not hesitate to
% contact in case problems arise on their setup:
% frederic.crevecoeur@uclouvain.be
% The code was tested on Mac OS 10.12.6, Matlab R2017a

% Experiment 1

nt = 10; % Number of Simulated Trials
forces1 = zeros(nt,60);
forces25 = zeros(nt,60);
forces50 = zeros(nt,60);

forces_costUp = zeros(nt,60);
forces_costDown = zeros(nt,60);

allx1 = zeros(nt,60);
allx25 = zeros(nt,60);
allx50 = zeros(nt,60);

alldx1 = zeros(nt,60);
alldx25 = zeros(nt,60);
alldx50 = zeros(nt,60);

alldy1 = zeros(nt,60);
alldy25 = zeros(nt,60);
alldy50 = zeros(nt,60);

ux = zeros(nt,60,2);
uy = zeros(nt,60,2);

for i = 1:nt
    simout = adaptiveReaching([13 0 0],[0.1 0],0,25,[]);
    forces1(i,:) = simout.state(5,:);
    allx1(i,:) = simout.state(1,:);
    alldy1(i,:) = simout.state(4,:);
    simout = adaptiveReaching([13 0 0],[0.2 0],0,25,[]);
    forces25(i,:) = simout.state(5,:);
    allx25(i,:) = simout.state(1,:);
    alldy25(i,:) = simout.state(4,:);
    simout = adaptiveReaching([13 0 0],[0.5 0],0,25,[]);
    forces50(i,:) = simout.state(5,:);
    allx50(i,:) = simout.state(1,:);
    alldy50(i,:) = simout.state(4,:);

    %Change in Cost
    simout = adaptiveReaching([13 0 1.03],[0 0],0,25,[]);
    forces_costUp(i,:) = simout.state(5,:);
    simout = adaptiveReaching([13 0 0.98],[0 0],0,25,[]);
    forces_costDown(i,:) = simout.state(5,:);

% close all,
plot(mean(forces1),'k'), hold on
legend('\gamma = 0.1','\gamma = 0.2','\gamma = 0.5')
xlabel('Time (iteration number)');
ylabel('Control force [N]');

plot(mean(forces_costUp),'k'), hold on
plot(mean(forces_costDown),'Color',[.7 .7 .7])
legend('Cost up','Cost down');
xlabel('Time (iteration number)');
ylabel('Control force [N]');

Loading data, please wait...