Aide matlab

Fermé
alwala Messages postés 3 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 13 août 2008 - 15 janv. 2008 à 00:20
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 16 janv. 2008 à 13:04
Bonjour,
je veux calcule la dispersion chromatique d'une fibre optique, avec matlab suivant la formule D=-(lamada/c)* d²n_eff/d²lamda
avec n_eff l'indice effectif et lamda est la longueur d'onde le problème est dans le calcule de la 2eme dérivèe du l'indice effectif par apport à lamda. n_eff et lamda sont difiner par un vecteur.


neff=[1.444855 1.444824 1.444794 1.444763 1.444731 1.444699 1.444667 1.444635 1.444603 1.44457 1.444537 1.444503 1.444469 1.444436 1.444401 1.444367 1.444332];
lamda=[1200e-9 1225e-9 1250e-9 1275e-9 1300e-9 1325e-9 1350e-9 1375e-9 1400e-9 1425e-9 1450e-9 1475e-9 1500e-9 1525e-9 1550e-9 1575e-9 1600e-9]
c=3e8;
la fibre est une fibre standard donc il faut terouve D= 17ps/nm.km à lamda egal 1550nm et zero à 1270nm
merci

8 réponses

Salut
j'ai corrige la formule mais elle ne donne pas les valeur connus de dispersion. j'ai utilise ce programme , sh possible de me corrige


%%%%%%%%%%%%%%%%%%%%
neff=[1.444855 1.444824 1.444794 1.444763 1.444731 1.444699 1.444667 1.444635 1.444603 1.44457 1.444537 1.444503 1.444469 1.444436 1.444401 1.444367 1.444332];
lamda=[1200e-9 1225e-9 1250e-9 1275e-9 1300e-9 1325e-9 1350e-9 1375e-9 1400e-9 1425e-9 1450e-9 1475e-9 1500e-9 1525e-9 1550e-9 1575e-9 1600e-9]
c=3e8;

%%%%%%%%%%%%%%%%%********** 1er dérivèe*************%%%%%%%%%%%%%%
xi=linspace(1200e-9,1600e-9,5000); % mesh fin entre 0 et 1
pp= spline(lamda,neff); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp);% obtient les coefficients des polynômes
sf =k+0.3:-1:1;% scaling factors
dco=sf(ones(l,1),:).*coefs(:,1:k+0.3);% évalue les coeffs de dérivation
ppd=mkpp(br,dco); %construit la pp-form pour la différentiation
yid=ppval(ppd,xi);% calcul de la dérivée

%%%%%%%%%%%%%%%%%********** 2eme dérivèe*************%%%%%%%%%%%%%%
pp1=spline(xi,yid); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp1); % obtient les coefficients des polynômes
sf=k-0.91:-1:1; % scaling factors
dco= sf(ones(l,1),:).*coefs(:,1:k-0.91); % évalue les coeffs de dérivation
ppd1=mkpp(br,dco); %construit la pp-form pour la différentiation
yid1=ppval(ppd1,xi); % calcul de la dérivée
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

D=-(lamda/c).*yid1(1:length(lamda));
plot(lamda,D)
%%%%%%%%%%%%%%%%%%%%%%%%%%%ù
mercie
1
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 janv. 2008 à 01:04
Salut alwala
17 points c'est un peu faible...
Là t'auras rien de convaincant, mais la formule sous Matlab c'est:
D = - ( lambda(2:end-1) / c ) .* ( n_eff(3:end) - 2*n_eff(2:end-1) + n_eff(1:end-2) ) / h^2
h est le pas que t'as choisi pour lambda (dans ton exemple c'est 25e-9)

Ca te donne D pour lambda allant de la deuxième à l'avant-dernière valeur.

A plus.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
15 janv. 2008 à 08:42
Tu peux aussi remplacer h^2 par
(lambda(2:end)-lambda(1:end-1)).^2
Bien entendu, la formule donnée suppose que l'écart entre chaque longueur d'onde est constante.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 janv. 2008 à 18:08
Pas tout à fait... Il y a 16 éléments dans tes vecteurs...
Ahlala ces Docteurs... c'est plus ce que c'était... :-p
0
j'ai utilise la formule donnée avec h =10nm donc j'ai un vecteur du 42 elements ; mais le probleme que la taille des vecteur dans la formule ne sont pas les memes cad je peut pas calcule la dispersion

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

