Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2011, 20h57   #1
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut Calcul d'une intégrale sous SAS

Bonjour à tous !

Je fais appel à vous car j'ai un problème sous SAS que je n'ai pas réussi à résoudre avec l'aide des autres topics.
Voici la table de départ :

Code :
1
2
3
4
5
6
7
8
DATA relai;
input a b;
cards;
2  3.69
4  5.17
11  3.89
;
run;
je souhaite calculer l'intégrale de la fonction f(t) = t entre 0(fixe) et la variable b de la table relai i.e. calculer l'intégrale pour les différentes valeurs de b (entre 0 et 3.69, entre 0 et 5.17 ...)

je n'arrive pas à faire passer en paramètre la variable b dans la macro intégrale écrite ci-après...
et surtout, une fois le calcul de l'intégrale fait pour les différents b, j'aimerai ajouter une colonne dans la table relai avec ce résultat
je vous remercie beaucoup pour votre aide !

Code :
1
2
3
4
5
6
7
8
9
10
11
%macro integrale( B_sup);
proc iml;
  start fonction(t); 
      v = t
      RETURN(v); 
  finish; 
  a  = { 0  &B_sup}; 
  call quad(z,"fonction",a); 
  print z;
quit;
%mend integrale;
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 22h48   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Voici une piste à ton premier point

Code :
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
DATA relai;
input a b;
cards;
2 3.69
4 5.17
11 3.89
;
run;
 
DATA _null_;
	SET relai;
	call symput("nb",_n_);
	call symput("b"!!LEFT(_n_),b);
run;
 
%Macro INTEGRALE;
 
 
%do i=1 %TO &nb.;
 
%put &&b&i.;/* affichage de cahque valeur de b*/
 
/* ajoutes ici tes instruction sachant que cahque valeur de b est :&&b&i*/
 
%end;
%mend INTEGRALE;
%INTEGRALE;
J'ai aucune idée pour le sesond
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h07   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Remarque peut etre hors contexte, mais pour calculer ton integrale, pourquoi ne pas passer par la primitive (si mes lointains souvenirs de maths sont exacts).

il suffirait d'appliquer pour chacun de tes b:

integrale(b,0)=b**2/2-0**2/2=b**2/2
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h34   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Code :
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
DATA relai;
input a b;
cards;
2  3.69
4  5.17
11 3.89
;
run;
 
 
 
%MACRO INTEGRALE( fun_t=, B_inf=);
 
DATA _null_;
	SET relai;
	CALL SYMPUT (COMPRESS("mavar"||LEFT(_N_)),b);
	CALL SYMPUT ("nb",_n_);
RUN;
 
proc iml;
 
  /* Definition de l'intégrale */ 
  start fonction(t); 
      v = &fun_t; 
      RETURN(v); 
  finish; 
%do i=1 %TO &nb;
 
  a   = { &B_inf  &&mavar&i }; 
  call quad(z,"fonction",a); 
  print z[format=E21.14];
%end;
quit
 
 
%mend;
 
%INTEGRALE( fun_t=t, B_inf=0);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 11h17   #5
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut remerciement

Merci beaucoup megamind2! j'avais réussi grâce à tes explications du prmeier message!

Manoutz : en fait la fonction que j'ai donnée était pour simplifier le problème. En fait c'est une fonction à laquelle on ne peut pas calculer de primitive...mais merci quand même!
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 11h01   #6
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut calcul de l'integrale avec une boucle

Bonjour,
J'ai de nouveau un soucis pour le calcul de l'integrale. Je souhaite maintenant calculer l'integrale de la fonction f(t) = t^n (pour simplifier) pour différents n (sans passer n en paramètre). Pour cela je souhaite faire une boucle mais je ne sais pas si cela est possible car je n'arrive pas à corriger les erreurs...
Merci de votre aide!

Code :
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
DATA relai;
input a b;
cards;
2  3.69
4  5.17
11 3.89
;
run;
 
 
 
%MACRO INTEGRALE(B_inf=);
 
DATA _null_;
	SET relai;
	call symput("b"!!LEFT(_n_),b);
	CALL SYMPUT ("nb",_n_);
RUN;
 
proc iml;
 
%do n=1 %to 3  
  start fonction(t); 
      v = t^n; 
      RETURN(v); 
  finish; 

   %do i=1 %to 4;
	a   = { &B_inf  &&b&i }; 
	call quad(z,"fonction",a); 
	print z[format=E21.14];
   %end;
%end;
quit;
 
 
%mend;
 
%INTEGRALE(B_inf=0);
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 11h41   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,
Je n'ai pas IML au boulot pour tester, tu me diras si ça fonctionne

Code :
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
%MACRO INTEGRALE(B_inf=);
 
DATA _null_;
	SET relai;
	call symput("b"!!LEFT(_n_),b);
	CALL SYMPUT ("nb",_n_);
RUN;
 
%DO n=1 %TO 3 ;
  %DO i=1 %TO &nb.;
		proc iml;
		start fonction(t); 
		v = t**&n;
		RETURN(v); 
		finish; 
 
		a = { &B_inf &&b&i }; 
		call quad(z,"fonction",a); 
		print z[format=E21.14];
		quit;
  %END;
%END;
 
%MEND INTEGRALE;
 
%INTEGRALE(B_inf=0);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 21h42   #8
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut remerciement

Merci beaucoup megamind2, ça a effectivement résolu mon prolème!
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h01.


 
 
 
 
Partenaires

Hébergement Web