1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2016
    Messages : 10
    Points : 3
    Points
    3

    Par défaut Résolution d'une équation

    Bonjour,

    Étant nouveau sous SAS je pose ce message là:

    Après quelques recherches je n'ai pas trouvé de solutions donc voilà mon problème:
    je souhaite résoudre une équation du type:

    A = ∑ Bk/(1+tk+Z)^Ck , k appartenant à [1;n]


    Sachant que je connais A, mes différents Bk; tk et Ck (présent dans une table).

    Je cherche donc Z.

    En vous remerciant par avance du temps que vous prendrez pour me répondre

  2. #2
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : novembre 2017
    Messages : 13
    Points : 21
    Points
    21

    Par défaut

    Votre problème est-il d'extraire Z de votre équation ou bien avez-vous déjà une forme du genre "Z = ...." et vous cherchez comment la mettre en oeuvre sous SAS?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2016
    Messages : 10
    Points : 3
    Points
    3

    Par défaut

    Bonjour Monsieur,

    Je n'ai pas de formule exacte pour calculer Z,
    Z peut être évaluer en faisant varier Z (par dichotomie) afin de trouver l’égalité voulu.

    Mais cela risque d'être un peu long comme process et il faudrait que je code cette partie (je suis en train de me pencher sur cette réalisation afin de voir si c'est réalisable et fiable mais je me demandais si ce genre de résolution n'était pas déjà dans SAS (on le trouve dans EXCEL avec la fonction Analyse de scénario: valeur cible)).

    Merci du temps que vous prendrez à me répondre.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 117
    Points : 105
    Points
    105

    Par défaut

    Bonjour,

    Il n'y a pas de système automatique analogue à ce qui existe dans Excel pour faire ce type de traitement, dans SAS.
    Il faut donc programmer soi-même ses itérations. Cela suppose une étude mathématique préalable afin de connaître le comportement de la fonction.
    Je propose ici un premier élément de solution (j'ai pris N= 2 et j'ai calculé A sur Excel). Comme, ici, je n'ai pas fait d'étude de la fonction, je me contente, à chaque itération, d'incrémenter Z d'une unité (normalement, on ferait plutôt une étude dichotomique). Je demande une précision de 10-5 sur A ... et, pour prévoir les cas de non-convergence et éviter les boucles infinies, je fixe un nombre maximal d'itérations

    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
     
    data t;
    	n=2;
    	b1=1;b2=2;
    	t1=5;t2=6;	
    	c1=3;c2=4;
    	array b(2) b1-b2;
    	array t(2) t1-t2;
    	array c(2) c1-c2;
    	A_cible =	0.00157174211248285 ;
     
    	/* pour ces données, on doit obtenir Z = 3 */
    	epsilon = 1E-5; /* écart max par rapport à la cible */
     
    	z=1 ;
    	arret=0;
    	nb_iterations=0;
    	nb_iterations_max=1000; /* pour éviter une boucle infinie ! */
    	do while(not(arret));
    		A=0;
    		nb_iterations=nb_iterations+1;
    		do k = 1 to N; 	
    			A = A + b(k)/(1+t(k)+Z)**C(k); 
    		end;
    		erreur= abs(A-A_cible) ;
     
    		if erreur < epsilon or nb_iterations > nb_iterations_max then do;
    			Z_final = Z ; arret = 1;				
    		end;
    		else do;
    			z = z +1 ;
    		end;		
    	end;
    run;
    proc print data = t;run;
    Ne pas hésiter si questions !

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2016
    Messages : 10
    Points : 3
    Points
    3

    Par défaut

    Bonjour Monsieur,


    Je vous remercie de votre retour et de ce code qui m'a bien aidé.

    J'ai fait tourner votre code et cela marche mais me prends 90000000 d'itérations afin d'avoir un résultat correct pour un de mes cas.
    En effet je veux: A à 0.01 près mais du coup mon Z doit varier de manière beaucoup plus fine afin de trouver un résultat car sinon Epsilon ne rentre pas dans l'intervalle pour lequel z est considéré comme correct: il passe directement d'inférieur à 0.01 à supérieur à 0.01 (ou inversement) sans avoir trouvé le z correspondant et celui-ci continue donc de s'incrémenter sans jamais trouver de résultat).

    Et ayant un grand nombre de Z à calculer je vais donc me pencher sur une dichotomie (afin de gagner du temps) avec plusieurs cas car mon epsilon peut être positif ou négatif au début des itération mais je sais que z est généralement compris entre -2 et 2 (sauf quelques cas),

    Je vous remercie de votre retour et de ce code qui m'a bien aidé.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2016
    Messages : 10
    Points : 3
    Points
    3

    Par défaut Données d'entrée

    Bonjour,

    Voulant automatiser ce processus sur un grand nombre de Z à calculer j'ai un problème avec mes données d'entrée (b(k), t(k), c(k)):

    J'ai deux tableaux:

    tab1 id c b t
    g1 8.1 187.50 0.57
    g1 7.1 257.5 -0.02
    g1 6.1 82.50 0.29
    g1 5.1 750 0.15
    g1 4.1 50 0.01
    g1 3.1 1750 -0.01
    g1 2.1 150 0.43
    g1 1.1 18750 -0.03
    h2 0.6 25 2
    h2 1.1 25 2
    h2 1.7 25 2.5


    tab2 a
    g1 22000
    g2 70


    et je n'arrive donc pas à récupérer ces valeurs pour faire tourner votre petit programme. Ni à transposer mon tableau tab1 afin d'avoir une ligne par id et un nombre n de c, b et t sur cette même ligne, (j'arrive cependant à avoir 3 lignes pour un même id (c, b et t).

    Auriez-vous des pistes pour m'aider?

Discussions similaires

  1. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Général Algorithmique
    Réponses: 21
    Dernier message: 20/08/2009, 18h47
  2. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 11h04
  3. Résolution d'une équation différentielle
    Par ramrouma dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/02/2007, 15h11
  4. Réponses: 1
    Dernier message: 08/12/2006, 18h13
  5. Résolution d'une équation par Gauss
    Par rahmani01 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/11/2006, 23h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo