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 :

Formule simple (sorte de moyenne sans en être une)


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut Formule simple (sorte de moyenne sans en être une)
    Salut,

    Je bloque bêtement sur la recherche d'une formule simple :

    a et b sont des variables qui varient entre 0 et 1. Et i donnerai :

    si a = 0 et b = 0 alors i =0
    si a = 1 et b = 1 alors i = 1
    si a ou b = 1, alors i = 1

    alors oui, en "logique", c'est facile : c'est la fonction OU. Mais là, il s'agit de VARIABLES qui peuvent prendre n'importe quelle valeur entre 0 et 1, et i doit suivre de manière variable également.

    A noter que si par exemple a= 0.5 et b=0.5, i devrait être à 0.75 ENVIRON peut-être à 0.5... bref, peu importe. (c'est pour faire varier une luminosité en fonction de positions... donc la luminosité intermédiaire m'importe peu... elle doit juste "varier")

    Y'a un truc qui vous vient face à ce petit problème ???


  2. #2
    Membre émérite
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Par défaut
    a*b ?

  3. #3
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Et non, parce que 0 * 1 = 0

  4. #4
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    si (a+b<>0) alors
       i=(E(a)+E(b))/(E(a)+E(b))
    sinon
       i=0
    fin si

    où E(x) est la partie entière de x.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Oui, là, tu as recréé une fonction logique OU. En revanche on perd les "nuances" :

    si a = 0.5 et b=0, ta formule donne 0 (en fai, elle plante car il y a une div par 0, mais disons qu'on corrige ta condition de départ en ajoutant E(x) à a et b)

    si a = 0.5 et b = 0.5, tq formule donne aussi 0...

    Alors j'ai essayé d'enlever tes E(x). Mais là,
    si a = b (même 0.2) on obtient toujours 1.

    Donc, merci de ta réponse, mais ça ne marche pas encore.

    Je savais que c'était (pas si) simple !

  6. #6
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    ok, la cond. était bien si (E(a)+E(b)<>0, sorry.

    Maintenant, je pense que j'ai lu trop vite et aussi que tu n'as pas assez bien expliqué ton problème: je pensais que i devait valoir soit 0 soit 1...

    Maintenant, en ayant relu ton post, est-ce que tu veux que i=1 uniquement quand a ou b=1 ?? Il y a pleins de possibilités


    Par exemple: que penses-tu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    si(a+b<>0) alors
       si (a=1 ou b=1) alors
          i=1
       sinon
          i=(a+b)/2  // où n'importe quelle formule, cf intra
       finsi
    sinon
       i=0
    fin si
    dans ce cas a=b=1/2 donne i=1/2

    Si tu veux que si a=b=1/2 donne un i se rapprochent de 3/4, alors tu prends

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    si(a+b<>0) alors
       si (a=1 ou b=1) alors
          i=1
       sinon
          i=(sqrt(a)+sqrt(b))/2
       finsi
    sinon
       i=0
    fin si
    dans ce cas a=b=1/2 donne i=0.707

  7. #7
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Ok, donc ta premiere solution est une adaptation des moyennes. La seconde me plait déjà plus, je préfère tomber sur 0.7. Mais :

    Quelque soit ta formule 1 ou 2 : si l'une des deux valeurs reste à zero (ou est petite et très différente de l'autre), quand le plus grand passera de 0.9999 à 1, ça va faire un choque dans le résulat ! Ca ne faire pas une courbe lisse en fonction de a et b !

    Est-ce que je suis assez clair là ?

    (Désolé, elle est complexe ma question hein )

  8. #8
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par Vincdeladrome
    Quelque soit ta formule 1 ou 2 : si l'une des deux valeurs reste à zero (ou est petite et très différente de l'autre), quand le plus grand passera de 0.9999 à 1, ça va faire un choque dans le résulat ! Ca ne faire pas une courbe lisse en fonction de a et b !
    (Désolé, elle est complexe ma question hein )
    Non pas très complexe, il faut juste savoir ce que tu veux!! Pour info, sqrt(a)+sqrt(b) est dérivable, donc lisse. Mais tu as effectivement un "saut" quand q ou b=1.

    Autre possibilité, toute simple:

  9. #9
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si(a+b<>0)
       si(a=1 ou b=1)
          i=1
       sinon
          i=sqrt((a*a+b*b)/(a+b))
       finsi
    finsi
    a=0.1 et b=0.9 donne i~0.9
    a=0.4 et b=0.7 donne i~0.76

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    i = a OU b = !(!a ET !b) = 1 - (1 - a)*(1 - b)

    tout simplement !

  11. #11
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    bonne formule aussi, "exacte" au sens algèbre booléenne! j'aurais du y penser aussi!!

  12. #12
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    c'est quoi "max" sur une calculette ?

    Bon, pour essayer de clarifier ce que je veux : plusieurs cas (mais avec toutes les nuances possibles sans "saut" quand on est entre deux cas) :

    - si a=0, i doit varier de 0 à 1 lisse (par forcement droit) en fonction de b
    - si b=0, i doit barier de 0 à 1 lisse (idem) en fonction de a
    - si a=b=1, alors i=1
    - si a=b=0, alors i=0

    enfin si par exemple a=0.2 et b=0.9, alors i ne doit pas être la moyene, mais plutôt très proche du plus grand, c'est à dire b. i devrait être en gros égale à 0.91 dans ce cas... au pif hein !

    Vous me comprenez là ?

  13. #13
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Citation Envoyé par Sylvain Togni
    i = a OU b = !(!a ET !b) = 1 - (1 - a)*(1 - b)

    tout simplement !
    Oui ! Je crois que c'est bon là !!!

    Je fais des tests en grandeur nature et je vous dis ! YES !!!

  14. #14
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Bon et bien voilà. Grand merci à vous parce que ça fonctionne impécablement bien !

    Et vive ici !!!

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

Discussions similaires

  1. Calculer une moyenne sans division
    Par mia123 dans le forum Assembleur
    Réponses: 22
    Dernier message: 13/03/2013, 14h47
  2. [MySQL] Une sorte de pagination sans BDD
    Par Eroik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/07/2007, 18h30
  3. Réponses: 2
    Dernier message: 22/06/2007, 20h06
  4. calcul de la moyenne sans compter le 0
    Par chrischros10 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 22/03/2007, 11h34
  5. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

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