n_eff=[1.444855 1.444843 1.44483 1.444818 1.444806 1.444794 1.444781 1.444769 1.444756 1.444744 1.444731 1.444719 1.444706 1.444693 1.44468 1.444667 1.444655 1.444642 1.444629 1.444616 1.444603 1.444589 1.444576 1.444563 1.44455 1.444537 1.444523 1.44451 1.444496 1.444483 1.444469 1.444456 1.444442 1.444429 1.444415 1.444401 1.444388 1.444374 1.44436 1.444346 1.444332 1.444318];
lambda=[1200e-9 1210e-9 1220e-9 1230e-9 1240e-9 1250e-9 1260e-9 1270e-9 1280e-9 1290e-9 1300e-9 1310e-9 1320e-9 1330e-9 1340e-9 1350e-9 1360e-9 1370e-9 1380e-9 1390e-9 1400e-9 1410e-9 1420e-9 1430e-9 1440e-9 1450e-9 1460e-9 1470e-9 1480e-9 1490e-9 1500e-9 1510e-9 1520e-9 1530e-9 1540e-9 1550e-9 1560e-9 1570e-9 1580e-9 1590e-9 1600e-9 1610e-9];
h=10e-9;
c=3e8;
D=-(lambda(2:end)/c).*(n_eff(3:end)-2*n_eff(2:end-1)+n_eff(1:end-2))/h^2;
plot(lambda(1:length(D)),D)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 janv. 2008 à 19:12
Salut c'est:
D=-(lambda(2:end-1)/c).*(n_eff(3:end)-2*n_eff(2:end-1)+n_eff(1:end-2))/h^2;
Et plutôt plot(lambda(2:end-1),D)

Cela dit ça reste un peu cracra. Mais en même temps je sais pas à quoi doit ressembler D...
Autres pistes possibles:
1) Prendre plus de chiffres significatifs pour n_eff (ou prendre encore plus de valeurs, je sais pas...)
2) Changer complètement la méthode, par exemple, si tu sais que n_eff en fonction de lambda est un truc du genre (information a priori):
n_eff = a*lambda^2 + b*lambda + d où a, b,d sont des constantes, fais plutôt un truc du genre régression pour trouver a,b,d en fonctions des valeurs que t'as.
Et ensuite ta dérivée seconde c'est 2a.

Si n_eff est une fonction plutôt complexe de lambda, vaut mieux rester sur la piste 1...
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
16 janv. 2008 à 02:26
Salut alwala
A vrai dire je connaissais pas les spline, ou peut-être que je les ai connues mais vu que je les ai jamais utilisées, je les ai oubliées. Du coup je m'y suis un peu intéressé, ça peut servir.

Je sais pas ce que ça vaut en vrai, est-ce que les dérivées sont correctement approchées, etc... Comme tout il doit y avoir des cas où ça marche bien et d'autres moins.
En tout cas j'ai noté un truc que je comprends pas trop et des petites erreurs dans ce que t'as écrit.
1) Je comprends pas trop le choix des scaling factor (peut-être dû à mon ignorance). Personnellement j'aurais pas mis ça comme ça.
2) Pour le D et le plot je pense que ça colle pas. Comme t'as écrit tu traces juste les premières valeurs de yid1, ce qui correspond à une plage de lambda différente de [1200e-9;1600e-9] donc qui va pas avec l'abscisse du plot.

Donc j'aurais écrit plutôt ça comme ça (en gras c'est ce que j'ai changé):

%%%%%%%%%%%%%%%%%%%%
n_eff=[1.444855 1.444824 1.444794 1.444763 1.444731 1.444699 1.444667 1.444635 1.444603 1.44457 1.444537 1.444503 1.444469 1.444436 1.444401 1.444367 1.444332];
lambda=[1200e-9 1225e-9 1250e-9 1275e-9 1300e-9 1325e-9 1350e-9 1375e-9 1400e-9 1425e-9 1450e-9 1475e-9 1500e-9 1525e-9 1550e-9 1575e-9 1600e-9];
c=3e8;
%%%%%%%%%%%%%%%%%********** 1ère dérivée*************%%%%%%%%%%%%%%
xi=linspace(1200e-9,1600e-9,5000); % mesh fin
pp= spline(lambda,n_eff); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp);% obtient les coefficients des polynômes
sf =k-1:-1:1;% scaling factors
dco=sf(ones(l,1),:).*coefs(:,1:k-1);% évalue les coeffs de dérivation
ppd=mkpp(br,dco); %construit la pp-form pour la différentiation
yid=ppval(ppd,xi);% calcul de la dérivée

%%%%%%%%%%%%%%%%********** 2ème dérivée*************%%%%%%%%%%%%%%
pp1=spline(xi,yid); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp1); % obtient les coefficients des polynômes
sf=k-1:-1:1; % scaling factors
dco= sf(ones(l,1),:).*coefs(:,1:k-1); % évalue les coeffs de dérivation
ppd1=mkpp(br,dco); %construit la pp-form pour la différentiation
yid1=ppval(ppd1,xi); % calcul de la dérivée
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

