Déterminer une equation à partir d'un jeu de données

a marqué ce sujet comme résolu.

Bonjour,

Je ne suis pas bon en math, fin… j’ai des bases mais concrètement je ne me considère pas comme bon.

Je suis en train de créer un petit programme, dans ce programme je voudrai afficher un résultat en fonction d’une donnée. Le problème c’est que je ne connais pas la fonction permettant d’arriver au résultat.

Par observation je connais toute un série de point de la courbe… mais me voilà bien incapable d’en extraire la fonction. Pouvez-vous m’aider ?

Voici le début de la série:

1
2
X: 1, 2,  3,  4,  5, ...,  21, 22,  23,   24, ...,  37,  38,  39, ...  
Y: 0, 5, 11, 17, 23, ..., 120, 127, 134, 141, ..., 233, 241, 289, ...  

De ce que je vois, du rang 1 à 2 on fait +5, du rang 2 à 21 on fait +6 pour chaque valeur, du rang 21 au rang 37 on fait +7 pour chaque valeur de x et ainsi de suite.
Malheureusement à par constaté cela et remarque qu’avec le temps cela progresse de plus en plus vite… je suis bien incapable d’en retirer la formule.

Un graph illustrant la fonction:
graph

Pouvez-vous m’aider ?

Merci d’avance.
Cordialement, La source.

+0 -0

je me suis renseigner y’a pas très longtemps sur ça, et la réponse que j’ai trouvé c’est … que tu peux pas sans connaître la forme de ta courbe. :euh:
Cependant l’approximation polynomiale donne de bons résultats.

Pour trouver assez simplement les coefficients de ce polynôme, il suffit de résoudre l’équation matricielle :

$$ \begin{pmatrix} a_n & a_{n-1} & ... & a_1 & a_0 \end{pmatrix}.\begin{pmatrix} x_1^n & x_2^n & ... & x_{m-1}^n & x_m^n \\ x_1^{n-1} & x_2^{n-1} & ... & x_{m-1}^{n-1} & x_m^{n-1} \\ ... & ... & ... & ... & ... \\ x_1 & x_2 & ... & x_{m-1} & x_m \\ 1 & 1 & ... & 1 & 1 \end{pmatrix} = \begin{pmatrix} y_1 & y_2 & ... & y_{m-1} & y_m \end{pmatrix} $$

où m est ton nombre de points et n est le degré du polynome par lequel tu vas approximer.

Tu te retrouve donc avec une équation de la forme

$$ AX=Y $$ et la solution (on cherche A, pas X pour une fois) apprait lorsque tu résouds $$ A=Yt_X(Xt_X)^{-1} $$

edit : correction erreur

+0 -1

Salut,

Si tu ne connais pas la formule, tu ne pourras probablement jamais retrouver la véritable formule (s’il y en a une).

Ceci dit, en fonction de ce dont tu disposes, il y a différentes méthodes qui peuvent s’offrir à toi.

Je suis en train de créer un petit programme, dans ce programme je voudrai afficher un résultat en fonction d’une donnée.

J’aimerais avoir plus de précision pour mieux t’aider. Déjà, à quoi correspond ce résultat concrètement et à quoi sert-il ? Sinon, j’ai une autre série de question plus génériques :

  • Est-ce que tu connais la plage de valeur que parcourt ta donnée ?
  • Cette plage est-elle bornée ?
  • Quelles sont tes contraintes en matière de stockage et de puissance de calcul ?
  • Est-ce que tu as une idée sur des propriétés de ta fonction (est-ce qu’elle a des sauts, des cassures, …) ?
  • Est-ce que tu as des observations sur toute la plage de la donnée ?

Bonjour :)

Ce que tu cherches à faire s’appelle de l’inversion. Ca consiste à résoudre le problème :

$$ y = f(x) $$

sachant que l’inconnu ici c’est $f$. Comme dit au dessus, tu ne pourra pas trouver la formulation exacte de $f$, pour la simple raison qu’une infinité de fonction peuvent correspondre à ton jeu de donnée.

