La réponse précédente est correcte d'un point de vue général, vectorisé dans le contexte des ODE signifie quelque chose de plus spécifique. En bref, une fonction f(t,y)
est vectorisé si f(t,[y1 y2 ...])
retours [f(t,y1) f(t,y2) ...]
, pour y1,y2
vecteurs de colonnes. Selon la documentation [1], "cela permet au solveur de réduire le nombre d'évaluations de fonctions nécessaires pour calculer toutes les colonnes de la matrice jacobienne".
Fonctions fun3
et fun4
ci-dessous sont correctement vectorisés au sens de l'EDO :
function re=rabdab()
x=linspace(0,20000,20000)';
opts=odeset('Vectorized','on');
tic;
[T,Y] = ode45(@fun,[x],[0 1 1]);
[T,Y] = ode45(@fun,[x],[0 1 1]);
[T,Y] = ode45(@fun,[x],[0 1 1]);
toc;
tic;
[A,B] = ode45(@fun2,[x],[0 1 1]);
[A,B] = ode45(@fun2,[x],[0 1 1]);
[A,B] = ode45(@fun2,[x],[0 1 1]);
toc;
tic;
[A,B] = ode45(@fun3,[x],[0 1 1],opts);
[A,B] = ode45(@fun3,[x],[0 1 1],opts);
[A,B] = ode45(@fun3,[x],[0 1 1],opts);
toc;
tic;
[A,B] = ode45(@fun4,[x],[0 1 1],opts);
[A,B] = ode45(@fun4,[x],[0 1 1],opts);
[A,B] = ode45(@fun4,[x],[0 1 1],opts);
toc;
function dy = fun(t,y)
dy = zeros(3,1); % a column vector
dy = [y(2) * y(3);...
-y(1) * y(3);...
-0.51 * y(1) * y(2);];
function dy = fun2(t,y)
dy = zeros(3,1); % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
function dy = fun3(t,y)
dy = zeros(size(y)); % a matrix with arbitrarily many columns, rather than a column vector
dy = [y(2,:) .* y(3,:);...
-y(1,:) .* y(3,:);...
-0.51 .* y(1,:) .* y(2,:);];
function dy = fun4(t,y)
dy = [y(2,:) .* y(3,:);... % same as fun3()
-y(1,:) .* y(3,:);...
-0.51 .* y(1,:) .* y(2,:);];
(Remarque annexe : si l'on omet l'allocation de mémoire inutile à l'aide de zeros
laisse fun4
fonctionnent légèrement plus vite que les fun3
.)
- Q : Qu'en est-il de la vectorisation par rapport au premier argument ?
- R : Pour les solveurs ODE, la fonction ODE est vectorisée uniquement par rapport au deuxième argument. Le solveur de problème de valeur limite
bvp4c
nécessite cependant une vectorisation en ce qui concerne les premier et deuxième arguments. [1]
La documentation officielle [1] fournit des détails supplémentaires sur la vectorisation spécifique aux ODE (voir la section "Description des propriétés du jacobien").
[1] https://www.mathworks.com/help/releases/R2015b/matlab/ref/odeset.html