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

Calcul scientifique Python Discussion :

Quantification de l'adéquation d'une courbe modélisée avec des points expérimentaux [Python 3.X]


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut Quantification de l'adéquation d'une courbe modélisée avec des points expérimentaux
    Bonjour,

    Je modélise la charge d'un condensateur par la courbe théorique a *(1- np.exp(-1/b*x))
    Visuellement, pas de soucis, les points sont proches de la courbe.

    J'utilise le module Scipy pour cela, et plus exactement curve_fit.
    A partir du résultat de la covariance, j'arrive bine à obtenir les incertitudes sur les paramètres optimisés mais j'aimerais également pouvoir quantifier l'adéquation entre les points expérimentaux et la courbe théorique (un peu comme le fait le coefficient de corrélation lors d'une régression linéaire).
    Existe-t-il un moyen de faire cela ?

    Merci d'avance
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Cf. la notice de curve_fit :

    https://docs.scipy.org/doc/scipy/ref...curve_fit.html

    Dans ce qu'elle retourne, on vous dit quelle quantité est minimisée, c'est à dire comment est calculé l'erreur entre la courbe théorique et les données. Il vous suffit de réappliquer ce calcul avec les paramètres identifiés, et le tour est joué.

  3. #3
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Cf. la notice de curve_fit :

    https://docs.scipy.org/doc/scipy/ref...curve_fit.html

    Dans ce qu'elle retourne, on vous dit quelle quantité est minimisée, c'est à dire comment est calculé l'erreur entre la courbe théorique et les données. Il vous suffit de réappliquer ce calcul avec les paramètres identifiés, et le tour est joué.
    j'ai compris le principe, la mise en oeuvre est plus délicate.

    Dans mon fichier, j'extrais les données d'un fichier texte à l'aide de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temps,tension=np.loadtxt("chargecondo.txt", delimiter=";",unpack=True)
    Je modélise les données expérimentales à l'aide de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    params, covar = curve_fit(fonction, temps, tension)
    Ensuite, et c'est là que je bloque, c'est comment calculer l'écart entre la valeur modélisée et la valeur expérimentale.
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Je vais citer plus précisément la notice de curve_fit pour vous aider :

    Returns

    popt : array
    Optimal values for the parameters so that the sum of the squared residuals of f(xdata, *popt) - ydata is minimized.
    Qu'y a t il de pas clair là dedans ? Vous devez calculer la somme des carrés des résidus, et on vous donne en plus la formule du résidu.

  5. #5
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Je vais citer plus précisément la notice de curve_fit pour vous aider :



    Qu'y a t il de pas clair là dedans ? Vous devez calculer la somme des carrés des résidus, et on vous donne en plus la formule du résidu.
    Mon interrogation ne portait pas sur la formule "mathématique" mais sur la transcription en Python mais je pense avoir réussi après plusieurs essais erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    residu=sum((fonction(temps, *params)-tension)*(fonction(temps, *params)-tension))
    Merci
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Oui voilà c'est ca. Il faudrait plutôt écrire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    residu=fonction(temps, *params)-tension
    erreur2=np.sum(residu**2)
    ou en une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur2=np.sum((fonction(temps, *params)-tension)**2)
    voire même utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur=np.linalg.norm(fonction(temps, *params)-tension)
    Plusieurs remarques :
    - Si fonction est un truc couteux à calculer, mieux vaut donc ne le calculer qu'une fois. En ecrivant residu=sum((fonction(temps, *params)-tension)*(fonction(temps, *params)-tension)), là vous le calculez deux fois. Mieux utiliser le carré donc, pour pouvoir éviter ce recalcul.
    - Vous confondez résidu et erreur. Ce n'est pas tout à fait pareil (regardez comment j'ai nommé les variables dans le 1er exemple)
    - L'erreur est souvent calculée via une norme, ici la norme L2 (que je recalcule avec numpy.linalg). Notez que curve_fit n'optimise pas directement sur la norme L2, mais sur son carré ! En effet la formule de la norme L2 fait intervenir une racine carré. Or primo, le calcul d'une racine carré est couteux, et secondo, trouver le x tel que f(x) soit le plus petit possible, c'est pareil que de trouver x tel que (f(x))**2 soit le plus petit possible (c'est équivalent, ca donne le même x, dans les cas où comme le notre, f est toujours positive). Pour ces 2 raisons, les algos d'optimisations optimisent toujours le carré d'une erreur.
    Voilà pourquoi j'ai appelé ma variable erreur2 (car c'est l'erreur au carré)

    Fort de ces remarques, si vous voulez calculer une erreur, il vous reste à prendre la racine carré de ce que vous venez de calculer.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/10/2013, 05h15
  2. Réponses: 5
    Dernier message: 02/07/2012, 09h12
  3. Tracer une courbe gracieuse entre 2 points ?
    Par supergrey dans le forum Mathématiques
    Réponses: 22
    Dernier message: 17/07/2009, 10h03
  4. Comment tracer une courbe chart avec valeurs dans fichier ?
    Par petitclem dans le forum C++Builder
    Réponses: 16
    Dernier message: 07/05/2008, 15h07
  5. une courbe avec des points
    Par Lost in dans le forum MATLAB
    Réponses: 3
    Dernier message: 17/03/2008, 17h48

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