Partage
  • Partager sur Facebook
  • Partager sur Twitter

suite, somme, factorielle

Sujet résolu
    6 décembre 2015 à 14:37:49

    Bonjour, 

    Je dois écrire un programme pour cet exercice, il n'est pas facile et je rencontre quelques difficultés.

    Je teste le programme mais, il donne des résultats aberants, totalement absurdes. Je crois que j'ai trouvé le probleme mais je ne sais pas comment le résoudre. En faite, je ne me sers pas de la somme des termes et j'avais aussi essayer avec la definition de plusieurs fonction, mais ca ne fonctionne pas : définir une fonction factorielle, une fonction pour Un, une fonction de sommation des Un Sn.


    Merci de votre aide,
    Cordialement,

    Voici mon code : 


    def SommeS(n,p):
        S=0.
        for k in range (1,n+1): #expression de la somme S
            for i in range (1,n+1): #calcul de n!
                N=n*i
            for j in range (1,n+1): #calcul de p!
                P=p*j
            for a in range (1,n+1): #calcul de (n+p)!
                Z=(n+p)*a
            k=N*P/Z #calcul de Un
            S+=k
        return S



    -
    Edité par biker75 7 décembre 2015 à 20:34:35

    • Partager sur Facebook
    • Partager sur Twitter
      6 décembre 2015 à 15:38:42

      Base de départ pour l'algorithme :

      def SommeS(n,p):
          n_p=n+p
          P=1
          N=1
          Z=1
          for i in range (1,n+1): #calcul de n!
              N=N*(i)
          print ("Factorielle de n! :",N)
          for j in range (1,p+1): #calcul de p!
              P=P*j
          print ("Factorielle de p! :",P)
          for a in range (1,n_p+1): #calcul de (n+p)!
              Z=Z*(a)
          print ("Factorielle de n+p! :",Z)
          Un =1/(Z/(P*N))#Calcul de Un
          print("Valeur de Un",Un)
          

      Pour la suite il faut bien voir que ta sommes est indépendante de ton terme en p (donc p est fixé)

      Finalement on a :

      def SommeS(n,p):
          Sn=0
          for k in range(1,n+1):
              n_p=k+p
              P=1#Le premier terme de la factoriel de p ... (pour exemple 5! = 1x2x3x4x5)
              N=1#Le premier terme de la factoriel de n
              Z=1#Le premier terme de la factoriel de n+p
              for i in range (1,k+1): #calcul de n!
                  N=N*(i)
              print ("Factorielle de n! :",N)
              for j in range (1,p+1): #calcul de p!
                  P=P*j
              print ("Factorielle de p! :",P)
              for a in range (1,n_p+1): #calcul de (n+p)!
                  Z=Z*(a)
              print ("Factorielle de n+p! :",Z)
              Sn =Sn+1/(Z/(P*N)) #Calcul de Sn
              #J'aurais aussi pu écrire :
              #Uk = 1/(Z/(P*N))
              #Sn +=Uk
              print("Valeur de Sn : ",Sn)

      Finalement on a :

      def SommeS(n,p):
          Sn=0
          for k in range(1,n+1):
              n_p=k+p
              P=1#Le premier terme de la factoriel de p ... (pour exemple 5! = 1x2x3x4x5)
              N=1#Le premier terme de la factoriel de n
              Z=1#Le premier terme de la factoriel de n+p
              for i in range (1,k+1): #calcul de n!
                  N=N*(i)
              for j in range (1,p+1): #calcul de p!
                  P=P*j
              for a in range (1,n_p+1): #calcul de (n+p)!
                  Z=Z*(a)
              Sn =Sn+1/(Z/(P*N)) #Calcul de Sn
      #        J'aurais aussi pu écrire :
      #        Uk = 1/(Z/(P*N))
      #        Sn +=Uk
          return Sn


      et enfin pour afficher tes résultats :

      for p in range(2,3+1):
          for n in range(10,50+10,10):
              print("Sn pour p=",p," et pour n=",n," ==> ",SommeS(n,p))

      Et tu obtient :

      Sn pour p= 2  et pour n= 10  ==>  0.8333333333333333
      Sn pour p= 2  et pour n= 20  ==>  0.9090909090909087
      Sn pour p= 2  et pour n= 30  ==>  0.9374999999999998
      Sn pour p= 2  et pour n= 40  ==>  0.9523809523809522
      Sn pour p= 2  et pour n= 50  ==>  0.9615384615384613
      Sn pour p= 3  et pour n= 10  ==>  0.4807692307692307
      Sn pour p= 3  et pour n= 20  ==>  0.49407114624505916
      Sn pour p= 3  et pour n= 30  ==>  0.4971590909090908
      Sn pour p= 3  et pour n= 40  ==>  0.4983388704318936
      Sn pour p= 3  et pour n= 50  ==>  0.4989114658925978




      (Pour calculer (n,k) j'utilise la formule du coefficient binomiale)

      -
      Edité par Kasimashi 6 décembre 2015 à 15:58:50

      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2015 à 16:16:22

        Bonjour, votre programme est juste, je le comprends totalement, j'en avais écris un aussi comme ca.

        Le seul probleme, et pas des moindres, c'est que le programme m'affiche toujours 0, aussi bien pour Un que Sn. Sauf, si je calcul 1/Un, il m'affiche bien la bonne valeur. Donc j'ai trouvé que c'est un problème de virgule flottante, il ne m'affiche que les entiers, et vu que Un est tres petit, il tronque et affiche 0. J'ai alors essayé de rentrer les paramètres n et p avec des virgules exemple : n = 10. et p = 2.

        Mais une erreur s'affiche, puisque python travail avec des entiers pour les incrémentations dans les boucles.

        Comment je peux résoudre ca ?

        Peut etre qu'il faut que je charge le module de math, mais c'est déja fait donc pas trop utile :/

        Je vois bien que votre programme affiche les bons résultats, merci du coup de pouce :)

        Quand je copie le votre j'obtient ca :

        ('Sn pour p=', 2, ' et pour n=', 10, ' ==> ', 0)
        ('Sn pour p=', 2, ' et pour n=', 20, ' ==> ', 0L)
        ('Sn pour p=', 2, ' et pour n=', 30, ' ==> ', 0L)
        ('Sn pour p=', 2, ' et pour n=', 40, ' ==> ', 0L)
        ('Sn pour p=', 2, ' et pour n=', 50, ' ==> ', 0L)
        ('Sn pour p=', 3, ' et pour n=', 10, ' ==> ', 0)
        ('Sn pour p=', 3, ' et pour n=', 20, ' ==> ', 0L)
        ('Sn pour p=', 3, ' et pour n=', 30, ' ==> ', 0L)
        ('Sn pour p=', 3, ' et pour n=', 40, ' ==> ', 0L)
        ('Sn pour p=', 3, ' et pour n=', 50, ' ==> ', 0L)



        Voici l'autre programme que j'avais écris, qui utilise différentes fonctions, il affiche aussi 0 à cause du même problème.

        def fact(n):
            F=1.
            for i in range (1,n+1):
                F*=i
            return F
        
        def U(n,p):
            N = fact(n)
            P = fact(p)
            NP = fact(n+p)
            U = (N*P)/NP
            return U
        
        def S(n,p):
            S=0
            for k in range (0,n+1):
                S+=U(k,p)
            return S



        Merci,

        Cordialement,

        -
        Edité par biker75 7 décembre 2015 à 20:34:58

        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2015 à 16:33:06

          Avec quel version de python travaillez vous?
          • Partager sur Facebook
          • Partager sur Twitter
            6 décembre 2015 à 16:34:04

            Avec python 2.7.10

            -
            Edité par biker75 7 décembre 2015 à 20:35:12

            • Partager sur Facebook
            • Partager sur Twitter
              6 décembre 2015 à 16:47:39

              Personnellement je suis avec une version 3. aucun problème ...

              En effet les boucles for n'accepte que des entiers vous pouvez néanmoins remédier au problème avec une boucle while ...

              en utilisant cette forme :

              count=0
              N=1
              while count<5:
                  count+=1
                  N=N*count
              print(N)



              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2015 à 16:55:38

                Essayer ceci :

                def SommeS(n,p):
                    Sn=0
                    k=0
                    while k<n:
                        k+=1    
                        n_p=k+p
                        P=1#Le premier terme de la factoriel de p ... (pour exemple 5! = 1x2x3x4x5)
                        N=1#Le premier terme de la factoriel de n
                        Z=1#Le premier terme de la factoriel de n+p
                        i=0
                        while i<k:
                            i+=1
                            N*=i
                        print ("Factorielle de n! :",N)
                        j=0
                        while j<p:
                            j+=1
                            P*=j
                        print ("Factorielle de p! :",P)
                        a=0
                        while a<n_p:
                            a+=1
                            Z*=a
                        print ("Factorielle de n+p! :",Z)
                        Sn =Sn+1/(Z/(P*N)) #Calcul de Sn
                #        J'aurais aussi pu écrire :
                #        Uk = 1/(Z/(P*N))
                #        Sn +=Uk
                        print("Valeur de Sn : ",Sn)
                    
                



                -
                Edité par Kasimashi 6 décembre 2015 à 16:57:38

                • Partager sur Facebook
                • Partager sur Twitter
                  6 décembre 2015 à 17:02:00

                  Aussi si vous souhaitez tracer les courbes correspondantes : pour une valeur de p fixé voila un début d'algorithme :)

                  Je m’entraîne aussi car j'ai bientôt un DS d'informatique :p

                  import numpy as np
                  import matplotlib.pyplot as plt
                  a=[]
                  b=[]
                  p=2
                  for n in range(10,50+1):
                      print("Sn pour p=",p," et pour n=",n," ==> ",SommeS(n,p))
                      a.append(SommeS(n,p))
                      b.append(n)
                  
                  x = np.array(b)
                  y = np.array(a)
                  plt.plot(x, y)
                  plt.xlabel("n")
                  plt.ylabel("Sn")
                  plt.title(r'$Sn = \sum_{k=1}^n U_k $ Calcul pour p=2')
                  plt.show() # affiche la figure a l'ecran
                  

                  Ceci donne :

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 décembre 2015 à 17:37:53

                    Mon programme fonctionne !! 

                    Je ne sais pas pourquoi ! il m'affiche les bons résultats d'un coup ! 

                    Parfait ! 

                    Et super les graphiques, on voit bien que la limite de Sn correspond à 1/(p-1) :

                    p=2 => lim Sn = 1

                    p=3 => lim Sn = 1/2 

                    Merci de ton aide ! 

                    Bonne continuation :) 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 décembre 2015 à 18:31:26

                      Au plaisir ! :)

                      Le programme en plus fonctionnel donne :

                      def fact(x):
                          fact=1
                          i=0
                          while i<x:
                              i+=1
                              fact*=i
                          return fact
                          
                      def SommeS(n,p):
                          Sn=0
                          k=0
                          while k<n:
                              k+=1   
                              N= fact(k)
                              P=fact(p)
                              Z=fact(k+p)
                              Sn =Sn+1/(Z/(P*N))
                          return Sn



                      -
                      Edité par Kasimashi 6 décembre 2015 à 18:33:40

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        6 décembre 2015 à 18:46:54

                        def fact(x):
                            fact=1
                            i=0
                            while i<x:
                                i+=1
                                fact*=i
                            return fact

                        On pourrait simplifier un tout petit peu (gain d'une ligne) par

                        def fact(x):
                            acc = 1
                            while x >= 2:
                                acc *= x
                                x -= 1
                            return acc



                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 décembre 2015 à 18:52:56

                          oldProgrammer a écrit:

                          On pourrait simplifier un tout petit peu (gain d'une ligne) par

                          def fact(x):
                              acc = 1
                              while x >= 2:
                                  acc *= x
                                  x -= 1
                              return acc

                          Bien à savoir mais je ne comprend pas trop cette ligne pourrais tu développer? :p
                          while x >= 2:

                          En faites tu pars du principe que 1x2x3x...xn = nx(n-1)x...x3x2x1
                          Mais pourquoi tu met un 2? :p

                          C'est bon j'ai compris ... parce que à la dernière boucle x1 ne sert à rien :p

                          Merci pour l'astuce :p

                          -
                          Edité par Kasimashi 6 décembre 2015 à 19:05:46

                          • Partager sur Facebook
                          • Partager sur Twitter

                          suite, somme, factorielle

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown