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 

Utilisation de résultats issues de dsolve
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en analyse
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 26 Déc 2013 23:52    Sujet du message: Utilisation de résultats issues de dsolve Répondre en citant

Bonjour,

Je cherche à réutiliser les fonctions qui ont été déterminées suite à la résolution numérique d'une équation différentielle avec dsolve dont un extrait du code est le suivant :

Code:

Cinit:=D(psi)(0)=0,psi(0)=-0.93,D(x)(0)=0,x(0)=1.13,D(gamma)(0)=0,gamma(0)=0.79;
   D(psi)(0) = 0, psi(0) = -0.93, D(x)(0) = 0, x(0) = 1.13,

     D(gamma)(0) = 0, gamma(0) = 0.79
sol:=dsolve({sys,Cinit},numeric,output = listprocedure,'maxfun'=10^7);
fx:=eval(x(t),sol);
fxd:=eval(diff(x(t),t),sol);
fpsi:=eval(psi(t),sol);
fpsid:=eval(diff(psi(t),t),sol);
fgamma:=eval(gamma(t),sol);
fgammad:=eval(diff(gamma(t),t),sol);
eval(fgamma(2));
fgammadd:=t->eval(subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),QQ[1]/AA[1,1]));
eval(fgammadd(2));
psidd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[1]));
eval(psidd(2));
xdd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t,t)=fgammadd(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[2]));
eval(xdd(2));


Je reçois le message suivant lorsque je cherche à determiner les dérivées secondes de x(t), psi(t) et gamma(t) à partir de fomules les reliant à x(t), psi(t),gamma(t), diff(x(t),t), diff(psi(t),t), diff(gamma(t),t).

Code:
fgammadd called with arguments: 2
 #(fgammadd,1): eval(subs(diff(x(t),t) = fxd(t),x(t) = fx(t),diff(psi(t),t) = fpsid(t),psi(t) = fpsi(t),diff(gamma(t),t) = fgammad(t),gamma(t) = fgamma(t),QQ[1]/AA[1,1]))
Error, (in fgammadd) invalid input: diff received 2, which is not valid for its 2nd argument


Comment est-ce que je dois faire pour pouvoir utiliser des fonctions (dérivées secondes de x(t), psi(t) et gamma(t))à partir des fonctions issues des résultats de la résolution de mon équation? J'aimerais si possible pouvoir travers ces fonctions ?

Merci d'avance pour votre 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: 27 Déc 2013 8:55    Sujet du message: Répondre en citant

Bonjour,

Après dsolve, utiliser assign pour que les fonctions solutions de l'équa diff soient affectées aux variables correspondantes, comme ici x(t) et y(t).

Code:

> sys_ode := diff(y(t),t) = x(t),  diff(x(t),t) = -x(t):
> dsolve([sys_ode]);

           {x(t) = _C2 exp(-t), y(t) = -_C2 exp(-t) + _C1}

> assign(%):
> x(t),y(t);

                   _C2 exp(-t), -_C2 exp(-t) + _C1


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: 28 Déc 2013 23:52    Sujet du message: Répondre en citant

Bonjour,

Est-ce que vous êtes sur que la fonction assign fonctionne dans le cas d'une résolution numérique d'une équation différentielle avec dsolve et l'option numeric ?

Le code suivant m'a renvoyé un message d'erreur :

Code:

Cinit:=D(psi)(0)=0,psi(0)=-0.93,D(x)(0)=0,x(0)=1.13,D(gamma)(0)=0,gamma(0)=0.79;
   D(psi)(0) = 0, psi(0) = -0.93, D(x)(0) = 0, x(0) = 1.13,

     D(gamma)(0) = 0, gamma(0) = 0.79
dsolve({sys,Cinit},numeric,'maxfun'=10^7);


proc(x_rkf45)  ...  end;
assign(%);
Error, invalid left hand side in assignment
evalf(x(2));
                              x(2)


J'ai donc programmé de la manière suivante en regardant l'aide de la fonction dsolve avec l'option numeric (cf post précédent).

Il y a l'option output = listprocedure qui est rajoutée

Code:

