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 :

Algorithmique & multiplications


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Algorithmique & multiplications
    Bonjour, mon post est un problème que je n'arrive pas à résoudre.

    J'ai 2 séries de nombres, en les multipliants entre-eux (1 d'une série multiplié avec 1 autre de l'autre série) doit me donner un nombre prédifini en résultat (ou s'en approcher le plus possible).

    Pour moi cela ressemble à de la combinaison, mais je ne trouve pas de solution à mon problème.

    Exemple de problème concret :

    SÉRIE 1 : 8 ; 14.5 ; 52 ; 100 ; 100 ; 100 ; 100 ; 4.6 ; 8 ; 29 ; 100 ; 100 ; 100 ; 5 ; 9 ; 32 ; 100 ; 100 ; 8.25 ; 14.75 ; 54 ; 100 ; 18.25 ; 33 ; 100 ; 50 ; 90 ; 100 ; 72

    SÉRIE 2 : 11.5 ; 12.75 ; 26 ; 78 ; 100 ; 100 ; 100 ; 6.75 ; 6.50 ; 14 ; 42 ; 100 ; 100 ; 7.25 ; 7.50 ; 14 ; 45 ; 100 ; 11.5 ; 11.75 ; 24 ; 68 ; 24 ; 25 ; 50 ; 64 ; 66 ; 100 ; 27

    Il faut que je trouve les couples pour ces séries qui font 188.5 ± 1.

    Il faudrait donc un algorithme qui calcule : 1er nombre de la série 1 × 1er nombre de la série 2, si c'est pas égal à 188.5±1 alors on continue, 1er nombre de la série 1 × 2ème nombre de la série 2 et à nouveau vérifier la condition, et ainsi de suite ...

    Désolé je n'arrive pas trop à expliquer ce que je veux, j'espère que c'est assez clair.

    À la fin il me faudrait les couples solutions de valeurs (nb série 1; nb série 2) qui donnent 188.5 ± 1.


    Voici un début de code qui ne fonctionne pas, en espérant que vous m'indiquiez mes erreurs et comment l'améliorer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    F1 = [8,14.5,52,100,100,100,100,4.6,8,29,100,100,100,5,9,32,100,100,8.25,14.75,54,100,18.25,33,100,50,90,100,72]
    F2 = [11.5,12.75,26,78,100,100,100,6.75,6.50,14,42,100,100,7.25,7.50,14,45,100,11.5,11.75,24,68,24,25,50,64,66,100,27]
     
     
    p=118.5   # résultat voulu 
    e=1   # incertitude 
     
    prod = [] 
    for i in range (0,len(F1)):
       for j in range (0,len(F2)): 
          if abs(p - F1(i) * F2(j)) <e :
              prod.append ((F1(i), F2(j))) 
    print (prod)
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par astronas Voir le message
    Voici un début de code qui ne fonctionne pas, en espérant que vous m'indiquiez mes erreurs et comment l'améliorer :
    Le code que vous avez posté doit planter ligne 11 avec un beau message d'erreur qui devrait déjà vous indiquer quoi corriger ou vous poser des questions sur comment accéder au i-ème élément d'une liste et ouvrir votre tuto. préféré aux chapitres qui vont bien pour revoir tout çà.

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

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    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
    F1 = [8,14.5,52,100,100,100,100,4.6,8,29,100,100,100,5,9,32,100,100,8.25,14.75,54,100,18.25,33,100,50,90,100,72]
    F2 = [11.5,12.75,26,78,100,100,100,6.75,6.50,14,42,100,100,7.25,7.50,14,45,100,11.5,11.75,24,68,24,25,50,64,66,100,27]
     
     
    p=118.5   # résultat voulu 
    e=1   # incertitude 
     
    prod = [] 
    for i in range (len(F1)):
        for j in range (len(F2)):
            res = F1[i]*F2[j]
            if abs(p-res) < e:
                prod.append((F1[i],F2[j]))
    print (prod)
    Pas d'aide par mp.

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    J'ai voulu voir jusqu'où on pouvais aller par curiosité (et c'est pas beau à voir )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> F1 = [8,14.5,52,100,100,100,100,4.6,8,29,100,100,100,5,9,32,100,100,8.25,14.75,54,100,18.25,33,100,50,90,100,72]
    >>> F2 = [11.5,12.75,26,78,100,100,100,6.75,6.50,14,42,100,100,7.25,7.50,14,45,100,11.5,11.75,24,68,24,25,50,64,66,100,27]
    >>> p = 118.5
    >>> e = 1
    >>> sum(([(a, b) for a in F1 if p-e <= a*b <= p+e] for b in F2), [])
    [(18.25, 6.5)]

    ça m'intrigue et je me demande s'il n'y a pas moyen d'utiliser numpy/scipy

  5. #5
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    si bien sûr que vous pouvez utiliser numpy. Votre code sera plus court et s'éxécutera plus rapidement.

    Mais bon si P1 et P2 ne font qu'une vingtaine de valeurs, vous ne verez pas vraiment la différence. Sur des milliers de valeurs, oui.

  6. #6
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    si bien sûr que vous pouvez utiliser numpy. Votre code sera plus court et s'éxécutera plus rapidement.

    Mais bon si P1 et P2 ne font qu'une vingtaine de valeurs, vous ne verez pas vraiment la différence. Sur des milliers de valeurs, oui.
    je pense que tu m'a confondu avec l'auteur du topic
    Sinon, difficile de faire plus court qu'une ligne

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    F1 = [8,14.5,52,100,100,100,100,4.6,8,29,100,100,100,5,9,32,100,100,8.25,14.75,54,100,18.25,33,100,50,90,100,72]
    F2 = [11.5,12.75,26,78,100,100,100,6.75,6.50,14,42,100,100,7.25,7.50,14,45,100,11.5,11.75,24,68,24,25,50,64,66,100,27]
     
    for x in F1:
        for y in F2:
            if 188.5-1<=x*y<=188.5+1:
                print([x, y])
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [29, 6.5]
    [14.75, 12.75]
    Et en une ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print([[x, y] for x in F1 for y in F2 if 188.5-1<=x*y<=188.5+1])
    qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[29, 6.5], [14.75, 12.75]]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Citation Envoyé par tyrtamos Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print([[x, y] for x in F1 for y in F2 if 188.5-1<=x*y<=188.5+1])
    qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[29, 6.5], [14.75, 12.75]]
    J'ai cru que je m'était planté mais non p vaut bien 118.5 et non 188.5
    edit: en faite c'est l'auteur qui s'est planté entre son explication et son code, on a qu'a dire qu'on a tous les deux raison

    par curiosité j'ai voulu voir si les perfs étaient raisonnables:

    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
    >>> import timeit
    >>> import numpy
     
    >>> a = numpy.random.rand(10000)*100
    >>> b = numpy.random.rand(10000)*100
    >>> p = 118.5
    >>> e = 1
     
    >>> def t1():
    	return sum(([(x, y) for x in a if p-e <= x*y <= p+e] for y in b), [])
     
    >>> def t2():
    	return [[x, y] for x in a for y in b if p-e <=x*y<= p+e]
     
    >>> timeit.timeit(t1, number=1)
    54.252527317000045
     
    >>> timeit.timeit(t2, number=1)
    50.68921082600002
    Je m'avoue vaincu

    Maintenant je me demande vraiment s'il y a moyen d'utiliser numpy pour ça ? peu être avec un numpy.outer puis parcourir l'array 2D et si la valeurs est dans l'intervalle on affiche F1[i],F2[j] où i et j sont respectivement les indices de l'array 2D

    edit 2: je doit être mauvais avec numpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def t3():
    	return [i for i, x in numpy.ndenumerate(numpy.outer(a, b)) if p-e <= x <= p+e]
     
    >>> timeit.timeit(t3, number=1)
    82.1113105259999

  9. #9
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Non en numpy ce sera plutot qqch comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def t4():
         return np.where( np.abs(np.outer(a,b)-p)<=e )
    A noter que ta fonction t3, et ma fonction t4, ne retourne pas les couple de valeur à multiplier, mais les indices pour retrouver les couples dans les tableaux. Pour obtenir les couples on pourrait faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    F1 = np.array(a)
    F2 = np.array(b)
    def t5():  ### Bon ok, c'est en 2 lignes... Il faut bien factoriser le calcul de idxs !
         idxs = np.where( np.abs(np.outer(F1,F2)-p)<=e )
         return list(zip( F1[idxs[0]], F2[idxs[1]] ))
    C'est 10 fois plus rapide chez moi.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses tout le monde. Bonne fin de semaine à tous

    P.S : je me suis bien planté dans le code, p est bien égal à 188.5 et non 118.5

Discussions similaires

  1. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  2. logiciel de programmation en Algorithmique
    Par Thomas Lebrun dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 08/11/2002, 22h18
  3. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  4. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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