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 :

Algorithme de Levenberg Marquardt


Sujet :

C++

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Youpi !!

    Mon programme compile enfin !!

    Mais il n'en est pas pour autant moins buggé...

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    //
    //
    // ComputeLM - Compute Levenberg Macquardt
    // Le but final : calcule les coefficients de la fonction expectedFonction()
    // à partir d'un algorithme de Levenberg Macquardt
    // pour n points de coordonnées (x,y)
    //
    //
     
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <math.h>
    #include <vector> 
    using namespace std;
     
    double noise = 0; // Déclare le bruit comme étant une constante, ce qui est faux comme chacun sait !
     
    enum {a1,a2,a3,b1,b2,b3,nbParams}; // Déclare tous les paramètres de la fonction mathématique signalDecay
    double param[nbParams] = {1,2,3,0.1,0.2,0.3};
     
    double expectedFonction (double params[] , double x)
    {
    	return param[a1] * exp(-x * param[b1]) + param[a2] * exp(-x * params[b2]) + params[a3] * exp(-x * params[b3]) + noise ;
    }
     
     
    // Fonction de comparaison de la valeur observée et de la valeur prédite
    // retourne le carré de la différence
    double compareValues (double param[], vector<double> &datax, vector<double> &datay)
    {
    	double res = 0.0;
    	for ( int i = 0 ; i < datax.size() ; i++)
    	{
    		double sub = datay[i] - expectedFonction (param, datax[i]);
    		res = sub * sub;
    	}
    	return res;
    }
     
     
     
    // Corps du programme
    int main (int nNumberofArgs, char * pszArgs[])
    {
    	vector<double> datax ;
    	vector<double> datay ;
     
    	cout	<< "\nPour le moment, ce programme calcule la somme des différences au carré des valeurs espérées passées dans l'initialisation\n"
    			<< "Il retourne la valeur obtenue\n"
    			<< "Faire un CC des 48 points sous la forme x1 ... x48 suivis de y1 ... y48 et terminer par un nombre negatif\n"
    			<< endl;
     
    	// accumulation des suites de nombres
    	// les range dans 2 jolis tableaux
     
    	for (int j = 0 ; j = 47 ; j++)
    	{
    		double value = 0;
    		cin >> value ;
    		if (value < 0)
    		{
    			break ;
    		}
    		datax[j] = value;
    	}
    	for (int k = 0 ; k = 47 ; k++)
    		{
    			double value = 0;
    			cin >> value ;
    			if (value < 0)
    			{
    				break ;
    			}
    			datay[k] = value;
    		}
     
     
    	// affichage du résultat
    		cout << "\n La somme des moindres carrés est : ";
    		cout << compareValues(param, datax, datay) ;
    		cout << "\n" << endl;
     
     
    	cout << "A la prochaine - Kill prog dans 2 secondes..." << endl;
    	// Attend pour terminer le programme que l'utilisateur lise
    	// le contenu de la fenêtre puis appuie sur une touche
    	system("SLEEP 2");
    	return 0;
    }
    pcnrad33:computeLM_bin alexandre$ ./ComputeLM

    Pour le moment, ce programme calcule la somme des différences au carré des valeurs espérées passées dans l'initialisation
    Il retourne la valeur obtenue
    Faire un CC des 48 points sous la forme x1 ... x48 suivis de y1 ... y48 et terminer par un nombre negatif

    0 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 40 41 42 43 44 45 46 47 48 6 4,764753586 3,805805753 3,058150472 2,47256061 2,011680023 1,647096725 1,357148516 1,12527586 0,938783974 0,787911213 0,665126903 0,564601286 0,481804684 0,41320382 0,356031286 0,308110167 0,267720304 0,233496076 0,204348059 0,179402818 0,157956496 0,139438942 0,123385871 0,109417205 0,097220146 0,086535912 0,077149292 0,068880392 0,061578087 0,055114802 0,049382336 0,044288505 0,039754428 0,035712331 0,032103757 0,028878093 0,025991369 0,023405261 0,021086263 0,019004997 0,017135638 0,015455428 0,013944265 0,012584358 0,011359929 0,010256961 0,009262982 0,008366877 -1
    /Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/debug/vector:198:
    error: attempt to subscript container with out-of-bounds index 47, but
    container only holds 0 elements.

    Objects involved in the operation:
    sequence "this" @ 0x0x7fff5fbffa10 {
    type = NSt7__debug6vectorIdSaIdEEE;
    }
    Abort trap

    Je dois mal parametrer mes fonctions...

  2. #22
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int j = 0 ; j = 47 ; j++)
    Ca va pas bien se passer, ca...

    Ton vrai problème, c'est que tu déclares tes vecteur sans leur donner de taille,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<double> datax ;
    vector<double> datay ;
    mais que tu essaies d'en accéder les éléments... Pour ajouter des éléments dans un vector<>, il faut soit lui donner une taille au départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<double> datax(48) ;
    vector<double> datay(48) ;
    soit effectuer des push_back() au fur et à mesure que tu ajoutes des données, par exemple, dans la boucle des datax

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    datax.push_back(val);
    où val est la valeur que tu viens de lire (et que tu veux ajouter à ton tableau de données)

    Francois
    Dernière modification par Invité ; 08/01/2010 à 21h22.

  3. #23
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Honnêtement, et sans méchanceté aucune, je pense que tu n'as pas actuellement le niveau nécessaire pour programmer. Tout ce à quoi tu pourras aboutir ici c'est à avoir un programme qui marche, mais que tu ne maîtrises pas vraiment, et avec des notions un peu floues voire erronées sur comment il marche.

    Je pense qu'il pourrait être intéressant si tu dois faire ce genre d'activité de manière répétée (c'est à dire si ce programme n'est pas le seul que tu comptes faire au cours des 5 prochaines années) de prendre les choses plus progressivement en commençant par l'apprentissage de la programmation et d'un langage (éventuellement en parallèle du développement de ce code précis, pour lequel j'imagine que tu dois avoir des deadlines).

    Des bons livres existent pour ça, les suivre te donnerait probablement une base bien plus solide.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Bah un tableau, une boucle et c'est reglé. Je laisse koala détailler tout ca, il a une bien meilleure prose que moi (et j'ai pas trop le temps aussi )

    Sinon, tu es sûr de vouloir attaquer des sujets comme les classes templates alors que tu ne maitrise même pas les boucles ?
    Pourquoi c'est toujours à moi qu'on pense dans ces cas là

    PS: modérateurs, n'hésitez pas à modérer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Honnêtement, et sans méchanceté aucune, je pense que tu n'as pas actuellement le niveau nécessaire pour programmer. Tout ce à quoi tu pourras aboutir ici c'est à avoir un programme qui marche, mais que tu ne maîtrises pas vraiment, et avec des notions un peu floues voire erronées sur comment il marche.

    Je pense qu'il pourrait être intéressant si tu dois faire ce genre d'activité de manière répétée (c'est à dire si ce programme n'est pas le seul que tu comptes faire au cours des 5 prochaines années) de prendre les choses plus progressivement en commençant par l'apprentissage de la programmation et d'un langage (éventuellement en parallèle du développement de ce code précis, pour lequel j'imagine que tu dois avoir des deadlines).

    Des bons livres existent pour ça, les suivre te donnerait probablement une base bien plus solide.

    Je suis totalement d'accord avec toi et je ne le prends pas mal du tout. Je dois "maitriser" un langage de programmation d'ici fin mai tout en avançant sur mes travaux de recherche en parallèle.
    J'ai donc commencé à lire C++ pour les Nuls (une version de 2004) et je lis quelques tutos en fonctions de mes besoins.
    Je veux bien des conseils sur les ouvrage essentiels qu'il faut avoir dans sa bibliothèque (et avoir lu surtout) pour se démerder seul en C++. Je rappelle
    que je bosse sous Xcode (mais je peux télécharger un autre compilateur si on me le conseille), pour le moment en ligne de commande (je n'ai pas besoin d'interface visuelle) et que je dois intégrer ITK dans une seconde partie pour manipuler mes données (mais pour ça je peux directement me faire aider par un pro). De même si vous avez de bons tutos je suis preneur.
    C'est un peu difficile de faire le tri parmi tous les livres et tutos dispos...

    Merci pour vos précieux conseils.

  6. #26
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Si l'anglais ne te pose pas trop de problèmes, un livre rapide (faut parfois un peu s'accrocher) mais bien expliqué et expliquant les bonnes choses est Accelerated C++.

    Tu peux regarder le tutoriel d'Alp sur comment commencer en C++ :
    http://alp.developpez.com/tutoriels/debuter-cpp/#LII
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Si l'anglais ne te pose pas trop de problèmes, un livre rapide (faut parfois un peu s'accrocher) mais bien expliqué et expliquant les bonnes choses est Accelerated C++.

    Tu peux regarder le tutoriel d'Alp sur comment commencer en C++ :
    http://alp.developpez.com/tutoriels/debuter-cpp/#LII
    Ok je vais essayer de me procurer ce bouquin.
    Merci

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Bon alors voilà
    J'ai programmé plusieurs fonctions :

    f(x) : retourne la valeur de la fonction en prenant les paramètres a1 etc.
    smc : retourne la somme des moindre carré pour l'ensemble de mes valeurs de x en prenant les paramètres a1 etc.
    grad_a1(x) à grad_b3(x) : retournent la valeur du gradient d'un paramètre pour un x donné
    grad2_a1b1 etc : retourne la valeur de la dérivée seconde par paire de paramètres dans une matrice 6x6 (Hessien)

    Comment désormais minimiser ma fonction smc avec tout ça ?? De plus si j'ai bien compris il me faut un paramètre lamba (?)

    PS : j'attends mon livre avec impatience !

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    up !

    Si quelqu'un peut m'aider pour minimiser la fonction smc en tenant compte des gradients et du Hessien...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/04/2014, 13h53
  2. Erreur sur Fsolve (levenberg-marquardt algorithm)
    Par saad.pizzicato dans le forum MATLAB
    Réponses: 4
    Dernier message: 09/12/2013, 11h27
  3. [Débutant] Recherche d'un minimum par Levenberg Marquardt
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 9
    Dernier message: 23/04/2010, 23h36
  4. Levenberg Marquardt
    Par fraille dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/03/2005, 18h22

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