Cinit:=D(psi)(0)=0,psi(0)=-0.93,D(x)(0)=0,x(0)=1.13,D(gamma)(0)=0,gamma(0)=0.79;
   D(psi)(0) = 0, psi(0) = -0.93, D(x)(0) = 0, x(0) = 1.13, D(gamma)(0) = 0, gamma(0) = 0.79
sol:=dsolve({sys,Cinit},numeric,output = listprocedure,'maxfun'=10^7);
fx:=eval(x(t),sol);
fxd:=eval(diff(x(t),t),sol);
fpsi:=eval(psi(t),sol);
fpsid:=eval(diff(psi(t),t),sol);
fgamma:=eval(gamma(t),sol);
fgammad:=eval(diff(gamma(t),t),sol);
eval(fgamma(2));
fgammadd:=t->eval(subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),QQ[1]/AA[1,1]));
eval(fgammadd(2));
psidd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[1]));
eval(psidd(2));
xdd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t,t)=fgammadd(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[2]));
eval(xdd(2));


Voici un extrait du code permettant de lancer la résolution du système. Pour info, le système d'équations différentielles est complexe mais il a été vérifié et il correspond aux équations de la dynamique d'un système bielle manivelle.

https://www.nextsend.com/download/lbziyOi2qIKY586r57ugYNnH1Z6UuKV6npure7FWY6aXfq+DZVGp/

Merci pour votre 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: 29 Déc 2013 10:34    Sujet du message: Répondre en citant

Bonjour,
Effectivement, on ne peut assigner les solutions lorsque on résout avec l'option numeric.
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: 29 Déc 2013 10:55    Sujet du message: Répondre en citant

OK. Merci pour ta confirmation.
As-tu des idées pour que je puisse faire le calcul de mes fonctions avec le procédé présenté précédemment utilisant l'option "output = listprocedure" ?

Je n'arrive pas à voir ce que je dois corriger pour pouvoir utiliser les fonctions définis à partir de eval(fonction,sol).

Ou en d'autres termes comment je peux faire pour calculer mes fonctions accélérations fgammadd, psidd, xdd à partir des fonctions déterminées suite au calcul du dsolve ?

fx:=eval(x(t),sol);
fxd:=eval(diff(x(t),t),sol);
fpsi:=eval(psi(t),sol);
fpsid:=eval(diff(psi(t),t),sol);
fgamma:=eval(gamma(t),sol);
fgammad:=eval(diff(gamma(t),t),sol);

Merci 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: 29 Déc 2013 14:28    Sujet du message: Répondre en citant

