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

Mathématiques Discussion :

Programme Fit sur deux courbes en même temps


Sujet :

Mathématiques

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut Programme Fit sur deux courbes en même temps
    Salut à tous ,

    J'aimerai mettre en place un programme capable de "fitter" deux courbes non-linéaires en même temps.

    Je présente le contexte :

    J'ai deux fonctions :

    - f1(x,a1,a2,...,aN)
    - f2(x,a1,a2,...,aN)

    où a1,...aN sont des constantes en fonction de x. A partir de ces variables (x et ai), f1 et f2 produisent des résultats différents en fonction de x (comme la sensation de soif et la sensation d'aller aux toilettes qui dépendent des mêmes variables comme la quantité de boisson bu, le temps habituel de digérer, ... en fonction du temps).

    Mon objectif est d'obtenir des fits qui collent en même temps aux deux courbes expérimentales mesurées sur le même spectre. Je pense dans un premier temps utiliser lsqcurvefit comme fonction d'optimisation . Mais apparemment ses paramètres d'entrée ne peuvent pas accepter une deuxième fonction.

    Me voilà bloqué . Quelle est la solution ou le(s) astuce(s) à employer ?

    J'espère avoir bien présenté le contexte.

    Merci !

  2. #2
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 155
    Points
    1 155
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Corrige-moi si je dis une bêtise, mais tu ne peux pas étudier de façon séparer une des séries, voire les deux et la différence ?

    Cordialement.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Bonjour dev_ggy,

    Oui c'est cela.

    En fait logiquement j'aurai pensé fitter la première fonction f1(x,ai) en jouant sur les variables ai. Mais en reprenant les résultats du fit (c'est-à-dire les nouvelles ai), il y a beaucoup de chance que ça ne collera pas pour f2(x,ai). Du coup c'est pour ça que je souhaite réaliser un fit sur deux courbes en même temps ...

    Est ce que c'est la réponse qui te convient ?

  4. #4
    Membre averti Avatar de Delaney
    Homme Profil pro
    Developpeur VB amateur
    Inscrit en
    Mars 2014
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Developpeur VB amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 148
    Points : 372
    Points
    372
    Par défaut
    Bonjour,

    Puisque tu veux les mêmes paramètres (sauf x) pour fiter les deux courbes, pourquoi ne pas regrouper tous les points ensemble comme si c'était une seule courbe? Tu fites sur cet ensemble.

    Par contre si les deux courbes sont éloignées l'une de l'autre ça risque de donner un truc bizarre

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Bonjour Elthorn,

    Je comprends ta logique mais je ne vois pas comment "regrouper" les points des deux séries ? Il faut savoir que chacun dépend de la valeur x et apporte une réponse différente...

    Merci d'avance pour ton aide ainsi qu'aux autres...

  6. #6
    Membre averti Avatar de Delaney
    Homme Profil pro
    Developpeur VB amateur
    Inscrit en
    Mars 2014
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Developpeur VB amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 148
    Points : 372
    Points
    372
    Par défaut
    bon,

    1er cas, si c'est une bijection (pour un x, il y a un seul Y possible)
    tu regroupes tous tes points dans un seul tableau et tu fais ton fitage sur ce tableau

    2ème cas, ce n'est pas une bijection (ce qui semble être ton cas) donc pour un x, il y a plusieurs Y, voici plusieurs idées
    - tu peux regrouper tous tes points dans un seul tableau et tu fais ton fitage sur ce tableau comme dans le cas 1. concrètement tu traiteras chaque valeur comme si elles étaient indépendantes.

    - si tu a, à chaque fois, 2 Y pour un x, tu peux prendre la moyenne des deux valeurs (ou la médiane) et traiter le nouvel ensemble (assez simple à mettre en œuvre) ou fiter chaque ensemble et faire la moyenne des deux courbes obtenues (plus complexe mais permet de gérer le fait que tu peux ne pas avoir tout le temps deux Y pour un même X).

    dans tous les cas, ces méthodes peuvent s'appliquer sur un nombre quelconque de courbe

    fais quelques essais sur excel, pour voir les différences et ce qui te convient le mieux

    je joins deux fichiers pour te montrer ce que cela donne
    Images attachées Images attachées

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Fitter deux courbes avec mêmes paramètres en X et Y
    Bonjour tous le monde,


    J'aurai besoin de votre aide pour résoudre un problème de traitement de données expérimentales sur Excel.

    En fait, j'ai fait deux essais mécaniques et j'ai obtenus des données que je devrai traiter. En Y, j'ai les déplacements et en Y j'ai les forces. Les forces enregistrées ne sont pas les mêmes! et c'est ça mon problème.

    Le problème si que devrai fitter les courbes de ces données pour les valeurs de force identiques.

    Ce que je cherche à déterminer est:

    - Garder les mêmes valeurs de y pour trouver les valeurs de x pour le deuxième essai ( à partir des données du 1er essai).

    Est ce que quelqu'un pourrait m'aider pour palier à ce problème.

    Merci infiniment.

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Bonjour à tous,

    Je reviens sur le sujet car j'avais laissé y a un moment... Waouh je ne savais pas que ça faisait plus de 5 ans (je croyais que c'était l'année passé )...

    Après un bon moment de réflexion, je pense que je me suis mal exprimé sur la problématique. Je vais la reformuler et la simplifier.

    Supposons que j'ai deux fonctions y1 et y2 qui se basent sur les mêmes paramètres (a1, a2, ..., an) et sur le même domaine x.

    Exemple :

    y1 = 3.x + 2.a1.a2 + 7
    y2 = a1^2 + a2-x

    On voit bien que ces deux fonctions sont différentes et pourtant sont basées sur les mêmes paramètres (ai) et domaine (x).

    J'ai fait une mesure qui m'a donnée deux courbes :
    Nom : courbes expérimentales.PNG
