 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
romanticide
Inscrit le: 13 Mar 2005 Messages: 47
|
Posté le: 15 Mai 2005 11:29 Sujet du message: besoin d'aide |
|
|
bonjour
je veux tracé des courbe avec discrétisation par rapport à la courbure
le problème c'est que certaine courbe on des points singuliers
donc il faut exclure ces points
j'ai donc fait une procédure pour faire une liste de ces points et une autre qui dit si oui ou non un point est singulier
j'ai fait aussi deux procédures de discrétisation et courbure qui mle donne la liste des points à tracé : une quand il n'y a pas de points singulier rectcourb1 et une qui les évite rectcourb2
si je les test séparément ça fonctionne
rectcourb2 fonctionne aussi quand il n'y a pas de points singuliers mais ça prend du temps à maple d'o๠rectcourb1
rectcourb est la procédure qui doit choisir de lancer rectcourb1 ou 2
mais j'ai un message d'erreur: Plotting error, empty plot
donc je n'ai pas de courbe
voici mon code
Code: | Liste des points singuliers
> Singulier1:=proc(Expr,Int,nbpoints,epsilon)
> local a,b,g1,g2,d1,d2,x,y,List,i;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> List:=[];
> for i from a to b by (b-a)/nbpoints do
> x:=evalf(subs(t=i,d1));
> y:=evalf(subs(t=i,d2));
> if abs(x^2+y^2)<epsilon then List:=[op(List),i];
> fi;
> od;
> List;
> end:
Recherche des points singuliers pour la discrétisation
> Singulier2:=proc(Expr,Int,nbpoints,epsilon)
> local a,b,g1,g2,d1,d2,x,y,List,i;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> List:=[];
> for i from a to b by (b-a)/nbpoints do
> x:=evalf(subs(t=i,d1));
> y:=evalf(subs(t=i,d2));
> if abs(x^2+y^2)<epsilon
> then List:=true;
> else List:=false;
> fi;
> od;
> List;
> end:
Discrétisation et courbure
> Rectcourb1:=proc(Expr,Int,n)
> local a,b,g1,g2,h0,x,Listx,i,Go,Cc,h,d;
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> g1:=op(1,Expr);g2:=op(2,Expr);
> h0:=evalf((b-a)/n);
> x:=a;
> Listx:=[[subs(t=a,op(1,Expr)),subs(t=a,op(2,Expr))]];
> i:=0;
> Go:=true;
> while Go do
> i:=i+1;d:=Courbure(w,x);
> Cc:=abs(d);
> if Cc<1 then h:=h0;
> else h:=h0/Cc;
> fi;
> x:=evalf(x+h);
> Listx:=[op(Listx),[subs(t=x,op(1,Expr)),subs(t=x,op(2,Expr))]];
> Go:=evalb(x<b+h0);
> od;
> Listx;
> end:
> Rectcourb2:=proc(Expr,Int,n)
> local a,b,g1,g2,h0,x,Listx,i,Go,Cc,h,d;
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> g1:=op(1,Expr);g2:=op(2,Expr);
> Listx:=[[subs(t=a,op(1,Expr)),subs(t=a,op(2,Expr))]];
> h0:=evalf((b-a)/n);
> x:=a;
> i:=0;
> Go:=true;
> while Go do
> i:=i+1;
> if Singulier2(Expr,Int,100,10^(-5)) then x:=x+h0;
> fi;
> d:=Courbure(w,x);
> Cc:=abs(d);
> if Cc<1 then h:=h0;
> else h:=h0/Cc;
> fi;
> x:=evalf(x+h);
> Listx:=[op(Listx),[subs(t=x,op(1,Expr)),subs(t=x,op(2,Expr))]];
> Go:=evalb(x<b+h0);
> od;
> Listx;
> end:
> Rectcourb:=proc(Expr,Int,n)
>
> Singulier1(w,Intdef,100,10^(-5));
> if List=[] then rectcourb1(Expr,Int,n);
> else rectcourb2(Expr,Int,n);
> fi;
> end:
print(`Discrétisation et courbure :`);
> print(` `);
> Ligne:=plot(Rectcourb(w,Intdef,70),color=green,style=line):
> Point:=plot(Rectcourb(w,Intdef,70),color=red,style=point):
> display({Ligne,Point});
> print(` `);
|
la procédure courbe calcule la courbure
merci |
|
Revenir en haut de page |
|
 |
