mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	All of these code samples currently are mis-identified in my repositories. I'm donating them to the cause.
		
			
				
	
	
		
			178 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
tic
 | 
						||
clear all
 | 
						||
%% Elements for grid definition
 | 
						||
n=100;
 | 
						||
 | 
						||
%% Dimensionless integrating time
 | 
						||
T=2;
 | 
						||
 | 
						||
%% Choice of the mass parameter
 | 
						||
mu=0.1;
 | 
						||
 | 
						||
%% Computation of Lagrangian Points
 | 
						||
[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);
 | 
						||
 | 
						||
%% Computation of initial total energy
 | 
						||
E_L1=-Omega(xl1,yl1,mu);
 | 
						||
C_L1=-2*E_L1; % C_L1 = 3.6869532299 from Szebehely
 | 
						||
E=E_L1+0.03715; % Offset as in figure 2.2 "LCS in the ER3BP"
 | 
						||
 | 
						||
%% Initial conditions range
 | 
						||
x_0_min=-0.8;
 | 
						||
x_0_max=-0.2;
 | 
						||
 | 
						||
vx_0_min=-2;
 | 
						||
vx_0_max=2;
 | 
						||
 | 
						||
y_0=0;
 | 
						||
 | 
						||
% Grid initializing
 | 
						||
[x_0,vx_0]=ndgrid(linspace(x_0_min,x_0_max,n),linspace(vx_0_min,vx_0_max,n));
 | 
						||
vy_0=sqrt(2*E+2.*Omega(x_0,y_0,mu)-vx_0.^2);
 | 
						||
% Kinetic energy computation
 | 
						||
E_cin=E+Omega(x_0,y_0,mu);
 | 
						||
 | 
						||
% Inizializing
 | 
						||
x_T=zeros(n,n);
 | 
						||
y_T=zeros(n,n);
 | 
						||
vx_T=zeros(n,n);
 | 
						||
vy_T=zeros(n,n);
 | 
						||
filtro=ones(n,n);
 | 
						||
E_T=zeros(n,n);
 | 
						||
delta_E=zeros(n,n);
 | 
						||
a=zeros(n,n); % matrix of numbers of integration steps for each integration
 | 
						||
np=0; % number of integrated points
 | 
						||
 | 
						||
fprintf('integro con n = %i\n',n)
 | 
						||
 | 
						||
%% Energy tolerance setting
 | 
						||
energy_tol=0.1;
 | 
						||
 | 
						||
%% Setting the options for the integrator
 | 
						||
RelTol=1e-12;AbsTol=1e-12; % From Short
 | 
						||
% RelTol=1e-13;AbsTol=1e-22; % From JD James Mireles
 | 
						||
% RelTol=3e-14;AbsTol=1e-16; % HIGH accuracy from Ross
 | 
						||
options=odeset('AbsTol',AbsTol,'RelTol',RelTol);
 | 
						||
%% Parallel integration of equations of motion
 | 
						||
h=waitbar(0,'','Name','Integration in progress, please wait!');
 | 
						||
S=zeros(n,n);
 | 
						||
r1=zeros(n,n);
 | 
						||
r2=zeros(n,n);
 | 
						||
g=zeros(n,n);
 | 
						||
for i=1:n
 | 
						||
    waitbar(i/n,h,sprintf('Computing i=%i',i));
 | 
						||
	parfor j=1:n
 | 
						||
        r1(i,j)=sqrt((x_0(i,j)+mu).^2+y_0.^2);
 | 
						||
		r2(i,j)=sqrt((x_0(i,j)-1+mu).^2+y_0.^2);
 | 
						||
		g(i,j)=((1-mu)./(r1(i,j).^3)+mu./(r2(i,j).^3));
 | 
						||
		if E_cin(i,j)>0 && isreal(vy_0(i,j)) % Check for real velocity and positive Kinetic energy
 | 
						||
            S(i,j)=g(i,j)*T;
 | 
						||
            [s,Y]=ode45(@f_reg,[0 S(i,j)],[x_0(i,j); y_0; vx_0(i,j); vy_0(i,j)],options,mu);
 | 
						||
			a(i,j)=length(Y);
 | 
						||
%             if s(a(i,j)) < 2
 | 
						||
%                 filtro(i,j)=3;
 | 
						||
%             end
 | 
						||
			% Saving solutions
 | 
						||
			x_T(i,j)=Y(a(i,j),1);
 | 
						||
			vx_T(i,j)=Y(a(i,j),3);
 | 
						||
			y_T(i,j)=Y(a(i,j),2);
 | 
						||
			vy_T(i,j)=Y(a(i,j),4);
 | 
						||
 | 
						||
			% Computation of final total energy and difference with
 | 
						||
			% initial one
 | 
						||
			E_T(i,j)=Energy(x_T(i,j),y_T(i,j),vx_T(i,j),vy_T(i,j),mu);
 | 
						||
            delta_E(i,j)=abs(E_T(i,j)-E);
 | 
						||
            if  delta_E(i,j) > energy_tol; % Check of total energy conservation
 | 
						||
                fprintf(' Ouch! Wrong Integration: i,j=(%i,%i)\n E_T=%.2f \n delta_E=%f\n\n',i,j,E_T(i,j),delta_E(i,j));
 | 
						||
                filtro(i,j)=2; % Saving position of the point
 | 
						||
            end
 | 
						||
            np=np+1;
 | 
						||
        else
 | 
						||
			filtro(i,j)=0; % 1 = interesting point; 0 = non-sense point; 2 = bad integration point		
 | 
						||
		end
 | 
						||
	end
 | 
						||
