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 :

Estimation moindres carrés


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut Estimation moindres carrés
    Bonjour,
    Je cherche à approcher les coefficients a0, a1 et a2 de l'équation:
    Cd = a0 + a1 * Cl^2 + a2 * Cl^4
    par la méthode des moindres carrés.
    Voilà mon 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    from numpy import random,dot
    import numpy
    from scipy.optimize import leastsq
     
    'Creation des tableaux'
    nombre=7
    altitude=[]
    Cd=[]
    Cl=[]
    Cd_estime=[]
    altitude_Cl_Cd=[]
    a=1
     
    while a != nombre:
        altitude.append(a)
        Cd.append(a)
        Cl.append(a)
        Cd_estime.append(a)
        altitude_Cl_Cd.append(a)
        a+=1
     
    altitude= [28000.0, 30000.0, 32000.0, 34000.0, 36000.0, 38000.0]
    Cd = [0.02395, 0.02408, 0.02421, 0.02434, 0.02447, 0.02467]
    Cl=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
     
    def func2(cl,p):
        a0,a1,a2 = p
        return a0 + a1 * cl**2 + a2 * cl**4
     
    def residuals(p):
        return [cd - func2(cl,p) for cd,cl in zip(Cd,Cl)]
     
    plsq, ler = leastsq(residuals, x0=[1]*6)
    print ('plsq : \n' , plsq)
     
    Cd_estime = [func2(cl,plsq) for cl in zip(Cl)]
    print ('Cd_estime: \n' , Cd_estime)
    Mais j'obtiens le message d'erreurs suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Traceback (most recent call last):
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 106, in <module>
        plsq, ler = leastsq(residuals, x0=[1]*6)
      File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 369, in leastsq
        shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
      File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 20, in _check_func
        res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 104, in residuals
        return [cd - func2(cl,p) for cd,cl in zip(Cd,Cl)]
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 100, in func2
        a0,a1,a2 = p
    ValueError: too many values to unpack
    Pourriez-vous m'aider s'il vous plait ? Merci !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par OSS117double1_7 Voir le message
    Bonjour,
    Je cherche à approcher les coefficients a0, a1 et a2 de l'équation:
    Cd = a0 + a1 * Cl^2 + a2 * Cl^4
    par la méthode des moindres carrés.

    Mais j'obtiens le message d'erreurs suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Traceback (most recent call last):
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 106, in <module>
        plsq, ler = leastsq(residuals, x0=[1]*6)
      File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 369, in leastsq
        shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
      File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 20, in _check_func
        res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 104, in residuals
        return [cd - func2(cl,p) for cd,cl in zip(Cd,Cl)]
      File "C:/Users/Mathilde/Desktop/Python/Calcul_Cd.py", line 100, in func2
        a0,a1,a2 = p
    ValueError: too many values to unpack
    Pourriez-vous m'aider s'il vous plait ? Merci !
    Bonjour,

    Too many values to unpack signifie en général que vous tentez d'extraire d'une liste ou d'un tuple moins d'éléments qu'ils n'en contiennent.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste = [1,2,3]
    x,y,z = liste # c'est bon 3 éléments pour 3 variables
    x,y = liste # 2 variables, 3 éléments => too many values to unpack
    De plus, en lisant votre code en diagonale, j'ai vu que écriviez :

    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
    nombre=7
    altitude=[]
    Cd=[]
    Cl=[]
    Cd_estime=[]
    altitude_Cl_Cd=[]
    a=1
     
    while a != nombre:
        altitude.append(a)
        Cd.append(a)
        Cl.append(a)
        Cd_estime.append(a)
        altitude_Cl_Cd.append(a)
        a+=1
     
    altitude= [28000.0, 30000.0, 32000.0, 34000.0, 36000.0, 38000.0]
    Cd = [0.02395, 0.02408, 0.02421, 0.02434, 0.02447, 0.02467]
    Cl=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
    A quoi vous sert cette boucle while (qui par ailleurs peut se remplacer par for a in range(nombre):) si tout de suite après vous redéfinissez altitude, Cd et Cl ?

    @+.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Plus globalement, votre code pourrait se résumer à ceci :

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from scipy.optimize import leastsq
     
    # Creation des tableaux
    altitude = [28000.0, 30000.0, 32000.0, 34000.0, 36000.0, 38000.0]
    Cd = [0.02395, 0.02408, 0.02421, 0.02434, 0.02447, 0.02467]
    Cl = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
    Cd_estime = [0] * len(Cd)
    #~ altitude_Cl_Cd = [0] * len(altitude)
     
    def func2 (cl, p):
        #~ print "p:", p
        a0, a1, a2 = p
        return a0 + a1 * cl**2 + a2 * cl**4
     
    def residuals (p):
        return [cd - func2(cl, p) for cd, cl in zip(Cd, Cl)]
     
    # il fallait initialiser x0 avec 3 éléments seulement !
    plsq, ler = leastsq(residuals, x0=[1]*3)
    print 'plsq : \n' , plsq
     
    Cd_estime = [func2(cl, plsq) for cl in Cl]
    print 'Cd_estime: \n' , Cd_estime
    Prenez le temps de lire la doc officielle Python :

    https://docs.python.org/2.7/library/functions.html#zip

    https://docs.python.org/2.7/library/....html#typesseq

    https://docs.python.org/2.7/library/...sequence-types

    + ceci : http://fgallaire.flext.net/comprehen...on-map-filter/ EDIT: pas vraiment super utile.

    @+.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Plus globalement, votre code pourrait se résumer à ceci :

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from scipy.optimize import leastsq
     
    # Creation des tableaux
    altitude = [28000.0, 30000.0, 32000.0, 34000.0, 36000.0, 38000.0]
    Cd = [0.02395, 0.02408, 0.02421, 0.02434, 0.02447, 0.02467]
    Cl = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
    Cd_estime = [0] * len(Cd)
    #~ altitude_Cl_Cd = [0] * len(altitude)
     
    def func2 (cl, p):
        #~ print "p:", p
        a0, a1, a2 = p
        return a0 + a1 * cl**2 + a2 * cl**4
     
    def residuals (p):
        return [cd - func2(cl, p) for cd, cl in zip(Cd, Cl)]
     
    # il fallait initialiser x0 avec 3 éléments seulement !
    plsq, ler = leastsq(residuals, x0=[1]*3)
    print 'plsq : \n' , plsq
     
    Cd_estime = [func2(cl, plsq) for cl in Cl]
    print 'Cd_estime: \n' , Cd_estime
    Prenez le temps de lire la doc officielle Python :

    https://docs.python.org/2.7/library/functions.html#zip

    https://docs.python.org/2.7/library/....html#typesseq

    https://docs.python.org/2.7/library/...sequence-types

    + ceci : http://fgallaire.flext.net/comprehen...on-map-filter/ EDIT: pas vraiment super utile.

    @+.
    Merci beaucup, ça fonctionne bien !
    Il me sort bien les 3 valeurs des coefficients mais il me met malgré tout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ('plsq : \n', array([ 0.30000021, -0.0007085 ,  0.59877856]))
     
    Traceback (most recent call last):
      File "C:\Users\Mathilde\Desktop\Python\Calcul_Cd.py", line 110, in <module>
        Cd_estime = [func2(cl,plsq) for cl in zip(Cl)]
      File "C:\Users\Mathilde\Desktop\Python\Calcul_Cd.py", line 102, in func2
        return a0 + a1 * cl**2 + a2 * cl**4
    TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par OSS117double1_7 Voir le message
    Merci beaucup, ça fonctionne bien !
    Il me sort bien les 3 valeurs des coefficients mais il me met malgré tout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ('plsq : \n', array([ 0.30000021, -0.0007085 ,  0.59877856]))
     
    Traceback (most recent call last):
      File "C:\Users\Mathilde\Desktop\Python\Calcul_Cd.py", line 110, in <module>
        Cd_estime = [func2(cl,plsq) for cl in zip(Cl)]
      File "C:\Users\Mathilde\Desktop\Python\Calcul_Cd.py", line 102, in func2
        return a0 + a1 * cl**2 + a2 * cl**4
    TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'
    Parce que ce n'est pas for cl in zip(Cl) mais for cl in Cl : regardez bien dans le code que j'ai publié.

    @+.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Parce que ce n'est pas for cl in zip(Cl) mais for cl in Cl : regardez bien dans le code que j'ai publié.

    @+.
    Oui oui en effet , je n'avais pas fait attention ! C'est parfait: merci beaucoup de travailler à temps plein pour m'aider

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Bonjour,

    Too many values to unpack signifie en général que vous tentez d'extraire d'une liste ou d'un tuple moins d'éléments qu'ils n'en contiennent.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste = [1,2,3]
    x,y,z = liste # c'est bon 3 éléments pour 3 variables
    x,y = liste # 2 variables, 3 éléments => too many values to unpack
    De plus, en lisant votre code en diagonale, j'ai vu que écriviez :

    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
    nombre=7
    altitude=[]
    Cd=[]
    Cl=[]
    Cd_estime=[]
    altitude_Cl_Cd=[]
    a=1
     
    while a != nombre:
        altitude.append(a)
        Cd.append(a)
        Cl.append(a)
        Cd_estime.append(a)
        altitude_Cl_Cd.append(a)
        a+=1
     
    altitude= [28000.0, 30000.0, 32000.0, 34000.0, 36000.0, 38000.0]
    Cd = [0.02395, 0.02408, 0.02421, 0.02434, 0.02447, 0.02467]
    Cl=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
    A quoi vous sert cette boucle while (qui par ailleurs peut se remplacer par for a in range(nombre):) si tout de suite après vous redéfinissez altitude, Cd et Cl ?

    @+.
    Oui, en fait j'avais toute la boucle parce que les valeurs d'altitude, de Cd et Cl, je les obitens grâce à un code (que je ne vous ai pas mis ici). Il ne faut donc pas tenir compte de ça..

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

Discussions similaires

  1. Estimation moindres carrés - validation
    Par OSS117double1_7 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 09/06/2014, 13h10
  2. Estimation moindres carrés
    Par OSS117double1_7 dans le forum Calcul scientifique
    Réponses: 13
    Dernier message: 30/05/2014, 12h37
  3. Réponses: 2
    Dernier message: 24/12/2011, 10h46
  4. Points 3D estimés par moindre carrés
    Par Niagara22 dans le forum Mathématiques
    Réponses: 0
    Dernier message: 02/03/2010, 10h18
  5. Réponses: 2
    Dernier message: 27/01/2009, 11h05

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