 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 20 Jan 2016 23:37 Sujet du message: Interpolation de points avec Catmull-rom |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 21 Jan 2016 6:02 Sujet du message: |
|
|
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 |
|
 |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 21 Jan 2016 9:37 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 21 Jan 2016 11:59 Sujet du message: |
|
|
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 /
2°
> 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 |
|
 |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 27 Jan 2016 9:49 Sujet du message: |
|
|
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 |
|
 |
|
|
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
|

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.
|