Bonjour,
Je construis dans cet exemple à partir de la solution obtenue par dsolve des listes de valeurs, ici du type [t,x(t)] ou [t, x'(t)]. J'aurais pu faire aussi lambda,y, ou y'.
C'est facilement adaptable à ton exemple.

Code:


> restart:
> dsys:= {
>    diff(x(t),t,t) = -2*lambda(t)*x(t),
>    diff(y(t),t,t) = -2*lambda(t)*y(t)-Pi^2,
>    x(t)^2+y(t)^2 = 1,
>    x(0)=0, D(x)(0)=1/10, y(0)=-1, D(y)(0)=0};
> dsol := dsolve(dsys, numeric);
> dsol(1);
>

               2       2
  dsys := {x(t)  + y(t)  = 1, x(0) = 0, y(0) = -1,

         2
        d
        --- x(t) = -2 lambda(t) x(t),
          2
        dt

         2
        d                                2
        --- y(t) = -2 lambda(t) y(t) - Pi , D(x)(0) = 1/10,
          2
        dt

        D(y)(0) = 0}


               dsol := proc(x_rkf45_dae)  ...  end proc


  [t = 1., lambda(t) = 4.93980221499583,

                                   -5  d
        x(t) = 0.633398801848937 10  , -- x(t) = -0.100000139089421,
                                       dt

                                   d                              -6
        y(t) = -0.999999999836515, -- y(t) = -0.624735803825431 10  ]
                                   dt

> X:=NULL: DX:=NULL:
> for k to 256 do # maxfun=256 par défaut
>   d:=dsol(k):
>   X:=X,[rhs(d[1]),rhs(d[3])]: DX:=DX,[rhs(d[1]),rhs(d[4])]:
> od:
> X:=[X]: DX:=[DX]:
 
> X[10]; DX[10];  # x et dx/dt à l'instant t=10
 

                    [10., -0.0000634141921033484]


                       [10., 0.100001244303503]

> X[10][2]; DX[10][2]; # valeurs x(10) et dx/dt (10)

                        -0.0000634141921033484


                          0.100001244303503



Est ce que cela te convient?
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: 30 Déc 2013 11:21    Sujet du message: Répondre en citant

Merci c'est interessant.

Par contre, est-ce que l'on ne peut pas utiliser les fonctions créer avec la syntaxe eval(x(t),sol) ?

En effet, avec la solution par liste de valeurs, il faut encore modifier le programme si l'on veut évaluer les fonctions pour une valeur du temps non entière par exemple t=10.3 s.
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: 30 Déc 2013 15:38    Sujet du message: Répondre en citant

Ca ne semble pas fonctionner avec la syntaxe eval(x(t),sol) sur mon exemple du précédent post.

Sinon en rajoutant un pas par exemple de 0.1 dans la boucle on peut évaluer pour des valeurs non entières.

A+
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: 31 Déc 2013 11:09    Sujet du message: Répondre en citant

Bonjour,

Merci pour ton aide régulier.
J'ai essayé sur le programme test avec la syntaxe eval(x(t),sol). Cà fonctionne par contre il faut rajouter l'option "output = listprocedure".

Voici le programme test :

Code:

restart:
dsys:= {  diff(x(t),t,t) = -2*lambda(t)*x(t), diff(y(t),t,t) = -2*lambda(t)*y(t)-Pi^2,  x(t)^2+y(t)^2 = 1, x(0)=0, D(x)(0)=1/10, y(0)=-1, D(y)(0)=0};
dsol := dsolve(dsys, numeric, output=listprocedure);
fx := eval(x(t),dsol);
fx(10);


Je me suis donc peut-être pas exprimé clairement dans les précédents posts.

J'arrive avec la procédure ci-dessous à déterminer des fonctions numériques qui sont les résultats de l'équation différentielle. Par contre, je n'arrive pas à réutiliser les fonctions qui ont été déterminées suite à la résolution numérique d'une équation différentielle avec dsolve dont un extrait du code est le suivant :

Code:

Cinit:=D(psi)(0)=0,psi(0)=-0.93,D(x)(0)=0,x(0)=1.13,D(gamma)(0)=0,gamma(0)=0.79;
D(psi)(0) = 0, psi(0) = -0.93, D(x)(0) = 0, x(0) = 1.13,

D(gamma)(0) = 0, gamma(0) = 0.79
sol:=dsolve({sys,Cinit},numeric,output = listprocedure,'maxfun'=10^7);
fx:=eval(x(t),sol);
fxd:=eval(diff(x(t),t),sol);
fpsi:=eval(psi(t),sol);
fpsid:=eval(diff(psi(t),t),sol);
fgamma:=eval(gamma(t),sol);
fgammad:=eval(diff(gamma(t),t),sol);
eval(fgamma(2));
fgammadd:=t->eval(subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),QQ[1]/AA[1,1]));
eval(fgammadd(2));
psidd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[1]));
eval(psidd(2));
xdd:=t->subs(diff(x(t),t)=fxd(t),x(t)=fx(t),diff(psi(t),t)=fpsid(t),psi(t)=fpsi(t),diff(gamma(t),t,t)=fgammadd(t),diff(gamma(t),t)=fgammad(t),gamma(t)=fgamma(t),rhs(equ[2]));
eval(xdd(2));

Je reçois le message suivant lorsque je cherche à determiner les dérivées secondes de x(t), psi(t) et gamma(t) à partir de fomules les reliant à x(t), psi(t),gamma(t), diff(x(t),t), diff(psi(t),t), diff(gamma(t),t).

Code:
fgammadd called with arguments: 2
#(fgammadd,1): eval(subs(diff(x(t),t) = fxd(t),x(t) = fx(t),diff(psi(t),t) = fpsid(t),psi(t) = fpsi(t),diff(gamma(t),t) = fgammad(t),gamma(t) = fgamma(t),QQ[1]/AA[1,1]))
Error, (in fgammadd) invalid input: diff received 2, which is not valid for its 2nd argument

Du coup, là je pense que je dois faire une erreur de syntaxe mais pas bien méchante. Mais bon encore faut-il la trouver...

Comment est-ce que je dois faire pour pouvoir utiliser des fonctions (dérivées secondes de x(t), psi(t) et gamma(t))à partir des fonctions issues des résultats de la résolution de mon équation?
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: 31 Déc 2013 12:03    Sujet du message: Répondre en citant

Bonjour,
Je pense que l'erreur vient du remplacement dans diff(fgamma(t),t) de t par 2.
Mieux vaudrait utiliser partout à la place des diff l'opérateur différentiel D:
D(fgamma)(t) qui ne poserait pas de problème puisque D(fgamma) est une fonction.

Bon réveillon.
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: 31 Déc 2013 17:05    Sujet du message: Répondre en citant

En effet, c'est pas mal. Bien plus simple et compact que le code que j'avais fait initialement.

Par contre, çà marche pour la dérivée première mais pas la dérivée seconde. Même avec un evalf, çà ne change pas.

J'ai beau regarder je ne vois pas ce qui manque et l'aide sur la fonction D ne donne pas d'exemple à ce sujet.

Pourtant je n'ai pas encore bu de champagne...

Code:

fx:=eval(x(t),sol);
fxd:=D(fx);
fxdd:=(D@@2)(fx);
fx(2);
evalf(fxd(2));
evalf(evalf(fxdd(2)));
fpsi:=eval(psi(t),sol);
fpsid:=D(fpsi);
fxdd:=(D@@2)(fpsi);
fx(2);
evalf(fpsid(2));
evalf(evalf(fpsidd(2)));
fgamma:=eval(gamma(t),sol);
fgammad:=D(fgamma);
fgammadd:=(D@@2)(fgamma);
fgamma(2);
evalf(fgammad(2));
evalf(fgammadd(2));
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: 01 Jan 2014 13:26    Sujet du message: Répondre en citant

Bonne année à toi.

On peut transformer une expression expr en une fonction d'une variable x par exemple, par la fonction unapply:

f:=unapply(expr,x)

L'opérateur D agit sur une fonction f.

D(f) est la fonction dérivée première de f
D(f)(x) est f'(x), nb dérivé premier de f en x

(D@@2)(f) est la fonction dérivée seconde de f
(D@@2)(f)(x) est f"(x), nb dérivé second de f en x.

Allez, je vais retourner aux agapes du 1er janvier.
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: 03 Jan 2014 16:43    Sujet du message: Répondre en citant

Bonjour,

Mon problème reste entier car fx est déjà une fonction (ou procédure) et pas une expression.
Je n'arrive tjs pas déterminer la dérivée seconde avec mon code.
Merci 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: 04 Jan 2014 12:20    Sujet du message: Répondre en citant

Bonjour,
Il me semble difficile de pouvoir obtenir les dérivées secondes à partir du système différentiel du premier ordre résolu avec l'option numeric.
Une idée, je ne sais pas si elle est réalisable pour toi:
en dérivant le système différentiel par rapport à t, et en rajoutant des conditions initiales sur les dérivées secondes, peut-être obtiendra-t-on les dérivées premières et secondes des fonctions solutions du nouveau système différentiel du second ordre obtenu, résolu lui aussi en numérique.
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: 04 Jan 2014 16:03    Sujet du message: Répondre en citant

Bonjour,

Merci pour ton conseil.
Je crois que la dérivée d'une fonction défini (on dira) numériquement n'est pas simple.
En tout cas, je crois que tu m'as donné l'idée pour continuer.
Il faut que je reparte de mon système différentiel qui s'écrit sous la forme A*diff(v(t),t,t)=Q (cf message résolution de DAE sur le forum).
Cette fois-ci il ne faut par contre pas que je résolve le système différentiel mais que je m'en serve pour exprimer le vecteur des dérivées secondes en fonction des fonctions et de leurs dérivées premières.
Je crois que je n'ai pas été très clair. Je vais expérimenter et te tiendrais au courant.
Mais, avant je dois refaire fonctionner mon maple 17.
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 analyse Toutes les heures sont au format GMT + 2 Heures
Aller à la page 1, 2  Suivante
Page 1 sur 2

 
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.