romanticide
Inscrit le: 13 Mar 2005 Messages: 47
|
Posté le: 15 Mai 2005 15:31 Sujet du message: re besoin d'aide |
|
|
finalement je garde une seule procédure pour tester avec la cardioide bizzarement quand je lance
les procédures singulier1 singulier2,rectcourb et que je demande à maple de tracé la discrétisation mais quand j'intègre ça à mon programme en entier il ne trace pas la discrétisation et il ne s'arrête pas de calculer
je suis obligée d'arrêter en faisant stop
voici mon programme entier
Code: | > with(plots):
Tracé d'une courbe paramétrée :
Affichage de la courbe
> AffCurv:=proc(Expr)
> local g1,g2;
> g1:=op(1,Expr);g2:=op(2,Expr);
> print(`g1 `=g1);print(`g2 `=g2);
> end:
>
Tracé de la courbe
> TracCurv:=proc(Expr,Min,Max)
> local g1,g2,Curv;
> g1:=op(1,Expr);g2:=op(2,Expr);
> Curv:=[g1,g2,t=Min..Max];
> plot(Curv,scaling=constrained,numpoints=100,color=blue);
> end:
Rectification et Longueur :
Calcul de la longueur
> CalCurv:=proc(Expr,Min,Max)
> local g1,g2,d1,d2,ds,L,s,e;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> print(`d1 `=d1); print(`d2 `=d2);
> ds:=sqrt((d1^2)+(d2^2));
> print(`ds `=ds);
> L:=Int(ds,t=Min..Max);
> print(`L `=L);
> s:=simplify(L);
> e:=evalf(s);
> print(`Long `=e);
> end:
Rectification
> Repproc:=proc(Expr,a,b,Err)
> local A,B,X,Y,Dist,g1,g2,d1,d2,R,L,Lg,Pt,c,List;
> A:=[subs(t=a,op(1,Expr)),subs(t=a,op(2,Expr))];
> B:=[subs(t=b,op(1,Expr)),subs(t=b,op(2,Expr))];
> List:=[];c:=0;
> X:=(op(1,B)-op(1,A));Y:=(op(2,B)-op(2,A));
> Dist:=sqrt(X^2+Y^2);
> d1:=diff(op(1,Expr),t);d2:=diff(op(2,Expr),t);
> R:=sqrt((d1^2)+(d2^2));
> L:=Int(R,t=a..b);
> Lg:=evalf(L);
> if evalf(Lg-Dist)>evalf(Err) then
> List:=[op(List),op(Repproc(Expr,a,(a+b)/2,Err))]:
> List:=[op(List),op(Repproc(Expr,(a+b)/2,b,Err))]
> else
> List:=[op(List),map(evalf,A),map(evalf,B)]:
> fi;
> List
> end:
Discrétisation et courbure :
Calcul de la courbure en un point
> Courbure1:=proc(Expr,T)
> local g1,g2,d1,d2,dd1,dd2,D1,D2,ds,Mat,Delta,Courb,x;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> D1:=[d1,d2];
> print(`Dérivées premières `=D1);
> ds:=sqrt(d1^2+d2^2);
> print(`ds `=ds);
> dd1:=diff(d1,t);dd2:=diff(d2,t);
> D2:=[dd1,dd2];
> print(`Dérivées secondes `=D2);
> Mat:=matrix([[d1,dd1],[d2,dd2]]);
> print(`Matrice `=evalm(Mat));
> Delta:=(d1*dd2-d2*dd1);
> print(`Delta `=Delta);
> x:=Delta/ds^3;
> print(`Formule de la courbure :`);
> print(x);
> print(` `);
> print(`Courbure : `);
> Courb:=evalf(subs(t=T,Delta/ds^3));
> end:
Calcul de la courbure pour la discrétisation
> Courbure:=proc(Expr,T)
> local g1,g2,d1,d2,dd1,dd2,D1,D2,ds,Mat,Delta,Courb;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> D1:=[d1,d2];
> ds:=sqrt(d1^2+d2^2);
> dd1:=diff(d1,t);dd2:=diff(d2,t);
> D2:=[dd1,dd2];
> Mat:=matrix([[d1,dd1],[d2,dd2]]);
> Delta:=(d1*dd2-d2*dd1);
> Courb:=evalf(subs(t=T,Delta/ds^3));
> end:
Liste des points singuliers
> Singulier1:=proc(Expr,Int,nbpoints,epsilon)
> local a,b,g1,g2,d1,d2,x,y,List,i;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> List:=[];
> for i from a to b by (b-a)/nbpoints do
> x:=evalf(subs(t=i,d1));
> y:=evalf(subs(t=i,d2));
> if abs(x^2+y^2)<epsilon then List:=[op(List),i];
> fi;
> od;
> List;
> end:
Recherche des points singuliers pour la discrétisation
> Singulier2:=proc(Expr,Int,nbpoints,epsilon)
> local a,b,g1,g2,d1,d2,x,y,List,i;
> g1:=op(1,Expr);g2:=op(2,Expr);
> d1:=diff(g1,t);d2:=diff(g2,t);
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> List:=[];
> for i from a to b by (b-a)/nbpoints do
> x:=evalf(subs(t=i,d1));
> y:=evalf(subs(t=i,d2));
> if abs(x^2+y^2)<epsilon
> then List:=true;
> else List:=false;
> fi;
> od;
> List;
> end:
Discrétisation et courbure
>
>
> Rectcourb:=proc(Expr,Int,n)
> local a,b,g1,g2,h0,x,Listx,i,Go,Cc,h,d;
> a:=evalf(op(1,Int));b:=evalf(op(2,Int));
> g1:=op(1,Expr);g2:=op(2,Expr);
> Listx:=[[subs(t=a,op(1,Expr)),subs(t=a,op(2,Expr))]];
> h0:=evalf((b-a)/n);
> x:=a;
> i:=0;
> Go:=true;
> while Go do
> i:=i+1;
> if Singulier2(Expr,Int,100,10^(-5)) then x:=x+h0;
> fi;
> d:=Courbure(w,x);
> Cc:=abs(d);
> if Cc<1 then h:=h0;
> else h:=h0/Cc;
> fi;
> x:=evalf(x+h);
> Listx:=[op(Listx),[subs(t=x,op(1,Expr)),subs(t=x,op(2,Expr))]];
> Go:=evalb(x<b+h0);
> od;
> Listx;
> end:
>
>
>
Zone Inter-Active
> print(`Courbes paramétrées de paramètre t :`);
> courbes:=[[(1+cos(t))*cos(t),(1+cos(t))*sin(t)]];
> print(` `);
>
> print(`Intervalles de définition respectifs:`);
> Intdefs:=[[0,2*Pi],[0,Pi]];
> print(` `);
>
> for k to nops(courbes) do
> w:=courbes[k]: Intdef:=Intdefs[k]:
>
> print(`Composantes de la courbe paramétrée :`);
> AffCurv(w);
> print(` `);
> print(`Graphe de la courbe :`);
> print(` `);
> TracCurv(w,Intdef[1],Intdef[2]);
> print(` `);
>
> print(`Longueur de la courbe :`);
> CalCurv(w,Intdef[1],Intdef[2]);
> print(` `);
>
> print(`Rectification à 0.01 :`);
> print(` `);
> display({plot(Repproc(w,Intdef[1],Intdef[2],10^(-2)),color=blue,style=line),plot(Repproc(w,Intdef[1],Intdef[2],10^(-2)),color=red,style=point)});
> print(` `);
>
> print(`Rectification à 0.001 :`);
> print(` `);
> display({plot(Repproc(w,Intdef[1],Intdef[2],10^(-3)),color=blue,style=line),plot(Repproc(w,Intdef[1],Intdef[2],10^(-3)),color=red,style=point)});
> print(` `);
>
> x:=Pi/4:
> print(`Calcul de la courbure au point :`,x);
> Courbure1(w,x);
> print(` `);
>
>
> print(`Liste des points singuliers :`);
> Singulier1(w,Intdef,100,10^(-5));
>
>
> print(`Discrétisation et courbure :`);
> print(` `);
> display({plot(Rectcourb(w,Intdef,100),color=green,style=line),plot(Rectcourb(w,Intdef,100),color=red,style=point)});
> print(` `);
>
> print(`Graphe, discrétisation et courbure :`);
> print(` `);
> display({plot(Rectcourb(w,Intdef,100),color=green,style=line),plot(Rectcourb(w,Intdef,100),color=red,style=point),TracCurv(w,Intdef[1],Intdef[2])});
> print(`------------------------------------------------------------------------------------------------------------------------------------------`);
>
> od;
Courbes paramétrées de paramètre t :
courbes := [[(1 + cos(t)) cos(t), (1 + cos(t)) sin(t)]]
Intervalles de définition respectifs:
Intdefs := [[0, 2 Pi], [0, Pi]]
w := [(1 + cos(t)) cos(t), (1 + cos(t)) sin(t)]
Intdef := [0, 2 Pi]
Composantes de la courbe paramétrée :
g1 = (1 + cos(t)) cos(t)
g2 = (1 + cos(t)) sin(t)
Graphe de la courbe :
Longueur de la courbe :
d1 = -sin(t) cos(t) - (1 + cos(t)) sin(t)
2
d2 = -sin(t) + (1 + cos(t)) cos(t)
2
ds = sqrt((-sin(t) cos(t) - (1 + cos(t)) sin(t))
2 2
+ (-sin(t) + (1 + cos(t)) cos(t)) )
2 Pi
/
| 2
L = | sqrt((-sin(t) cos(t) - (1 + cos(t)) sin(t))
|
/
0
2 2
+ (-sin(t) + (1 + cos(t)) cos(t)) ) dt
Long = 8.000000000
Rectification à 0.01 :
Rectification à 0.001 :
x := 1/4 Pi
Calcul de la courbure au point :, 1/4 Pi
Dérivées premières = [-sin(t) cos(t) - (1 + cos(t)) sin(t),
2
-sin(t) + (1 + cos(t)) cos(t)]
2
ds = sqrt((-sin(t) cos(t) - (1 + cos(t)) sin(t))
2 2
+ (-sin(t) + (1 + cos(t)) cos(t)) )
2 2
Dérivées secondes = [-cos(t) + 2 sin(t) - (1 + cos(t)) cos(t),
-3 sin(t) cos(t) - (1 + cos(t)) sin(t)]
Matrice =
[
[-sin(t) cos(t) - (1 + cos(t)) sin(t) ,
2 2 ]
-cos(t) + 2 sin(t) - (1 + cos(t)) cos(t)]
[ 2
[-sin(t) + (1 + cos(t)) cos(t) ,
]
-3 sin(t) cos(t) - (1 + cos(t)) sin(t)]
Delta = (-sin(t) cos(t) - (1 + cos(t)) sin(t))
(-3 sin(t) cos(t) - (1 + cos(t)) sin(t)) -
2
(-sin(t) + (1 + cos(t)) cos(t))
2 2
(-cos(t) + 2 sin(t) - (1 + cos(t)) cos(t))
Formule de la courbure :
((-sin(t) cos(t) - (1 + cos(t)) sin(t))
(-3 sin(t) cos(t) - (1 + cos(t)) sin(t)) -
2
(-sin(t) + (1 + cos(t)) cos(t))
2 2 /
(-cos(t) + 2 sin(t) - (1 + cos(t)) cos(t))) / (
/
2
(-sin(t) cos(t) - (1 + cos(t)) sin(t))
2 2 3/2
+ (-sin(t) + (1 + cos(t)) cos(t)) )
Courbure :
.8117941501
Liste des points singuliers :
[3.141592652]
Discrétisation et courbure :
Warning, computation interrupted
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
je ne comprends pas du tout
merci |
|
Revenir en haut de page |
|
 |
romanticide
Inscrit le: 13 Mar 2005 Messages: 47
|
Posté le: 15 Mai 2005 15:38 Sujet du message: petite précision |
|
|
si on enlève else list:=false dans singulier 2 alors ça marche
mais quand on prend une courbe qui n'a pas de point singulier alors ça plante si on ne le mets pas
donc retour : faut deux procédure différente
question comment les appeler |
|
Revenir en haut de page |
|
 |
romanticide
Inscrit le: 13 Mar 2005 Messages: 47
|
Posté le: 16 Mai 2005 18:43 Sujet du message: |
|
|
bonsoir
merci beaucoup pour ta réponse
j'avais finalement trouvé la solution
il fallait initialiser mon boolean à false
mais ta réponse me plait
surtout que j'ai moins de procédure !
merci beaucoup
une petite question le i dans rectcourb ne sert pas ou bien?
et quand tu mets S:=subsop(1=NULL,S): ça permet la fois suivante de passer au deuxième point singulier
merci |
|
Revenir en haut de page |
|
 |
romanticide
Inscrit le: 13 Mar 2005 Messages: 47
|
Posté le: 16 Mai 2005 23:11 Sujet du message: |
|
|
merci encore
bonne nuit |
|
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.
|