Affichages : 485
Taille : 9,5 Ko

    Ensuite il faut je lance un programme de fit qui va ajuster les paramètres a1 et a2 afin de fitter les deux courbes en même temps. Car si je fitte que sur une courbe (par ex: y1), le fit va optimiser les a1 et a2 sur y1 au détriment de y2. Donc il faut équilibrer les deux. Je ne sais pas comment y prendre ... J'ai pensé aux nombres complexes afin de fusionner deux fonctions en une fonction (partie réelle : y1 et partie imaginaire : y2).

    En gros l'objectif est d'avoir cela :
    Nom : Courbes après fit.PNG
Affichages : 499
Taille : 10,9 Ko

    qui va m'apporter les valeurs de a1 et a2.

    Je vous remercie d'avance pour vos avis, conseils et réponses !

    Bonne journée !

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 278
    Points : 13 564
    Points
    13 564
    Par défaut
    Bonjour

    Pour une abscisse donnée, tu as un point de ta première courbe et un point de ta seconde courbe.
    Donc une erreur pour la première courbe. (par rapport à l'idéal)
    Et une erreur pour la seconde courbe. (par rapport à l'idéal)
    En sommant, tu auras une erreur globale.

    Pourquoi ne pas minimiser l'erreur globale en ajustant (fittant en franglais) a1 et a2 dans la somme de y1 et y2 ?

    Si une des deux courbes est plus importante, tu peux même pondérer en multipliant par une constante.
    Genre : y1 + 2 * y2
    L'erreur de y2 sera donc 2 fois plus importante que l'erreur y1.

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Points : 224
    Points
    224
    Par défaut
    [EDIT: oups, nos réponses se sont croisées]

    Bonjour,

    Je te préviens avant tout que je n'ai pas d'expérience dans ce domaine, mais j'ai un peu de théorie.

    Et ma théorie me dit que trouver un "Fit" pour y1 ne consiste qu'à minimiser une fonction delta1(a1, ..., aN), fonction représentant par exemple la somme des carrés des différences pour la méthode des moindre carrés. De même avec une fonction delta2(a1, ..., aN) pour y2.
    Le problème n'est pas compliqué: il faut juste maintenant minimiser une fonction delta(a1, ..., aN) dépendant des deux autres dans le bon sens (qui augmente si l'une des deux augmente). Typiquement: delta(a1, ..., aN) = delta1(a1, ..., aN)² + delta2(a1, ..., aN)². Et tu évoquais les nombres complexes: on peut dire que c'est ce à quoi ça revient en considérant avec cette formule le carré du module de la fonction complexe de partie réelle delta1 et de partie imaginaire delta2.

  11. #11
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    A chaque point expérimental x_i, y1_i , y2_i est associé une incertitude d1 ou d2(x_i). Cette incertitude signifie que le probabilité d'obtenir la mesure y1_i_mesuré est une fonction gaussienne exp(-sqr ( (y1_mesuré-y1_théorique)/d1 )). Cette incertitude est différente pour chaque point, elle est faible pour y2 quand x est entre 2 et 3. La fonction à minimiser ( correspondant à la probabilité maximale) est la somme des carrés pondérés : -sqr ( (y1_mesuré-y1_théorique)/d1 ) (plus les termes avec y2).

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Merci pour vos contributions... En effet ça m'a permis de me sortir un peu la tête du lsqcurvefit que j'avais l'habitude d'utiliser qui a fait oublier les notions de base...

    Donc ce que vous me préconisez est (en gros) :

    La fonction à optimiser :
    pour chaque abscisse (bien sûr !)

    La fonction "lsqcurvefit" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asolutions=lsqcurvefit('Y', adepart , x , Yexp)
    avec :
    - asolutions : les paramètres a qui ont permis un très bon fit

    - Y = y1 + y2 = 3.x + 2.a1.a2 + 7 + a1^2 + a2-x (vu précèdemment)

    - adepart : les paramètres de départ pour le fit

    - Yexp = y1exp + y2exp qui est la somme bête entre les valeurs expérimentales de de y1 et de y2 pour chaque abscisse (bien sûr !)

    J'ai bien vu ?

    Merci !

  13. #13
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    Je ne crois pas.
    La quantité à minimiser est :
    Somme (y1_i - (3.x_i + 2.a1.a2 + 7)/d1_i)^2 +
    Somme (y2_i - ( a1.x_i^2 + a2.x_i)/d2_i)^2
    (si j'ai bien compris tes fonctions)
    Il faut bien sûr commencer par déterminer les d_i.

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Points : 224
    Points
    224
    Par défaut
    Pour désambiguïser la fonction de Nebulix, je la réécris:
    Somme [((y1_i - (3.x_i + 2.a1.a2 + 7))/d1_i)²] +
    Somme [((y2_i - ( a1.x_i^2 + a2.x_i))/d2_i)²]

    Par contre, même si effectivement l'idéal serait de connaître ces coefficients d1_i et d2_i, on ne les connaît pas forcément, et le résultat reste raisonnable si on les considère comme constants, et qu'on les retire donc:
    Somme [(y1_i - (3.x_i + 2.a1.a2 + 7))²] +
    Somme [(y2_i - ( a1.x_i^2 + a2.x_i))²]

    Ensuite, je propose encore une fois de mettre les sommes au carré, car on préfère en général des erreurs de 2 et 2 plutôt que 0 et 4. (2²+2² < 0²+4²), c'est-à-dire:
    (Somme [(y1_i - (3.x_i + 2.a1.a2 + 7))²])² +
    (Somme [(y2_i - ( a1.x_i^2 + a2.x_i))²])²


    [EDIT: par contre, ta fonction lsqcurvefit ne semble pas vraiment adaptée pour appliquer cette quantité à minimiser. A la limite, ça fonctionnerait peut-être si Y est la quantité à minimiser que l'on vient de présenter, Yexp vaut 0, et x est une valeur quelconque (car non utilisée dans Y)]

  15. #15
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Rebonjour,

    Merci pour vos précisions !

    Cependant je n'ai pas compris les termes d1_i et d2_i ça veut dire quoi ?

    J'ai pu commencer à coder les équations (dur dur de passer du syntaxe mathématique au syntaxe informatique ). Ca a fonctionné sur une seule courbe et maintenant je suis sur le fit sur deux courbes.

    Alors je suis un peu bloqué là. Je vous explique : j'ai suivi le principe que vous avez conseillé mais je crois que ce n'est pas assez affiné... Car le programme d'optimisation tend à faire la moyenne des deux courbes... Voici une partie du code :

    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
     
    //Fonction à fitter
    function [Z,P]=FonctionZP(a,x)
        // a(1) = paramètre 1
        // a(2) = paramètre 2
        // (...)
        // a(9) = paramètre 9
        // a(10) = paramètre 10
        // x = spectre
     
        // le reste de l'équation est trop long à mettre mais ça produit deux sorties à partir de deux paramètres : Z et P
    endfunction
     
    // Extraction des data expérimentales (x, Z et P)
    [d]=read('data_experimentales.txt',-1,3);
    xdata=d(:,1);
    Zdata=d(:,2);
    Pdata=d(:,3);
     
    function err=fFonctionZP(param,m)
        a=param;
        [Z,P]=FonctionZP(a,xdata);
        err=(Zdata-Z) + (Pdata-P);
    endfunction
     
    // Valeurs de départ
    ainit=[1; -2; 3; 4; 5; 6; 7; 8; 9; 10];
    [asol,v,info]=lsqrsolve(ainit,fFonctionZP,size(xdata,1)) )
    Je pense que le point bloquant est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        err=(Zdata-Z) + (Pdata-P)
    Surtout que c'est sur un spectre.

    Que faire ?

    Merci d'avance !

  16. #16
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Apparemment j'ai testé le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     err=(Zdata-Z).^2 + (Pdata-P).^2;
    Et ça fonctionne !

    Mais je suis quand même preneur d'autres possibilités au cas où si celle-ci flanche

  17. #17
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    En toute rigueur il faudrait : err=((Zdata-Z)/dz).^2 + ((Pdata-P)/dp)^2;
    dz (y1, je suppose) est à peu près constant, par contre dp (y2) est visiblement beaucoup plus petit entre 2 et 3. Ces points sont très précis, il faut donc faire payer cher un petit écart en diminuant le dp correspondant.

  18. #18
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Merci pour toutes les réponses !

    Je vais pouvoir enfin clore ce sujet ouvert depuis plus de 5 ans

    Je vais pouvoir être soulagé de cette épine... Ça mérite bien d'être fêté !

    A bientôt !

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/05/2008, 20h01
  2. Requête sur deux tables en même temps
    Par will89 dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/04/2006, 12h01
  3. Tri sur deux champs en même temps
    Par Azharis dans le forum Access
    Réponses: 8
    Dernier message: 11/01/2006, 14h10
  4. Comptez sur deux tables en même temps
    Par genova dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/09/2004, 19h58
  5. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 18h00

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