D=-(xi/c).*yid1;
plot(xi,D)

%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cela dit, t'as peut-être été un peu violent sur le nombre de points (5000). J'avais suggéré d'en prendre plus mais c'était au moment où t'essayais le calcul de la dérivée seconde par différences finies.
D'après ce que j'ai lu, avec les splines ont a pas le phénomène d'oscillations pour les hauts degrés qu'on a par exemple avec les polynômes d'interpolation de Lagrange (Wikipédia). Mais en tout cas, les résultats avec ce qui précède, brut de décoffrage, sont pas très beaux non plus.
J'ai donc essayé, contrairement à tout à l'heure, de diminuer le nombre de points, j'obtiens un truc qui ressemble à peu près à quelque chose, mais de là à dire que c'est ce que tu recherches... Fais éventuellement des essais par toi-même. Moi j'ai essayé comme ça:

%%%%%%%%%%%%%%%%%%%%
n_eff=[1.444855 1.444794 1.444731 1.444667 1.444603 1.444537 1.444469 1.444401 1.444332];
lambda=[1200e-9 1250e-9 1300e-9 1350e-9 1400e-9 1450e-9 1500e-9 1550e-9 1600e-9];
c=3e8;
%%%%%%%%%%********** 1ère dérivée*************%%%%%%%%%%
xi=linspace(1200e-9,1600e-9,17); % mesh plus fin
pp= spline(lambda,n_eff); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp);% obtient les coefficients des polynômes
sf =k-1:-1:1;% scaling factors
dco=sf(ones(l,1),:).*coefs(:,1:k-1);% évalue les coeffs de dérivation
ppd=mkpp(br,dco); %construit la pp-form pour la différentiation
yid=ppval(ppd,xi);% calcul de la dérivée

%%%%%%%%%%********** 2ème dérivée*************%%%%%%%%%%
pp1=spline(xi,yid); % obtient les polynômes partiels de la spline
[br,coefs,l,k]=unmkpp(pp1); % obtient les coefficients des polynômes
sf=k-1:-1:1; % scaling factors
dco= sf(ones(l,1),:).*coefs(:,1:k-1); % évalue les coeffs de dérivation
ppd1=mkpp(br,dco); %construit la pp-form pour la différentiation
yid1=ppval(ppd1,xi); % calcul de la dérivée
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

D=-(xi/c).*yid1;
plot(xi,D)
%%%%%%%%%%%%%%%%%%%%%%%%%%%


Si tu veux essayer autre chose, dis-moi... Là j'ai pas d'idée lumineuse.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
16 janv. 2008 à 11:13
Salut
Bon alors...
J'avais dû laisser une coquille quand j'ai essayé avec tes 5000 points pour le xi parce qu'en fait j'ai revérifié ça pose pas de problème.

Par contre si les résultats sont moches en prenant ton code avec beaucoup de lambda et n_eff au départ, je pense que c'est dû aux erreurs (de mesure ou autre, je sais pas où tu as pris tes données...).

En effet, tu peux faire un test avec une fonction connue et la même structure de code.
Tu prends par exemple une fonction polynomiale du genre (x->x^4) et tu fais ton truc avec les splines. Dans ce cas la dérivée seconde est pas trop mal.
Après tu fais la même chose en ajoutant un peu de bruit et tu lances ton code avec beaucoup de points de mesure. C'est très laid.
Tu refais la même chose en prenant qu'une dizaine de points de mesure, c'est déjà mieux (normalement).

En tout cas tu peux refaire ce que j'ai écrit précédemment avec xi=linspace(1200e-9,1600e-9,5000); % mesh plus fin
Ça marche aussi, mais je sais pas si c'est ce genre de courbe que tu dois obtenir.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
16 janv. 2008 à 13:04
En effet, ça me parraisait bizard que le résultat oit moins bon avec plus de points.
ça me rappel mes cour de traitement du signal tout ça.
Je me rappel qu'il y avait un paramètre à ajouter pour "tendre" la spline de manière à lisser le bruit.
Il faut noter que nous fesions des splines qui ne passaient pas par les point expérimentaux, c'éait une espèce de régression.
Je ne sais pas si tu as assez de points, mais si tes données sont bien bruité, tu peux essayer d'appliquer un filtre Gaussien. Par exemple :
x(i)=(x(i-1)+2*x(i)+x(i+1))/3
ça devrai améliorer les résultats.
0