Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Interpolation de points avec Catmull-rom

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en géométrie
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 20 Jan 2016 23:37    Sujet du message: Interpolation de points avec Catmull-rom Répondre en citant

Bonjour,

Je cherche à interpoler des points avec une courbe polynomiale glissante définie à l'aide de splines Catmull-rom.

J'ai trouvé un code qui devrait m'aller et que j'ai remis en forme.

Questions:
1) L'interpolation ne se fait pas. Est-ce que tu verrais ce qui manque dans le code ?

Je te joins en copie mon code :
https://www.nextsend.com/download/lbziyOi2qIKY586r57ugYNnH1Z6UuKV6n5aue6pUZaaYf7GDalSl/

Et voici le site internet où j'ai trouvé ce code.
http://www.dgp.toronto.edu/~elf/2505/maple.html

2) Ce code est assez vieux. Je pense que la fonction piecewise ne devait pas exister à l'époque. Aussi, il nécessite quelques procédures assez compliqués, en tout cas pour moi. Est-ce que tu aurais des idées pour simplifier ce code en utilisant la fonction "piecewise" pour la définition de la fonction par morceaux, chaque morceau étant une spline de Catmull-rom?

Merci d'avance pour ton aide.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 21 Jan 2016 6:02    Sujet du message: Répondre en citant

Bonjour,
As-tu pensé à utiliser la fonction Spline, BSpline ou BSplineCurve du package CurveFitting?

Citation:

The CurveFitting package is a collection of commands that support curve-fitting. By using the CurveFitting commands you can create a function that goes near or through a set of data points.


Ici un exemple de spline cubique pour interpoler un nuage de points:

Code:

