merci Nozio pour le lien je l'ai utilisé et j'ai utilisé le code ci dessous et le graphe résultant de ce code celui qui est immédiatement dessous le code:
"""
Created on Thu Mar 12 14:02:26 2020
@author: pc
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
#x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8)
#y = np.sin(x)
x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48]
y1=[-150, -96, -95, -85, -74,-65, -55, -52, -46, -47]
x=np.asarray(x1)
y=np.asarray(y1)
print(x, y)
tck = interpolate.splrep(x, y, s=0) #si aucun lissage n'est souhaité s=0, une valeur de doit être transmis aux routines.
print('tck',tck)
xnew = np.arange(-130, -20, 0.001)
ynew = interpolate.splev(xnew, tck, der=0)
plt.figure()
plt.plot(x, y, 'x', xnew, ynew, 'b')
plt.legend(['Linear', 'Cubic Spline', 'True'])
plt.axis([-130, -10, -170, -10])
plt.title('Cubic-spline interpolation')
plt.show()
La représentation ci dessus et le resultat du code au dessus mais moi je veux avoir comme la representation graphique tout en bas utilisant spline cubique qui donne une courbe fermée (graphe ci dessous) et je sais pas quoi ajouter dans le code pour l'avoir sachant que les deux graphes representent les meme x et y du code
remarque importante : j'ai du ordonné les valeur de x selon un ordre croissant par ce que le code tournait pas et je sais pas si ça infectera le forme de la courbe pour avoir comme le dernier graphe
Alors il faut faire un tout petit peu différemment : en gros, tu as tracé une courbe \(x, y(x)\) (celle qui ne t'intéresse pas); tu dois "séparer" les variables \(x\) et \(y\) en introduisant un paramètre \(t\). Tu obtiens donc une courbe \(x(t), y(t)\) qui est donc fermée. Tu fais deux interpolations, une pour \(x\) et une pour \(y\) (contre une seule auparavant). Appelons \(x'(t), y'(t)\) la courbe interpolée, ben tu la traces
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
merci beaucoup mais je serai reconnaissant si tu me fait juste un tout petit bout de code pour m'expliquer mieux et surtout le problème qui me dérange que je dois ordonner les valeur des x et y je crois
Après une petite recherche avec notre ami Gogol, un petit exemple de code pour le traçage d'une courbe paramétrée. Ouh là, me fait vieux, y'a un peu plus de vingt ans, on faisait ça sur des TI82 !!!
from matplotlib.pylab import plot, cos, sin, pi, arange
T = arange(0,2*pi,0.01)
X = cos(T)*(1-cos(T))
Y = sin(T)*(1-cos(T))
plot(X,Y)
nozio merci pour l'exemple mais je crois que il ne peut pas répondre à ma question moi j'ai deux liste c'est tout et x et y dans mon cas sont des valeur aléatoire donc aucune fonction pourrait les relier avec un autre paramètre sauf qu'il y a un liste t =[0.0, 0.1, .....,0.9] qui sont relié a x et y donc je sais pas comment adapter le code de ton exemple avec les listes
pour PB68 merci pour l'aide mais ce que je cherchais c'est l'interpolation cubic spline
nozio merci pour l'exemple mais je crois que il ne peut pas répondre à ma question moi j'ai deux liste c'est tout et x et y dans mon cas sont des valeur aléatoire donc aucune fonction pourrait les relier avec un autre paramètre sauf qu'il y a un liste t =[0.0, 0.1, .....,0.9] qui sont relié a x et y donc je sais pas comment adapter le code de ton exemple avec les listes
pour PB68 merci pour l'aide mais ce que je cherchais c'est l'interpolation cubic spline
cordiallement
- Edité par youssef2_41 il y a environ 4 heures
Moi, je donnais juste une info sur la notion de courbe paramétrée.
Après, pour ce qui de l'interpolation cubique, de mes souvenirs d'école, c'est un "moyen mathématique" permettant le traçage de courbe. C'est le principe utilisé pour les courbes de Béziers.
Si tu veux interpoler ta courbe fermée, tu peux vraiment reprendre tel quel le code de l'exemple (tu peux lancer le code ci-dessous).
import scipy.interpolate as si
import numpy as np
import matplotlib.pyplot as plt
# Les donnees (je rajoute la premiere valeur)
x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120]
y1=[-150, -96, -95, -85, -74,-65, -55, -52, -46, -47, -150]
x=np.asarray(x1)
y=np.asarray(y1)
# J'interpole
x_tck, u = si.splprep([x, y], s=0, per=True)
t_new = np.linspace(0, 1, 1001)
x_new, y_new = si.splev(t_new, x_tck)
plt.figure()
plt.plot(x, y, "g*")
plt.plot(x_new, y_new, "r-")
plt.show()
Tu n'as même pas besoin d'expliciter le paramétrage puisque la fonction s'en charge pour toi (c'est la valeur \(u\) dans ce que retourne ta fonction). Après, il faudra peut-être jouer avec les options pour obtenir précisément ce que tu cherches. Garde à l'esprit qu'une interpolation ne fera pas de miracles. Ça reste une interpolation ...
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
merci infiniment pour ce bout de code ça se ferme et je sais que l'interpolation reste une interpolation donc pour ce que je représenterai graphiquement je voulais juste qu'il soit représenter comme il faut et si il y a des choses à en tirer comme conclusion c bien sinon donc pas de problème
mais le problème que le résultat passe pas par les point selon l'ordre comme le graphe que je voulais car j'ai dû ordonner la liste x1 et donc voilà le résultat qui est différent de ce que je cherchais (resultat juste en dessous, ce que je cherchais tout en bas sachant que les deux graphes représentent les meme données)
et je sais pas il y a une autre question stp, j'ai une autre liste rr= [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] dont les valeurs sont associées à x1 et y1 je sais pas si il y a une méthode pour forcer la courbe passer par les points dont les coordonnées (x1, y1 et les valeur de la liste rr) selon l'ordre de graphe toute en bas pour donner la meme figure, et si il y a la possibilité d'afficher les valeurs de la liste rr sur le graphe pour chaque point (x1, y1)
meric aussi à PB68 oui c'est ça le problème que je rencontre est forcer le passage de la courbe d'interpolation par les point selon un ordre précis car le code s'exécutait pas quand x1 comporte pas les valeur ordonnées selon l'ordre croissante donc si je veux forcer la courbe d'interpolation (cubic spline) passer le point 0.9 -> 0.8 -> 0.7 ........ 0.0 -> 0.9 et revenir au point 0.9 je sais pas si possible ou pas
# coding: utf-8
import scipy.interpolate as si
import numpy as np
import matplotlib.pyplot as plt
## Je genere ta courbe
t=np.arange(0, 1.1, 0.1)
x=np.array([-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120])
y=np.array([-150, -96, -95, -85, -74,-65, -55, -52, -46, -47, -150])
# J'interpole
x_tck = si.splrep(t, x, s=0, per=1)
y_tck = si.splrep(t, y, s=0, per=1)
t_new = np.arange(0, 1.01, 0.01)
x_new, y_new = si.splev(t_new, x_tck), si.splev(t_new, y_tck)
plt.figure()
plt.plot(x, y, "g*")
plt.plot(x_new, y_new, "r-")
plt.show()
Tu remarqueras que j'ai fermé ta courbe en rajoutant le premier point à la fin! Pour obtenir le résultat voulu, il faudra sans doute jouer avec les options !
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
merci beaucoup frérot le code marche bien mais malheureusement le fait d'ordonner x pose grand problème pour obtenir la même chose car il passe par les point selon l'ordre croissant des valeurs de x et pas par les points comme le graphe l'indique car dans le graphe on passe par les points ayant les x0 suivant : x0=[-91, -51, -48, -49, -53, -62, -72, -86, -94, -120, -91] selon cet ordre et pas selon l'ordre suivant qu'on utilise dans le code x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120]
si je garde l'ordre x0 le code m'affiche ce message d'erreur
raise _iermess[ier][1](_iermess[ier][0])
ValueError: Error on input data
je crois a un rapport avec le x0 et qu'il faut ordonner ses valeurs selon un ordre croissant
je sais pas vraiment comment sortir de cette impasse
voilà le graphe que me donne le code :
et le graphe que je voulais obtenir
merci pour l'aide si tu as un idée pour surmonter ce problème
× 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.
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
PB68
PB68
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...