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 :

Une des conditions qui génére un message d'erreur


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut Une des conditions qui génére un message d'erreur
    Bonjour.

    J'ai écrit un petit programme de calcul de profondeur de champ (photographie) et il y a un problème que je ne parviens pas à résoudre (je suis débutant) :

    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
    f = int(input('Focale (mm) :'))
    N = float(input('Ouverture :'))
    c = float(input('Cercle de confusion (mm) :'))
    p = float(input('Distance de mise au point (m) :'))
     
    H = (f**2/(N*c)+f)/1000
    print('Hyperfocale (m) :',round(H, 2))
     
    h = H/2
    print('Demie hyperfocale (m) :',round(h, 2))
     
    p1 = ((p*1000)*f**2/(f**2+N*c*((p*1000)-f)))/1000
    print('Premier plan net (m) :',round(p1, 2))
     
    if ((p*1000)*f**2/(f**2-N*c*((p*1000)-f)))/1000<=0:
    	print('Dernier plan net (m) :', 'Infini')
    else:
    	p2 = ((p*1000)*f**2/(f**2-N*c*((p*1000)-f)))/1000
    print('Dernier plan net (m) :',round(p2, 2))
     
    if p2 == 'Infini':
    	print('Profondeur de champ (m) :','Non applicable')
    else:
    	pdc = p2-p1
    print('Profondeur de champ (m) :',round(pdc, 2))
     
    pdc1 = p-p1
    print('Profondeur de champ avant (m) :',round(pdc1, 2))
     
    if p2 == 'Infini':
    	print('Profondeur de champ arrière (m) :','Infini')
    else:
    	pdc2 = p2-p
    print('Profondeur de champ arrière (m) :',round(pdc2, 2))
     
    if pdc1 == 'Non applicable':
    	print('Ratio avant (%) :','')
    else:
    	r1 = (pdc1/pdc)*100
    print('Ratio avant (%) :',round(r1, 2))
     
    if r1 == '':
    	print('Ratio arrière (%) :','')
    else:
    	r2 = (pdc2/pdc)*100
    print('Ratio arrière (%) :',round(r2, 2))
     
    pdf = 2*N*c
    print('Profondeur de foyer (mm) :',round(pdf ,3))
    C'est à partir de la ligne 15 que ça plante lorsque le résultat est inférieur ou égal à zéro (dans le cas contraire le programme s'exécute normalement) ; j'ai dû mal formater quelque part : NameError; name 'p2" is not defined

    Éclaircissement : le dernier plan net (ou la profondeur de champ) ne peut pas être négatif. Selon la focale (f), l'ouverture (N), le cercle de confusion (c) et la distance de mise au point (p), ces valeurs sont calculées en mètres et une valeur négative signifiera qu'elle est infinie. C'est pour cette raison que j'ai mis des conditions.

    Merci du coup de main.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Avec Python, une variable ne sera définie qu'après lui avoir assigné un objet quelconque (ie exécuté l'instruction p2 = ...)
    Dans votre code, on assigne quelque chose à p2 à la ligne 18 mais si on n'y passe pas, on se retrouve ligne 21 à récupérer p2 qui n'est pas définit d'où le NameError.

    Pour débuter, il y a des tutos et des exercices souvent corrigés pour vous entraîner... réaliser un petit projet, c'est montrer que vous savez faire quelque chose avec tout ce que vous y aurez appris (dans le tuto. s'entend).


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Je modifie le message que je viens de poster, car je crois que j'ai trouvé :

    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
    f = int(input('Focale (mm) :'))
    N = float(input('Ouverture :'))
    c = float(input('Cercle de confusion (mm) :'))
    p = float(input('Distance de mise au point (m) :'))
     
    H = float((f**2/(N*c)+f)/1000)
    h = float(H/2)
    p1 = float(((p*1000)*f**2/(f**2+N*c*((p*1000)-f)))/1000)
    p2 = float(((p*1000)*f**2/(f**2-N*c*((p*1000)-f)))/1000)
    pdc = float(p2-p1)
    pdc1 = float(p-p1)
    pdc2 = float(p2-p)
    r1 = float((pdc1/pdc)*100)
    r2 = float((pdc2/pdc)*100)
    pdf = float(2*N*c)
    inf = str('Infini')
    nap = str('Non applicable')
     
    print('Hyperfocale :',round(H, 2), 'm')
     
    print('Demie hyperfocale :',round(h, 2), 'm')
     
    print('Premier plan net :',round(p1, 2), 'm')
     
    if p2 <= 0:
    	print('Dernier plan net :', inf)
    else:
    	print('Dernier plan net :',round(p2, 2), 'm')
     
    if p2 <= 0:
    	print('Profondeur de champ :',nap)
    else:
    	print('Profondeur de champ :',round(pdc, 2), 'm')
     
    print('Profondeur de champ avant :',round(pdc1, 2), 'm')
     
    if p2 <= 0:
    	print('Profondeur de champ arrière :',inf)
    else:	
    	print('Profondeur de champ arrière :',round(pdc2, 2), 'm')
     
    if p2 <= 0:
    	print('Ratio avant :',nap)
    else:
    	print('Ratio avant :',round(r1, 2), '%')
     
    if p2 <= 0:
    	print('Ratio arrière :',nap)
    else:
    	print('Ratio arrière :',round(r2, 2), '%')
     
    print('Profondeur de foyer :',round(pdf ,3), 'mm')
    Je ne sais pas si c'est la bonne méthode mais ça fonctionne. Tout part de p2 <= 0 ; j'ai donc soumis chaque calcul suivant à cette condition...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Nerva Voir le message
    Je ne sais pas si c'est la bonne méthode mais ça fonctionne.
    Ah ben si çà fonctionne!

    Le résultat d'une opération entre 2 nombres sera un nombre...
    Inutile de forcer les f**2/(N*c)+f)/1000 a être un float...

    'Infini' est une chaîne de caractère littérale, inutile de lui appliquer str(...).

    A quoi sert la cascade de if p2 <= 0... else... un seul test avec les affichages correspondants dans le même bloc d'instructions aurait le même rendu côté affichage (et vous auriez écrit moins de lignes de code).

    Ouvrez un tuto. apprenez les bases, vous produiriez un bien meilleur code... Et si vous ne voulez pas apprendre pas la peine de vous inquiéter pour "la bonne méthode"...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Effectivement...

    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
    f = int(input('Focale (mm) :'))
    N = float(input('Ouverture (N) :'))
    c = float(input('Cercle de confusion (mm) :'))
    p = float(input('Distance de mise au point (m) :'))
     
    H = (f**2/(N*c)+f)/1000
    h = H/2
    p1 = ((p*1000)*f**2/(f**2+N*c*((p*1000)-f)))/1000
    p2 = ((p*1000)*f**2/(f**2-N*c*((p*1000)-f)))/1000
    pdc = p2-p1
    pdc1 = p-p1
    pdc2 = p2-p
    r1 = (pdc1/pdc)*100
    r2 = (pdc2/pdc)*100
    pdf = 2*N*c
    inf = 'Infini'
    nap = 'Non applicable'
     
    print('Hyperfocale :',round(H, 2), 'm')
     
    print('Demie hyperfocale :',round(h, 2), 'm')
     
    print('Premier plan net :',round(p1, 2), 'm')
     
    if p2 <= 0:
    	print('Dernier plan net :', inf)
    	print('Profondeur de champ :',nap)
    	print('Profondeur de champ avant :',round(pdc1, 2), 'm')
    	print('Profondeur de champ arrière :',inf)
    	print('Ratio avant :',nap)
    	print('Ratio arrière :',nap)
    else:
    	print('Dernier plan net :',round(p2, 2), 'm')
    	print('Profondeur de champ :',round(pdc, 2), 'm')
    	print('Profondeur de champ avant :',round(pdc1, 2), 'm')
    	print('Profondeur de champ arrière :',round(pdc2, 2), 'm')
    	print('Ratio avant :',round(r1, 2), '%')
    	print('Ratio arrière :',round(r2, 2), '%')
     
    print('Profondeur de foyer :',round(pdf ,3), 'mm')

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

Discussions similaires

  1. Insérer une requête php dans une fonction javascript qui génère des lignes
    Par madinadiouf dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/11/2019, 18h18
  2. Recherche une simple API qui génére des graphiques simples ?
    Par clavier12AZQSWX dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 03/10/2013, 22h40
  3. [GD] gd génère un message d'erreur
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 28/07/2007, 00h29
  4. Exécution d'une requête SQL qui affiche un message
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/11/2006, 16h15
  5. [VB.NET] Mon dataset me génère un message d'erreur
    Par Herlece dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/04/2006, 13h56

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