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

 C Discussion :

Calcul par approximation successive


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Points : 47
    Points
    47
    Par défaut Calcul par approximation successive
    Bonsoir,

    Je suis entrain de mettre en oeuvre un algorithme pour me rapprocher d'un point particulier.

    Pour cela, j'utilise la méthode de l'approximation successive.

    J'obtiens des résultats cohérents au départ de mon algorithme puis la valeur stagne, je suppose que l'algorithme doit avoir sa limite.

    Pourriez-vous m'aider à déterminer le "delta" approprié à mon problème ?

    La valeur à atteindre est d'environ 17000 plus ou moins 3000.

    Mes conditions initiales sont :
    consigne = 65535
    delta = consigne/2

    Voici l'algorithme que j'ai pu mettre en oeuvre :

    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
    36
    37
    38
    int consigne = 25000;
    int delta_consigne = 100000;
     
    int itt = 0;
    QString etat_switch;
     
    while ( delta_consigne > 1)
    {
        if (itt == 0)
        {
        delta_consigne = consigne / 2;
     
        envoie(consigne);
        }
     
        else if (itt > 0)
        {
            reception_etat_switch(etat_switch);
     
            if(etat_switch.toInt() == 0)
            {
                delta_consigne /= 2;
                consigne -= delta_consigne;
     
                envoie(consigne);
            }
     
            else if (etat_switch.toInt() == 1)
            {
                delta_consigne /= 2;
                consigne += delta_consigne;
     
                envoie(consigne);
                reset_state_switch();
            }
        }
        itt++;
    }
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par joffrey575 Voir le message
    J'obtiens des résultats cohérents au départ de mon algorithme puis la valeur stagne, je suppose que l'algorithme doit avoir sa limite.
    Oui. La limite de précision de calcul. Si par exemple la précision est de 3 chiffres après la virgule, alors le nombre 0.1231 et 0.1239 sont vus comme étant le même. Bon la précision réelle d'un flottant n'est bien évidemment pas à 3 chiffres mais quelle qu'elle soit, le principe reste le même.

    Citation Envoyé par joffrey575 Voir le message
    Pourriez-vous m'aider à déterminer le "delta" approprié à mon problème ?
    Pas besoin. T'as même pas besoin de delta. Dans tout algorithme de recherche de limite tu peux utiliser cette précision à ton avantage. Quand tu n'arrives plus à distinguer le résultat N+1 du résultat N, tu peux arrêter ta recherche car de toute façon ça ne sert plus à rien de continuer à chercher.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Points : 47
    Points
    47
    Par défaut
    J'ai changé ma condition d'arret :

    while ( abs (consigne_2 - consigne_1) > 0 )

    Mon algorithme fonctionne mais à certains pas je me retrouve avec la valeur 9999 après plusieurs séquences de tests.

    C'est étrange, ... je n'arrive pas à en conclure quelque chose.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par joffrey575 Voir le message
    J'ai changé ma condition d'arret :

    while ( abs (consigne_2 - consigne_1) > 0 )
    Je présume que "consigne_2" mémorise l'avant dernier calcul et "consigne_1" le dernier. Tu peux même alors écrire while (consigne_1 != consigne_2).

    Citation Envoyé par joffrey575 Voir le message
    C'est étrange, ... je n'arrive pas à en conclure quelque chose.
    Donne moi les paramètres d'entrée et je regarde...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Points : 47
    Points
    47
    Par défaut
    Merci pour ton retour.

    La solution que j'ai trouvé c'est de réduire le delta seulement lorsque le switch passe d'un état à un autre.

    Dans ce cas, je converge bien vers la valeur voulue.

    Bonne journée.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2007, 13h42
  2. Saisie de calcul par l'utilisateur
    Par zenaf dans le forum C
    Réponses: 11
    Dernier message: 26/10/2006, 19h42
  3. calcul pgdc soustractions successives
    Par mullger dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/09/2006, 16h21
  4. Pb Requetes et calcul par condition
    Par flagfight dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 10h30
  5. [Access] Calcule par ligne dans une requête
    Par Belze dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/02/2006, 09h09

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