v=log((1:1e6));
tic;
v=zeros(1,1e6);
for p=1:1e6
v(p)=log(p);
end
toc; Le temps d'exécution pour cette boucle est de 3,7s, alors que le temps d'exécution du même calcul écrit de cette manière
tic;v=log((1:1e6));toc;est de 0,3s.


function B = compute_B_loop(R,I,x,n)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Calcule le champ magnétique généré par une boucle de courant
%% R est le rayon de la boucle
%% I est l'intensité du courant
%% x est la matrice des points où on veut calculer le champ B
%% La taille de x est 3 x nombre_de_points
%% ( x1 ... ...)
%% x = ( y1 ... ...)
%% ( z1 ... ...)
%% n est le nombre de points de discrétisation pour la boucle de courant
%% B est une matrice 3 x nombre_de_points
%% ( Bx1 ... ...)
%% B = ( By1 ... ...)
%% ( Bz1 ... ...)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mu0 = 4*pi*10^(-7);
nx=size(x,2);
B=zeros(3,nx);
for p=1:nx
for q=0:n-1
normxmy3=((x(1,p)-R*cos(2*pi/n*q))^2+(x(2,p)-R*sin(2*pi/n*q))^2+x(3,p)^2)^(3/2);
B(1,p)=B(1,p)+cos(2*pi/n*q)*x(3,p)/normxmy3;
B(2,p)=B(2,p)+sin(2*pi/n*q)*x(3,p)/normxmy3;
B(3,p)=B(3,p)...
+(-sin(2*pi/n*q)*(x(2,p)-R*sin(2*pi/n*q))-...
cos(2*pi/n*q)*(x(1,p)-R*cos(2*pi/n*q)))/normxmy3;
end
end
B = mu0*R*I/(2*n)*B;
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function B = compute_B(R,I,x,n) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Calcule le champ magnétique généré par une boucle de courant %% R est le rayon de la boucle %% I est l'intensité du courant %% x est la matrice des points où on veut calculer le champ B %% La taille de x est 3 x nombre_de_points %% ( x1 ... ...) %% x = ( y1 ... ...) %% ( z1 ... ...) %% n est le nombre de points de discrétisation pour la boucle de courant %% B est une matrice 3 x nombre_de_points %% ( Bx1 ... ...) %% B = ( By1 ... ...) %% ( Bz1 ... ...) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mu0 = 4*pi*10^(-7); nx=size(x,2); %% x est la matrice des points de l'espace, on la répète x=repmat(reshape(x.',1,nx,3),[n 1 1]); %% y est la matrice des points de la boucle y=R*[cos(2*pi/n*(0:n-1));sin(2*pi/n*(0:n-1));zeros(1,n)]; %% On répète la matrice y y=repmat(reshape(y.',n,1,3),[1 nx 1]); %% On peut alors calculer matriciellement tous les vecteurs SM (i.e. yx) xmy=x-y; clear x y; %% On calcule tous les vecteurs dl de la formule (on multipliera par R à la fin) dy=[-sin(2*pi/n*(0:n-1));cos(2*pi/n*(0:n-1));zeros(1,n)]; %% On répète cette matrice dy=repmat(reshape(dy.',n,1,3),[1 nx 1]); %% On peut alors calculer matriciellement tous les vecteurs dl^SM de la formule (i.e. dy^yx) cdyxmy=cross(dy,xmy,3); clear dy; %% On calcule au passage toutes les normes de SM (yx) norm_xmy_3=repmat(dot(xmy,xmy,3).^(3/2),[1 1 3]); clear xmy; %% Il ne reste plus qu'à assembler B B=cdyxmy./norm_xmy_3; clear cdyxmy norm_xmy_3; B=sum(B); B = mu0*R*I/(2*n)*B; B = squeeze(B); B = B.'; %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[X Y Z]=meshgrid(linspace(-5,5,50)); x=[reshape(X,1,50^3);reshape(Y,1,50^3);reshape(Z,1,50^3)]; clear X Y Z; tic;B_loop=compute_B_loop(1,1,x,50);toc; clear B_loop;nous donne un temps d'exécution de 20,8s.
[X Y Z]=meshgrid(linspace(-5,5,50)); x=[reshape(X,1,50^3);reshape(Y,1,50^3);reshape(Z,1,50^3)]; clear X Y Z; tic;B=compute_B(1,1,x,50);toc; clear B;nous donne un temps d'exécution de 14,4s.
[X Y Z]=meshgrid(linspace(-5,5,100)); x=[reshape(X,1,100^3);reshape(Y,1,100^3);reshape(Z,1,100^3)]; clear X Y Z; tic;B=compute_B(1,1,x,50);toc; clear B;La place mémoire est insuffisante pour l'exécution du programme.
[X Y Z]=meshgrid(linspace(-5,5,100)); x=[reshape(X,1,100^3);reshape(Y,1,100^3);reshape(Z,1,100^3)]; clear X Y Z; tic;B_loop=compute_B_loop(1,1,x,50);toc; clear B_loop;s'exécute sans problème.
function B = compute_B(R,I,x,n)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Calcule le champ magnétique généré par une boucle de courant
%% R est le rayon de la boucle
%% I est l'intensité du courant
%% x est la matrice des points où on veut calculer le champ B
%% La taille de x est 3 x nombre_de_points
%% ( x1 ... ...)
%% x = ( y1 ... ...)
%% ( z1 ... ...)
%% n est le nombre de points de discrétisation pour la boucle de courant
%% B est une matrice 3 x nombre_de_points
%% ( Bx1 ... ...)
%% B = ( By1 ... ...)
%% ( Bz1 ... ...)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mu0 = 4*pi*10^(-7);
nx=size(x,2);
%% La taille l d'un bloc sera de 32768 points
l = 32768;
%% Les calculs suivants sont identiques au code précédent vectorialisé
%% sauf qu'on travaille par blocs
seg=(1:l:nx);
if seg(end)~=nx, seg(end+1)=nx; end
seg(end)=seg(end)+1;
nseg=size(seg,2)-1;
display([num2str(nseg), ' blocs']);
B = zeros(nx,3);
for pq=1:nseg
display(['Bloc ',num2str(pq)]);
npq=seg(pq+1)-seg(pq);
xpq=repmat(reshape(x(:,seg(pq):seg(pq+1)-1).',1,npq,3),[n 1 1]);
y=R*[cos(2*pi/n*(0:n-1));sin(2*pi/n*(0:n-1));zeros(1,n)];
y=repmat(reshape(y.',n,1,3),[1 npq 1]);
xpqmy=xpq-y; clear xpq y;
dy=[-sin(2*pi/n*(0:n-1));cos(2*pi/n*(0:n-1));zeros(1,n)];
dy=repmat(reshape(dy.',n,1,3),[1 npq 1]);
cdyxpqmy=cross(dy,xpqmy,3); clear dy;
norm_xpqmy_3=repmat(dot(xpqmy,xpqmy,3).^(3/2),[1 1 3]); clear xmy;
B(seg(pq):seg(pq+1)-1,:)=squeeze(sum(cdyxpqmy./norm_xpqmy_3)); clear cdyxpqmy norm_xmy_3;
end
B = mu0*R*I/(2*n)*B;
B = B.';
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[X Y Z]=meshgrid(linspace(-5,5,100)); x=[reshape(X,1,100^3);reshape(Y,1,100^3);reshape(Z,1,100^3)]; clear X Y Z; tic;B=compute_B(1,1,x,50);toc; clear B;Il lui faut environ 124s pour s'exécuter.
[X Y Z]=meshgrid(linspace(-5,5,100)); x=[reshape(X,1,100^3);reshape(Y,1,100^3);reshape(Z,1,100^3)]; clear X Y Z; tic;B_loop=compute_B_loop(1,1,x,50);toc; clear B_loop;s'exécute quant à lui en 169s.
Résultats pour La vectorialisation sous MatLab
Résultats pour La vectorialisation sous MatLab