> with(CurveFitting):
> S:=Spline([[-1,2],[0,2],[1,8],[4,7],[7,1]], x, degree=3);

           {        593     593  2   593  3
           {    2 + --- x + --- x  + --- x               x < 0
           {        168     112      336
           {
           {        593     593  2   949  3
           {    2 + --- x + --- x  - --- x               x < 1
           {        168     112      336
      S := {
           {   461   6647     4399  2   1195  3
           { - --- + ---- x - ---- x  + ---- x           x < 4
           {   378   504      1008      3024
           {
           {  1445   3929     127  2   127   3
           {  ---- - ---- x + --- x  - ---- x          otherwise
           {   54    504      144      3024



A plus tard.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 21 Jan 2016 9:37    Sujet du message: Répondre en citant

Bonjour,

Merci pour ton aide.
En effet, celà peut être interessant.

Par contre, je ne me souviens plus pourquoi. Mais, mon responsable d'équipe preferait que l'on utilise des splines Catmull-Rom. C'était peut-être lié à la notion de continuité également des tangentes.

De plus, de toute manière, comme celà fait partie de travaux pour de la recherche, il faudra expliquer comment la bspline est construite.

1) Est-ce que tu sais si l'on peut savoir comment une fonction comme le bspline du package CurveFitting a été construite ? En d'autres termes, est-ce que l'on peut remonter au code source de fonctions maple?

2) Si tu as un peu de temps, je suis très interessé pour qu'on itere pour la construction d'une courbe polynomiale à l'aidde de splines Catmull-Roll.

Merci d'avance pour ton aide
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 21 Jan 2016 11:59    Sujet du message: Répondre en citant

Bonjour,
je n'ai pas trop le temps en ce moment pour me plonger là-dedans, mais voici une procédure que j'avais écrite et qui calcule le polynôme d'interpolation d'Hermitte P d'une fonction f aux points L désirés (raccordement de f et P, et de f' et P' en ces abscisses xi de L).

Code:

> interp_hermite:=proc(f,L)
> local P,a,n,sys,vars;
> n:=nops(L):
> a:=array(0..2*n-1):
> P:=unapply(sum(a[k]*x^k,k=0..2*n-1),x);
> sys:={seq(P(L[i])=f(L[i]),i=1..n),seq(D(P)(L[i])=D(f)(L[i]),i=1..n)};
> vars:={seq(a[k],k=0..2*n-1)};
> assign(solve(sys,vars)):
> unapply(sum(a[k]*x^k,k=0..2*n-1),x)
> end proc:

> f:=x->ln(2*x/(x^2+1)):
> P:=interp_hermite(f,[1,2,3,4]);

                                                       2999
  P := x -> -36 ln(4/5) + 64 ln(3/5) + 47/3 ln(8/17) + ----
                                                        85

           /  134357                                             \
         + |- ------ + 150 ln(4/5) - 240 ln(3/5) - 550/9 ln(8/17)| x
           \   1020                                              /

         +

        /203207                                  10523         \  2
        |------ + 364 ln(3/5) - 1009/4 ln(4/5) + ----- ln(8/17)| x
        \ 1020                                    108          /

         +

        /  645947                                 8891         \  3
        |- ------ - 289 ln(3/5) + 881/4 ln(4/5) - ---- ln(8/17)| x
        \   4080                                  108          /

           /18293                                 2155         \  4
         + |----- + 130 ln(3/5) - 215/2 ln(4/5) + ---- ln(8/17)| x
           \ 255                                   54          /

           /  38011                                  601         \  5
         + |- ----- - 133/4 ln(3/5) + 59/2 ln(4/5) - --- ln(8/17)| x
           \  2040                                   54          /

           /2633                                179         \  6
         + |---- + 9/2 ln(3/5) - 17/4 ln(4/5) + --- ln(8/17)| x
           \1020                                108         /

           /  201                                11          \  7
         + |- ---- - 1/4 ln(3/5) + 1/4 ln(4/5) - --- ln(8/17)| x
           \  1360                               108         /


> plot([f(x),P(x)],x=0..5,color=[red,blue]);



Si cela peut-être utile, en tout cas pour la méthode (résolution d'un système de contraintes f(xi)=P(xi), f'(xi)=P(xi) , xi étant les abscisses de la subdivision passée à la procédure comme liste).

Sinon, je vous ai adressé une nouvelle version du fichier Maple.

ALS
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 27 Jan 2016 9:49    Sujet du message: Répondre en citant

Merci je vais regarder ce programme permettant de calculer le polynome d'interpolatiion d'Hermitte car il me semble si j'ai bien compris ce que j'ai lu qu'un polynome d'interpolation avec Splines de Catmull-Rom est un cas particulier de ces polynomes d'Hermitte.

Sinon, voici le code pour la création de polynome avec splines de Catmull-rom que nous avons pu construire:

Code:
paires := proc(x,y)
local i;
seq([x[i], y[i]],i=1..nops(x));
end;

param := proc(p,i)
local X, s;
      print("param entrées =",p,i);
      X := indets(p);
      s:= (i[2]-i[1])*X[1] - i[1];
      print("param sortie =",subs(t=s,p));
   simplify(subs(t=s,p));
end;

CRsegmentLocal := proc(xp,yp,t)
local i,CR,T,Mcatrom,M,s;
T:=Vector[row]([t^3,t^2,t,1]);
Mcatrom:=1/2*Matrix([<-1, 2, -1, 0>,<3, -5, 0, 2>,<-3, 4, 1,0>,<1, -1, 0,0>]);
CR:=VectorMatrixMultiply(T,Mcatrom);
for s from 1 to 4 do
M[s-1]:=[xp[s],yp[s]]
od;
M:=seq(M[i],i=0..3);
M:=convert([M],Matrix);
convert(MatrixMatrixMultiply(CR,M),list);
end;

CRsegments := proc(xp,yp,t)   
local segment, i, nosegs,Num;

if (nops(xp) < 4) or (nops(yp) < 4 )then
ERROR(`nécessite au moins 4 points`);
fi;
Num:=nops(xp);
nosegs := nops(xp) - 3;
segment := [[t<0,[0,0]],seq([t<=i,param(CRsegmentLocal([xp[i],xp[i+1],xp[i+2],xp[i+3]],[yp[i],yp[i+1],yp[i+2],yp[i+3]],t),[i-1,i])],i=1..nosegs),[t>nosegs,[0,0]]];
end;
Détermination des courbes d'interpolation à l'aide de Catmull-rom splines
Calcul une trajectoire avec des fonctions x(t), y(t) indépendantes
xp := [0, 0, 2, 1, 0.5, 4, 3, 2.5, 3.5, 3.5];
yp := [0, 0, 3, 4, 1, 2, 3, 1, 4, 4];
Courbe:=CRsegments(xp,yp,t);
Courbe:=map(a->op(a),Courbe);
Courbe:=convert(Courbe,piecewise);

px := map(a-> `if`(type(a, list), a[1], a) , Courbe): px:=piecewise(op(px));
py := map(a-> `if`(type(a, list), a[2], a) , Courbe): py:=piecewise(op(py));
with(plots):
plot1 := plot({[px,py,t=0..6.99]}):
plot2 := plot({paires(xp,yp)},style=point):
display({plot1,plot2}, title=`Piecewise Cubic Catmull-Rom Trajectory`);


N.B: Le programme que je t'ai envoyé par mail est légèrement différent.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en géométrie Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.