end
 | 
						||
close(h);
 | 
						||
t_integrazione=toc;
 | 
						||
%%
 | 
						||
filtro_1=filtro;
 | 
						||
for i=2:n-1
 | 
						||
    for j=2:n-1
 | 
						||
        if filtro(i,j)==2 || filtro (i,j)==3
 | 
						||
            filtro_1(i,j)=2;
 | 
						||
			filtro_1(i+1,j)=2;
 | 
						||
            filtro_1(i-1,j)=2;
 | 
						||
            filtro_1(i,j+1)=2;
 | 
						||
            filtro_1(i,j-1)=2;
 | 
						||
        end
 | 
						||
    end
 | 
						||
end
 | 
						||
 | 
						||
fprintf('integato con n = %i\n',n)
 | 
						||
fprintf('integato con energy_tol = %f\n',energy_tol)
 | 
						||
fprintf('numero punti totali	\t%i\n',n^2)
 | 
						||
fprintf('numero punti integrati	\t%i\n',np)
 | 
						||
fprintf('tempo per integrare	\t%.2f s\n',t_integrazione)
 | 
						||
 | 
						||
%% FTLE Computation
 | 
						||
fprintf('adesso calcolo ftle\n')
 | 
						||
tic
 | 
						||
dphi=zeros(2,2);
 | 
						||
ftle=zeros(n-2,n-2);
 | 
						||
ftle_norm=zeros(n-2,n-2);
 | 
						||
 | 
						||
ds_x=(x_0_max-x_0_min)/(n-1);
 | 
						||
ds_vx=(vx_0_max-vx_0_min)/(n-1);
 | 
						||
 | 
						||
for i=2:n-1
 | 
						||
	for j=2:n-1
 | 
						||
		if filtro_1(i,j) && ... % Check for interesting point
 | 
						||
				filtro_1(i,j-1) && ...
 | 
						||
				filtro_1(i,j+1) && ...
 | 
						||
				filtro_1(i-1,j) && ...
 | 
						||
				filtro_1(i+1,j)
 | 
						||
			% La direzione dello spostamento la decide il denominatore
 | 
						||
			
 | 
						||
			% TODO spiegarsi teoricamente come mai la matrice pu<70>
 | 
						||
			% essere ridotta a 2x2
 | 
						||
			dphi(1,1)=(x_T(i+1,j)-x_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));
 | 
						||
			
 | 
						||
			dphi(1,2)=(x_T(i,j+1)-x_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));
 | 
						||
	
 | 
						||
			dphi(2,1)=(vx_T(i+1,j)-vx_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));
 | 
						||
            
 | 
						||
			dphi(2,2)=(vx_T(i,j+1)-vx_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));
 | 
						||
    
 | 
						||
			if filtro_1(i,j)==2 % Manual setting to visualize bad integrated points 
 | 
						||
				ftle(i-1,j-1)=0;
 | 
						||
			else
 | 
						||
				ftle(i-1,j-1)=(1/abs(T))*log(max(sqrt(abs(eig(dphi*dphi')))));
 | 
						||
                ftle_norm(i-1,j-1)=(1/abs(T))*log(norm(dphi));
 | 
						||
			end
 | 
						||
		end
 | 
						||
	end
 | 
						||
end
 | 
						||
 | 
						||
%% Plotting results
 | 
						||
% figure
 | 
						||
% plot(t,Y)
 | 
						||
% figure
 | 
						||
% plot(Y(:,1),Y(:,2))
 | 
						||
% figure
 | 
						||
 | 
						||
xx=linspace(x_0_min,x_0_max,n);
 | 
						||
vvx=linspace(vx_0_min,vx_0_max,n);
 | 
						||
[x,vx]=ndgrid(xx(2:n-1),vvx(2:n-1));
 | 
						||
figure
 | 
						||
pcolor(x,vx,ftle)
 | 
						||
shading flat
 | 
						||
 | 
						||
t_ftle=toc;
 | 
						||
fprintf('tempo per integrare      \t%.2f s\n',t_integrazione)
 | 
						||
fprintf('tempo per calcolare ftle \t%.2f s\n',t_ftle)
 | 
						||
 | 
						||
% ora=fstringf %TODO
 | 
						||
% save(['var_' num2str(n) '_' num2str(clock(4)])
 | 
						||
 | 
						||
nome=['var_xvx_', 'ode00', '_n',num2str(n)];
 | 
						||
save(nome) |