IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Calcul à partir de plusieurs contraintes


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Calcul à partir de plusieurs contraintes
    Bonjour,

    Je dois faire un programme pour configurer des registres dans un composant et je sèche.

    Nom des variables (toutes les variables sont des entiers positifs non nuls) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    a : nombre compris entre 64 000 et 1 000 000 000
    b : nombre compris entre 1 000 et 1 000 000
    c : nombre compris entre 1 et 65 534 (variable stockée sur 16 bits)
    d : nombre compris entre 1 et 4 094 (variable stockée sur 12 bits)
    e : nombre compris entre 1 et 16 777 214 (variable stockée sur 24 bits)
    const1 : vaut 6 250 000
    const2 : vaut 16 777 200
    const3 : vaut 1522
    Les formules sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a = const1 x c / d
    b = 8 x (const2  - e) / d
    d x const3 < e
    La fonction dont les paramètres d'entrées sont les variables a et b doit calculer la valeur des variables c, d et e.
    => vu que l'on travail sur des nombres entiers avec des plages de valeurs limitées, le calcul ne peut être exacte pour toutes les valeurs de a et b passées en paramètre (il y aura forcement un pourcentage d'erreur sur le calcul) : Lorsque l'on fait le calcul inverse, il faut que le pourcentage d'erreur sur la variable "a" soit inférieur à 0.5% et pour la variable "b" inférieur à 5%.
    => je ne sais par où commencer

    Toute aide sera la bienvenue
    Merci d'avance

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    a*d = const1 x c
    b*d = 8 x (const2 - e)
    d x const3 < e
    Si on fait l'hypothèse suivante :
    e = d*const3+1
    On a :
    b*d = 8*(const2-(d*const3+1))
    b*d = 8*const2-8*d*const3-8
    b*d+8*d*const3 = 8*const2-8
    d*(b+8const3) = 8*(const2-1)
    d = 8*(const2-1)/(b+8const3)
    Qu'on repends pour c :
    a*(8*(const2-1)/(b+8*const3)) = const1*c
    c = a*(8*(const2-1)/(b+8*const3))/const1
    On au final :
    c = a*(8*(const2-1)/(b+8*const3))/const1
    d = 8*(const2-1)/(b+8const3)
    e = d*const3+1
    On peu modifier le les équations en remplaçant le 1 par un delta plus variable :
    c = a*(8*(const2-delta )/(b+8*const3))/const1
    d = 8*(const2-delta )/(b+8*const3)
    e = d*const3+delta
    Sachant que delta peux varié entre *à la louche* (16 777 214 - 4 094) et 1.

    Après, il faut vérifier que les valeurs obtenu sont inclus dans les plages de valeurs voulu.

    Cordialement,
    Patrick Kolodziejczyk.

    Edit : avec remplacement des variables:
    c = a*(8*(16 777 200-delta )/(b+8*1522))/6 250 000
    d = 8*(16 777 200-delta )/(b+8*1522)
    e = d*1522+delta

    c = a*(8*(16 777 200-delta )/(b+12176))/6 250 000
    d = 8*(16 777 200-delta )/(b+12176)
    e = d*1522+delta
    Et delta = 1
    c = a*(134 217 592/(b+12176))/6 250 000
    d = 134 217 592/(b+12176)
    e = d*1521
    Note : Il est préférable de faire les calcules avec des variables de 32 bits.

    Pour avoir d =1 avec delta =1:
    b doit valoir 134 217 592-12176 = 134 205 416
    Pour avoir d = 4 094 (valeur maximal)
    b doit valoir ...

    4 094=134 217 592/(b+12176)
    (b+12176)*4 094=134 217 592
    b*4 094+ 49848544=134 217 592
    b=20607(,97...)

    Donc b doit être compris entre 20607 et 1 000 000 (limite de base) si delta est égal à 1. Il est donc possible que le choix partial de delta ne soit pas une bonne idée.

    Partir sur les inéquations est probalement plus judicieux :
    c > (a*8*const2/(b+8*const3))/const1
    d > 8*const2/(b+8*const3)
    e > d* const3

    c > (a*134217600/(b+12176))/6 250 000
    d > 134217600/(b+12176)
    e > 134217600/(b+12176)* 1522
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Pour avoir une solution, avec les inéquations ont obtient qu'il est nécessaire d'avoir :
    b>20607
    Car d à pour valeur maximal 4 094 et
    d > 134217600/(b+12176)

    l'inéquation de e ne donne pas plus de contrainte :
    e max = 16 777 214
    e > 134217600/(b+12176)* 1522
    b >-112/11023


    c max = 65 534
    c > (a*134217600/(b+12176))/6 250 000
    b*345875000+4211374000000 > a*1342176
    b/a > -16342334976

    Sachant que a et b sont positif, c'est toujours le cas.

    Note :
    c > (a*134217600/(b+12176))/6 250 000
    Avec a >=64 000 et b>20607 :
    c > (a*4094,1219534514840008541012109935)/6 250 000
    c > a*6,5505951255223744013665619375896e-4
    c >64 000*6,5505951255223744013665619375896e-4
    c > 41

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok merci pour les infos, j'ai compris le principe.
    Si j'ai bien compris, il n'est donc pas possible de faire déterminer une formule unique qui puisse donner le résultat en une seule passe.

    Je vais voir si je ne peux pas ajouter d'autres contraintes pour limiter encore plus le choix des valeurs.
    Aussi en découpant les plages de valeurs possibles de a et de b, on doit pouvoir figer la valeur de d (ou une autre variable), facilitant ainsi les calculs.
    => pour cela, je vais faire un tableau excel qui calcule les taux d'erreurs sur a et b pour repérer les valeurs de d que je peux figer en fonction des plages de valeur de a et b (je ne sais pas si vous m'avez compris )

    Merci

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    La problématique de tes équations, c'est que ce n'est pas un système à 3 équations et à 3 inconnus. Car tu as une inéquation dans le tas.
    Si tu arrive à rendre ton inégalité en une égalité, cela sera fixe. (Cela revient à définir la valeur delta.)

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer une moyenne à partir de plusieurs facteurs
    Par clairemoro87 dans le forum R
    Réponses: 3
    Dernier message: 27/04/2014, 14h42
  2. calcul de vitesse à partir de plusieurs images
    Par membreComplexe12 dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 15/06/2010, 15h11
  3. [Débutante] Calcul de moyenne à partir de plusieurs fichiers
    Par clèmence rahma dans le forum Fortran
    Réponses: 2
    Dernier message: 08/04/2009, 14h35
  4. Trigger et calcul d'une valeur à partir de plusieures tables
    Par tomasi dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 31/07/2008, 16h55
  5. calcul à partir de plusieur champs et affichage du resultat dans un champ
    Par carmen256 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 24/05/2006, 11h47

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