Ce que l’on fait souvent1, en première approximation, c’est imaginer quelles fonctions « simple » pourraient convenir. Pour ca, tracer bêtement $y$ en fonction de $x$ est un bon début. On voit que c’est pas linéaire, mais ca pourrait être exponentiel ou polynomial. Partons sur l’hypothèse polynomial d’ordre 2, alors on suppose que

$$f : x \rightarrow ax^2 + b x + c$$

Ne reste « plus qu’à » trouver $a$, $b$ et $c$

Mais on peut aussi penser qu’une exponentielle ferait l’affaire, dans ce cas :

$$f : x \rightarrow A_0\exp(kx) + C$$

dans ce cas il faut trouver $A_0$, $C$ et $k$

Il y a plein de méthodes différentes pour ca. La plupart des langages de programmation en on implémenté plusieurs. polyfit en python pour le fit polynomial, clic droit insert trend line sous libreoffice calc, etc.


Exemple simple en python :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>>import matplotlib.pyplot as plt
>>>x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>y = [1, 2, 5, 10, 17, 26, 37, 50, 65, 82]
>>>plt.plot(x,y, "*")
>>>plt.show()
>>># on cherche une fonction polynomial d'ordre 2 liant y a x
>>>from scipy import polyfit 
>>>a, b, c = polyfit(x, y, 2)
>>>print(a)
1.0000000000000002
>>>print(b)
-4.840225709464762e-15
>>>print(c)
1.0000000000000224
>>>plt.plot(x,y,"*")
>>>plt.plot(x,a*x**2+b*x+c)
>>>plt.show()

  1. mais ca dépend de ta connaissance a priori du contexte physique… 

+4 -0

Gwend@l t’a apporté une solution, mais c’est comme une boite noire.

En entrée, TU décides que tu vas chercher une courbe de la forme y = ax²+bx+c, et tu cherches les coefficients a,b,c qui marchent bien pour reconstituer ta série de points. Mathématiquement, l’outil que tu peux utiliser s’appelle une régression linéaire multiple, basée sur la méthode des moindres carrés. Soit tu t’intéresses à la résolution mathématique de l’exercice, et tu recherches la doc à partir de ces mots clés, soit tu fais confiance à Python qui a une fonction toute faite pour ça (Et plein d’autres outils ont également des fonctions toutes faites pour ça).

Ensuite, l’autre question qui peut venir, c’est : faut-il chercher une courbe de la forme y=ax²+bx+c, ou bien une courbe de la forme y=a/x+b/x²+cx²+dx+c ou plein d’autres trucs qu’on pourrait imaginer.

Si tu cherches un polynome de degré 12 ou 15, tu vas forcément trouver des polynomes qui coïncident mieux avec le jeu de données que tu as. Mais tu vas avoir des effets pervers terribles… Et comment trouver le bon arbitrage, comment décider si tu dois chercher un polynome de degré 2 ou bien de degré 3… c’est une question très complexe.

+1 -0
Banni

Je suis curieux de savoir d’où sort cette suite. J’ai testé sur l’OEIS mais ça ne donne que des trucs asymptotiquement linéaires (je ne savais pas qu’il y avait dessus des suites comme $\lfloor n (\sqrt{13} + \sqrt{5})\rfloor$). Est-ce que c’est une approximation de quelque chose ou bien les valeurs tombent juste ?

Pour l’interpolation polynomiale, je ne pense pas que ça donne de bons résultats. Peut-être que c’est un arrondi d’un polynôme ? Tu pourrais tracer le graphe des différences, puis le graphe des différences des différences, etc. ?

Sinon là si on voulait faire une interpolation polynomiale je pense qu’il faudrait faire en base binomiale plutôt qu’en base canonique ou Lagrangienne, puisque les points sont régulièrement espacés (on n’aura pas de problème d’instabilité numérique). Je crois que l’interpolation en base Lagrangienne n’est pas meilleure que celle en base canonique d’ailleurs, numériquement parlant (enfin, une fois j’avais testé sur un cas et l’interpolation en base Lagrangienne faisait n’importe quoi quand on mettait trop de points alors que celle en base canonique convergeait comme on voulait, mais je n’ai pas plus approfondi). Mais de toute manière une interpolation polynomiale donnera sûrement n’importe quoi (cf. phénomène de Runge) (comme dit elegance).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte