Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème mathématique appliqué

    31 mars 2021 à 17:44:17

    Bonjour,

    Pour une application pratique je cherche à réaliser un calcul un peu particulier, mais je peine à trouver une formule correcte, celle ci étant sans doute bien plus complexe que je ne peux même l'imaginer.

    Voici mon cas :

    -J'ai une série de valeurs précises :  1 / 1,5 / 2,5 / 10 / 25 / 30
    -J'aurais voulu savoir si il y a moyen de trouver "une formule" qui permet de réduire toutes ces valeurs de façons proportionnelles. Disons que je souhaite que l'écart entre ces valeurs reste le même et qu'à la fin, par exemple, 30 = 4.
    -La ou cela se complique est que, cette réduction étant très très grande, il ne faudrait néanmoins pas que la valeur la plus faible (1) disparaisse ou presque... Ainsi si à la fin 30 = 4, je voudrais aussi que 1 = 0,8. J'imagine que vous voyez l'idée... avec mes faibles connaissances en math j'imagine qu'il faudrait une formule de type exponentielle : plus la valeur de "base" est importante, plus elle se réduit vite à travers le calcul.

    Quelqu'un pourrait-il m'éclairer/m'aider en ce sens ?
    Je vous remercie d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2021 à 20:19:39

      Bonjour ! Je crois avoir compris...

      [Finalement j'efface tout car je n'avais pas compris !]

      -
      Edité par robun 1 avril 2021 à 10:27:59

      • Partager sur Facebook
      • Partager sur Twitter
        1 avril 2021 à 2:09:17

        Si ta suite est exactement ce que tu donnes:
        1, 1.5, 2.5, 10, 25, 30
        elle n'est ni une suite arithmétique, ni une suite géométrique
        elle ne pourrait pas être une suite logarithmique non plus.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          1 avril 2021 à 10:08:23

          Ici, ta question dit : 6 valeurs (1, 1.5, 2.5, 10, 25, 30), 2 valeurs cibles (1 ->0.8  30 ->4 ) .. comment faire ?

          Dans sa solution, Robun traite : 2 valeurs cibles (1 ->0.8  30 ->4 ) .. comment faire ?

          Dans tes 6 valeurs, on a une concentration de 3 points vers 1, 1.5 et 2.5  .. puis un grand saut de 2.5 à 10, puis un nouveau grand saut de 10 à 25 et un petit pas de 25 à 30. Est-ce que la solution finale doit refléter tout ça ? 

          Si tu avais donné comme énoncé : 6 valeurs (1, 2.5, 6, 10, 25, 30), 2 valeurs cibles (1 ->0.8  30 ->4 ) .. comment faire ?

          Est-ce que ça changeait quelque chose au film ?

          • Partager sur Facebook
          • Partager sur Twitter
            1 avril 2021 à 10:27:33

            Pierrot : justement, Heimesque veut la modifier (« réduire toutes ces valeurs de façons proportionnelles ») Mais ce n'est pas très clair, et je crois aujourd'hui que je n'avais pas compris hier...

            Ce qu'il veut, je crois, c'est partir de 1 / 1,5 / 2,5 / 10 / 25 / 30 et aboutir à 0.8 / \(a_1\) / \(a_2\) / \(a_3\) / \(a_4\) / 4 en ayant pour les valeurs intermédiaires des écarts (je dirais plutôt des coefficients multiplicatifs) proportionnels à ceux de la première liste. (Hier je croyais que les coefficients devaient être les mêmes d'un terme à l'autre, d'où la suite géométrique, mais après relecture je crois que ce n'est pas ça.)

            Exemple :

            • Dans la 1ère liste on a un coefficient de 1,5 au début (1 à 1,5) et un coefficient 30 au total (1 à 30).
            • Dans la 2ème liste, on veut avoir un coefficient 5 au total (0.8 à 4), donc 6 fois plus petit. Est-ce à dire qu'il faut un coefficient 0.25 au début ? Non, ça donnerait un terme suivant plus petit. Il faut utiliser des puissances. On cherche x tel que \( 5 = 30^x \), et alors on élèvera tous les coefficients de la première liste à cette puissance.

            On a : \( x = \dfrac{\log 5}{\log 30} = 0.4732\).

            De 1 à 1.5 le coefficient est 1.5. De 0.8 à \(a_1\) le coefficient sera de 1.5^0.4732 = 1.2115, et ainsi \(a_1\) = 0.8 x 1.2115 = 0.9692.

            Pour le terme suivant \(a_2\), le coefficient était 2,5 (passage de 1 à 2,5), donc le nouveau coefficient est 2.5^0.4732 = 1.5429. Le terme suivant est donc égal à 0.8 x 1.5429 = 1.2342.

            Bref, l'algorithme sera :

            • Calculer x.
            • Dans la liste initiale, calculer les coefficients permettant de passer du 1er terme au n-ème terme.
            • Élever ces coefficients à la puissance x, ce qui donne les coefficients pour passer du 1er terme au n-ème terme de la liste finale.
            • Calculer les termes à partir des nouveaux coefficients.

            Heimesque : est-ce que ça correspond bien à ta demande ?

            ----------------------

            Du coup j'ai fait un petit programme en Python :

            #! /usr/bin/python3
            
            from math import log
            
            # ----------------------------------------------------------
            # Arrondir un 'float' (mais ça existe peut-être déjà ?)
            # ----------------------------------------------------------
            
            def arrondi(x ,n):
                """ Arrondit x avec n chiffres après la virgule """
                p = 10**n
                q = int(p*x + 0.5)
                return q/p
             
            # ----------------------------------------------------------
            # Programme principal
            # ----------------------------------------------------------
            
            # Données de départ
            
            liste = [5.0, 2.0, 2.5, 1000.0]
            print("Nouvelle liste :")
            a = float(input("    Début a = "))
            b = float(input("    Fin   b = "))
            
            # Calculs
            
            coeffs = [t/liste[0] for t in liste]
            x = log(b/a) / log(liste[-1]/liste[0])
            nvliste = [arrondi(a*t**x, 4) for t in coeffs]
            
            # Données finales
            print(nvliste)

            Résultats :

            Nouvelle liste :
                Début 0.8
                Fin   4
            [0.8, 0.6056, 0.6481, 4.0]

            C'était amusant ! :)

            -
            Edité par robun 2 avril 2021 à 11:49:14

            • Partager sur Facebook
            • Partager sur Twitter
              2 avril 2021 à 8:46:01

              Hello,

              Sinon une autre façon de voir les choses est de d'abord déplacer les valeurs dans un intervalle commençant à 0 en soustrayant de chaque valeur la valeur minimum, puis de faire une proportionnalité classique puis de rajouter l'ancienne valeur minimum. Cela conservera la valeur minimum.

              def scale(lst,target):
                  return [ (x-min(lst))*(target-min(lst))/(max(lst)-min(lst))+min(lst) for x in lst ]
              

              en gros, il faut aussi vérifier que target>min par exemple ou que max≠min etc …

              • Partager sur Facebook
              • Partager sur Twitter
                2 avril 2021 à 10:37:44

                Bonjour à vous tous !

                Wow, merci pour réponses et propositions que je découvre ce matin.

                Le problème est bien plus compliqué que je ne pensais donc....!

                robun je pense que tu as juste, mais je ne suis pas sur des résultats finaux.

                En effet pourquoi as tu mis une première donnée de 5 qui devient 0,8 au final alors que c'est une première donnée de 1 qui doit devenir 0,8.
                Ou était-ce juste un test qui permet désormais d'introduire le bonne valeur de référence dans ce que tu as programmé ?

                Merci !

                • Partager sur Facebook
                • Partager sur Twitter
                  2 avril 2021 à 11:47:52

                  Je n'ai pas pris ta liste car elle était trop particulière : elle commence par 1.

                  En fait, dans le programme j'avais fait une erreur au début : j'avais calculé les puissances des éléments de la liste initiale au lieu des puissances des éléments de la liste des coefficients. Cette erreur donnait néanmoins un résultat correct car la liste initiale commence par 1, donc la liste des coefficients est identique (1/1 = 1 ; 1.5/1 = 1.5 ; etc.). Ta liste est en quelque sorte trop particulière. Pour valider le programme, j'ai donc pris une liste différente : elle ne commence par par 1, et elle décroît puis croît.

                  Mais en regardant les valeurs de départ et les valeurs d'arrivée, tu ne trouves pas que ça donne bien ce que tu souhaites ?

                  Sinon, avec la liste que tu as proposée :

                  Ancienne liste :
                  [1.0, 1.5, 2.5, 10.0, 25.0, 30.0]
                  Nouvelle liste :
                      Début = 0.8
                      Fin   = 4
                  [0.8, 0.9692, 1.2342, 2.3784, 3.6694, 4.0]

                  White Crow a écrit:

                  Sinon une autre façon de voir les choses est de d'abord déplacer les valeurs dans un intervalle commençant à 0 en soustrayant de chaque valeur la valeur minimum, puis de faire une proportionnalité classique puis de rajouter l'ancienne valeur minimum. Cela conservera la valeur minimum.

                  Pas bête ! Mais à la fin il faut ajouter la nouvelle valeur minimum puisqu'il ne faut pas conserver la valeur minimum (1 ... 30 --> 0.8 ... 4), non ?

                  -
                  Edité par robun 2 avril 2021 à 11:53:45

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 avril 2021 à 13:31:26

                    J'attendais une nouvelle intervention d'Heimesque, pour qu'il précise son besoin, mais je n'y vois pas beaucoup plus clair.

                    Je développe quand même ce que j'avais en tête.

                    (1 ; 1.5  ; 2.5 ; 10 ; 25 ; 30  ) ==> (0.8 ???? 4)

                    1ère approche : J'ai 6 nombres, donc 5 intervalles. Je dois aller de 0.8 à 4, soit une longueur de 4-0.8=3.2 Chaque intervalle doit donc mesurer 32/5=0.64

                    Donc 1=>0.8 ; 1.5 => 1.44 ; 2.5 => 2.08  etc

                    2ème approche : Entre 1 et 30, on a un écart de 29, et au final, on a un écart de 3.2 ;il faut donc applique un coefficient de 3.2/29 à tous les écarts :

                    1=> 0.8

                    1.5 => 0.8 + 3.2/29*(1.5-1)=

                    2.5 => 0.8 + 3.2/29*(2.5-1)

                    etc

                    Bien entendu, aucune de ces 2 approches ne convient, mais en faisant la moyenne entre ces 2 approches, c'est peut-être ce qu'on cherche ?

                    1.5 => (1.44+0.855)/2=1.148

                    2.5 => (2.08+0.966)/2=1.522

                    etc etc

                    Ici, pour 2.5, on obtient un 1.522, mais attention, si en entrée on avait donné une autre liste, avec par exemple une 7ème valeur, et toujours les mêmes bornes (1==>0.8 et 30=>4), on aurait obtenu autre chose.

                    C'est une toute autre philosophie.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 avril 2021 à 15:11:06

                      Et qu'est-ce que ça donnerait avec une interpolation polynômiale?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        2 avril 2021 à 19:04:59

                        Le problème d'une interpolation polynomiale, c'est qu'on peut obtenir à peu près tout ce qu'on veut, selon le degré du polynome que l'on choisit.

                        Et en particulier, on peut obtenir une courbe qui fait un beau yoyo. 

                        Ici, on nous impose 2 points ; Si on s'en tient à ces 2 points qu'on nous impose, le seul polynome, c'est une droite. Simple. 

                        On nous suggère plus ou moins 4 autres points (c'est tout le flou de la question). On aurait donc dans ce cas un polynomes, avec 6 points suggérés, ou 6 points imposés... et là, c'est le début des ennuis.

                        Si on impose ces 6 points, et qu'on cherche un polynome qui passe par ces 6 points, rien n'assure que le polynome obtenu donnera une belle courbe régulière, croissante. On tombera très souvent sur une courbe qui passe par ces 6 points, mais qui fait le yoyo dans les intervalles. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 avril 2021 à 19:29:09

                          C'est pour ça que je posais la question.
                          La courbe semble faire un départ lent, une montée rapide, et un ralentissement.
                          Même expérimentalement, je me poserais des questions sur ce genre de résultat.
                          Ça ressemble à un amplificateur électronique non linéaire qui sature ...
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                            3 avril 2021 à 6:31:01

                            robun a écrit:

                            White Crow a écrit:

                            Sinon une autre façon de voir les choses est de d'abord déplacer les valeurs dans un intervalle commençant à 0 en soustrayant de chaque valeur la valeur minimum, puis de faire une proportionnalité classique puis de rajouter l'ancienne valeur minimum. Cela conservera la valeur minimum.

                            Pas bête ! Mais à la fin il faut ajouter la nouvelle valeur minimum puisqu'il ne faut pas conserver la valeur minimum (1 ... 30 --> 0.8 ... 4), non ?

                            -
                            Edité par robun il y a environ 18 heures


                            Alors comme le PO explique :

                            Heimesque a écrit:

                            -La ou cela se complique est que, cette réduction étant très très grande, il ne faudrait néanmoins pas que la valeur la plus faible (1) disparaisse ou presque... Ainsi si à la fin 30 = 4, je voudrais aussi que 1 = 0,8. J'imagine que vous voyez l'idée... avec mes faibles connaissances en math j'imagine qu'il faudrait une formule de type exponentielle : plus la valeur de "base" est importante, plus elle se réduit vite à travers le calcul.

                            Je comprends ça comme :

                            «j'aimerais que l'intervalle soit réduit et comme je pense que cela va affecter la valeur du premier élément je suppose qu'il va devenir très petit, ce que je ne veux pas. Je donne un exemple : si j'ai 1 je ne voudrais pas qu'il fasse moins de 0,8 ».

                            Je ne prends pas le 0,8 comme comptant mais juste comme un ordre de grandeur dans l'esprit du PO. Du coup j'ai extrapolé que le minimum était conservable et qu'il ne fallait que réduire l'étendue des données.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 avril 2021 à 8:27:06

                              Je m'attache toujours à l'allure étrange du graphique que ces données représenteraient.
                              Ce qui s'en approche un peu est la fonction Arc Tangeante
                              Si on comprimais l'intervalle des X et si on décalais et si on multipliais par le bon facteur, on obtiendrait quelque chose d'approchant.
                              Y = f * atan(a*X+b) + g
                              On n'a que quatre inconnues. :)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                3 avril 2021 à 8:40:41

                                White Crow a écrit:

                                Heimesque a écrit:

                                Ainsi si à la fin 30 = 4, je voudrais aussi que 1 = 0,8.

                                Pour moi c'est explicite : il veut modifier la dernière, mais aussi la première valeur.

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Problème mathématique appliqué

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                • Editeur
                                • Markdown