Commit 0cc890e0 authored by Pierre MARQUE's avatar Pierre MARQUE

Initial commit

parents
No related merge requests found
Pipeline #1027 failed with stages
File added
This diff is collapsed.
This diff is collapsed.
File added
File added
File added
File added
This diff is collapsed.
File added
File added
Profil TSPc dans l'atlantique.gif

14.4 KB

File added
File added
from math import*
import random as rd
import matplotlib.pyplot as plt
Lois=[] #list de [profondeur,c]
c=340#m/s
def formationDesVoies(hydrophones,thetaMax,N,n,d,Dtemps):#-->renvoie des doublets (faisceau,temps)
#hydrophones : tableau des valeurs transducteurs enfonction du temps
#N nombre de voies souhaitées
#n : nombre de transducteurs
#d : distance entre les transducteurs
#theta en degrés
retards=[]
a=len(hydrophones[0])
for k in range(N): #on parcourt les N faisceaux
theta=-thetaMax+k*(thetaMax/2)
if abs(theta)<30: #Détection par amplitude (Instant d'Amplitude Maximale)
dectectionAmplitude(theta,d,hydrophones,thetaMax,theta,a,Dtemps)
#else :
#interferometrie(theta,hydrophones,thetaMax,N,n,d,Dtemps,a)
def dectectionAmplitude(theta,hydrophones,thetaMax,N,n,d,Dtemps,a):
amplitudeMax=0
instantAmplitudeMax=0
for j in range(floor(((n//2*d*sin(thetaMax)/c)+1)*(a/Dtemps)),floor((1-(n//2*d*sin(thetaMax)/c))*(a/Dtemps))): #on parcourt le temps
if Amax>sum(hydrophones[i][j+(n//2-j)*d*sin(theta)/c] for j in range(n)): #on somme les valeurs de tous les transducteeurs
amplitudeMax=sum(hydrophones[i][j+(n//2-j)*d*sin(theta)/c] for j in range(n))#sélection de l'instant d'amplitude max
instantAmplitudeMax=j*Dtemps/a
retards.append([k,instantAmplitudeMax])
#def interferometrie(theta,hydrophones,thetaMax,N,n,d,Dtemps,a):
# antenne1,antenne2=hydrophones[n//2+1:],hydrophones[:n//2+1]
def ping(w,t,t0,tf):
if t0<=t<=tf:
return cos(w*t)
else :
return 0
def amplitude(A,r):
return A/(pi*r)
def générerPlancher(profondeur=3000,alpha=pi/4,l=20):
Lz,Lx=[],[]
L=0 #longueur du plancher
x0=-1-tan(alpha/2)*profondeur #position de départ du plancher
z=profondeur #variable pour contrôler la profondeur
while L<-x0+tan(alpha/2)*z:
beta=pi*rd.gauss(0,0.2)
L+=l*cos(beta)
z+=l*sin(beta)
Lz.append(z)
Lx.append(x0+L)
plt.plot(Lx,Lz);plt.show()
#return Lx,Ly
def valeursAngulaires(Lx,Lz):#renvoie les valeurs angulaires des "sommets" du plancher
valeursAngulaires=[]
l=len(Lx)
for k in range(l):
valeursAngulaires.append(atan2(Lx,L,y))#k pour conserver le rang du "sommet"
return valeursAngulaires
def reflecteurs(Lx,Lz,R,alpha): #R la résolution voulue #renvoie les coordonnées des "réflecteurs"
#renvoie les coordonnées des réflecteurs
angleSommets=valeursAngulaires(Lx,Lz)
anglesClassés=sorted(angleSommets,key=lambda angle: angle[0])
pas=alpha/(R-1)
l=len(Lx)-1
reflecteurs=[]
for k in range(R):#on place chacun des réflecteurs
angle=k*pas #angle du réflecteur
arretes=[]
arrete=0
for i in range(l):#on extrait les arrêtes de plancher qui croisées par le faisceau
if (angleSommets[i]-angle)*(angleSommets[i+1]-angle)<0:
arretes.append([i,sqrt(Lx[i]**2+Lz[i]**2)+sqrt(Lx[i+1]**2+Lz[i+1]**2)])#arrête comprise entre les sommets i et i+1 et sa "distance"
if len(arretes)>1:
arretesClassees=[]
arretesClassees=sorted(arretes,key=lambda distance: distance[1])
arrete=arretesClassees[0][0]
else:
arrete=arretes[0]
points=[Lx[arrete],Lz[arrete],Lx[arrete+1],Lz[arrete+1]]
a,b=coefFonctionAffine(points)[0],coefFonctionAffine(points)[1]
def f(x):return a*x+b-(sin(angle)/cos(angle))*x
t=dichotomie(0,point[1],f,1E-5)
coordonnees=[t,f(t)]
reflecteurs.append(coordonnees)
def ondeSonar(x,z,t,A,w,lois): #donne la forme de l'onde émise par le sonar
r=sqrt(x**2+z**2)
j=0
while z> lois[j][3]:
def ondeReflecteur(xr,zr,t,pas):
rr=sqrt(xr**2+zr**2)
d=sqrt(xr**2+zr**2)-sqrt(x**2+z**2)
ampReflecteur=amplitude(A,rr+d)
ampReflecteur=pas*ampReflecteur
ti=t
while zr>lois[2*j]:
if j==0:
ti-=quad(temps(loisDeVitesse[0],loisDeVitesse[1]),0,lois[0])
else :
ti-=quad(temps(loisDeVitesse[2*j],loisDeVitesse[2*j+1]),lois[2*(j-1)],lois[2*j])
j+=1
ti-=quad(temps(loisDeVitesse[2*j],loisDeVitesse[2*j+1]),lois[2*(j-1)],zr)
return ampReflecteur*ping(w,ti,t0,tf)
def ondeRéflechie(coordonnees,x,z,t): #coordonnées du réflecteur
j=len(lois)//2
while z<lois[2*j]:
j=j-1
def loisDeVitesse(lois):#liste %2 elts :[profondeur, vitesse]
#renvoie les coeff a et b des lois affines de vitesse
loisDeVitesse=coefFonctionAffine(lois)
return loisDeVitesse
def coefFonctionAffine(L): #renvoie les coefficients a et b tels que y=ax+b
iterations=len(L)//2-1
coeff=[]
for k in range(iterations):
a=(L[k+1]-L[k+3])/(L[k+0]-L[k+2])
b=L[1]-a*L[0]
coeff.append(a);coeff.append(b)
return coeff
def temps(a,b,x):
f=lambda u:a*u+b
return f(x)
def dichotomie(a,b,f,eps):
while abs(b-a)>eps:
m=(b+a)/2
if f(m)*f(b)>0:
b=m
else :
a=m
return m
This diff is collapsed.
This diff is collapsed.
File added
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment