Boujour à toutes et à tous,
Le programme que je suis en train d'écrire à pour but de calculer un champ de vitesse dans un système eu peu compliquer. J'ai résolu ce calcul de façon analytique en terme de transformée de Hankel.
Il me faut donc inverser le calcul analytique en utilisant une procédure numérique. Et c'est là le problème !!!
Avant de parler du programme à proprement parler, il me faut d'abord parler de la résolution analytique.
Comme je l'ai dit précédemment, le calcul est résolu dans l'espace de Hankel. Le-dit calcul consiste à résoudre un système différentiel avec certaines conditions aux limites. Il y a donc deux étapes importantes dans le calcul :
1) le calcul des paramètres de résolutions du système différentiel. Il s'agit dans mon cas d'un système linéaire de 6 équations à 6 inconnues. Normalement, cela ne devrait pas poser de problèmes.
2) Le calcul du champ de vitesse dans l'espace de Hankel avec les paramètres issus de 1)
C'est là qu'intervient la résolution numérique ...
Donc le programme pourrait se structurer en 3 parties :
1) Résolution des conditions limites
2) Injection du résultat de 1) pour calculer le champ de vitesse dans l'espace Hankel
3) Inversion de la transformée de Hankel pour obtenir le champ de vitesse dans l'espace des réels
Cependant en faisant une transformée une transformée de Hankel on associe à la variable réelle (ici r) une variable de dimension inverse (ici k=nombre d'ondes) par un calcul intégrale évalué entre 0 et +inf. Pour repasser dans l'espace réel, on inverse la transformation toujours entre 0 et +inf. C'est là que réside mon problème.
En effet la matrice qui sort de la résolution des conditions limites automatiquement dépendante de k. Donc pour résumer j'ai :
M(k)*X=N(k)
Comme vous pourrez le constater, j'ai tenté de fonctionnaliser les matrices M, N et X, vu qu'on ne peut pas calculer une boucle infinie. De cette façon j'espérais pouvoir passer de l'étape 1) à 3) en utilisant la fonction quad(fct,0,Inf) pour calculer brutalement le transformée inverse avec le noyau de Kernel associé (partie III du programme). Cependant, je comprend bien que la notation X(i,j) ne fonctionne pas étant donné que X est fonction de k.
Je n'ai absolument aucune idée de comment résoudre ce problème à cause du caractère impropre de la transformée.
Je remercie par avance toute personne qui pourrait m'apporter sons aide. Si d'aventure vous avez des suggestions pour optimiser ce calcul, je suis preneur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 %% Parameters T0=20; delta_T0=10; Tmax=T0+delta_T0; sigma_vs_T=1E-4; wth=5E-5; nb_pts=1000; if strcmp(mode_exe,'yes') r=linspace(0,1E-3,nb_pts); z=linspace(0,7E-4,nb_pts); else r=linspace(0,1E-3,nb_pts); z=linspace(0,7E-4,nb_pts); end %% Calculation Tk=@(k) Tmax*((wth^2)/2).*exp(-((wth.*k).^2)/4); for i=1:length(r) integrand=@(k)(-k*Tmax*(wth^2)/2)*exp(-((wth*k)^2)/4)*k*besselj(1,k*r(i)); gradTr(i)=quad(integrand,0,inf); end M=@(k)[-2 -1/(k*H1) -1/(k*H1) 2 1/(k*H2) 1/(k*H2) \ (exp(-k*H1)-exp(k*H1)) -exp(-k*H1) -exp(k*H1) 0 0 0 \ 0 0 0 (exp(k*H2)-exp(-k*H2)) exp(k*H2) exp(-k*H2)\ (-exp(-k*H1)-exp(k*H1)) -((1-k*H1)/(k*H1))*exp(-k*H1) -((1+k*H1)/(k*H1))*exp(k*H1) 0 0 0 \ 0 0 0 (-exp(k*H2)-exp(-k*H2)) -((1+k*H2)/(k*H2))*exp(k*H2) -((1-k*H2)/(k*H2))*exp(-k*H2) \ 0 -2*(eta1/H1) 2*(eta1/H1) 0 2*(eta2/H2) -2*(eta2/H2)]; %%% Matrix N N=@(k) [0;0;0;0;0;-sigma_vs_T*k*Tmax*((wth^2)/2)*exp(-((wth*k)^2)/4)]; %%% Calculation X=inv(M).N X=@(k) inv(M)*N; %% %%%% Partie III : Velocity field calculation : inverse hankel transform %% Calculation of urr for i=1:length(r) for j=1:length(z) urr_1(i,j)=quad((-X*(1,1)*(exp(k*z(j))+exp(-k*z(j)))-(X(2,1)/(k*H1))*(1+k*z(j))*exp(k*z(j))+(X(3,1)/(k*H1))*(1-k*z(j))*exp(-k*z(j)))*k*besselj(1,k*r(i)),0,Inf); urr_2(i,j)=quad((-X(4,1)*(exp(k*z(j))+exp(-k*z(j)))-(X(5,1)/(k*H2))*(1+k*z(j))*exp(k*z(j))+(X(6,1)/(k*H2))*(1-k*z(j))*exp(-k*z(j)))*k*besselj(1,k*r(i)),0,Inf); end end
Beltharion
Partager