Programmation Maple

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

programmation Maple

par mathieuH » 16 Sep 2008, 17:58

Bonjour,

je cherche a programmer en Maple une fonction 'deriv' de dérivation multivariable de ce genre:

fun := p-> p(1)+p(2);
fun_derive:=deriv(fun,p,2);
fun_derive([1,3]);

le 2 étant la pour spécifier que p a 2 variables 'internes'

J'ai essayé sans succès de construire une 'proc', peut etre connaissez vous un built in...

merci d'avance.



phryte
Membre Irrationnel
Messages: 1406
Enregistré le: 05 Juil 2008, 17:09

par phryte » 18 Sep 2008, 07:56

Slt.
Un exemple :
f := (p1,p2)-> p1+p2; > f_derive:= diff(f(y*x^2,x*y^2),x,y); > x:=1:y:=1: > eval(f_derive);

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 18 Sep 2008, 08:30

Slt,
heu, je ne vois pas ou est la fonction derivee multivariable. En fait je veux un équivalent de diff(f(p),p) mais pour p

kazeriahm
Membre Irrationnel
Messages: 1608
Enregistré le: 04 Juin 2006, 09:49

par kazeriahm » 18 Sep 2008, 11:02

Salut

ca n'a pas de sens de dériver par rapport à un vecteur (enfin pas que je sache) en dimension >2

peut-être veux tu calculer la différentielle de f ?

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 18 Sep 2008, 12:24

non, en fait, je voudrais calculer la jacobienne.
c'est a dire l'application:

phryte
Membre Irrationnel
Messages: 1406
Enregistré le: 05 Juil 2008, 17:09

par phryte » 18 Sep 2008, 14:00

Tu veux faire ça par exemple :
w = [x*y*z; y; x+z];
R = jacobian(w)
==>
[ y*z, x*z, x*y]
[ 0, 1, 0]
[ 1, 0, 1]

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 18 Sep 2008, 14:35

oui, exactement.

phryte
Membre Irrationnel
Messages: 1406
Enregistré le: 05 Juil 2008, 17:09

par phryte » 19 Sep 2008, 15:45

Slt.
Un exemple pour une matrice (1,3) :[x*y*z,y,x+z] (on peut mieux faire !) :

J:=linalg[matrix](1,3,[x*y*z,y,x+z]):
> deriv := proc(f,x,y,z,n,m) local lig,jac,k;k:=0;jac:=linalg[matrix](3,3,[[0,0,0],[0,0,0],[0,0,0]]); for lig from 1 to m do k:=k+1;jac[lig,1]:=
> diff(f[n,k],x);jac[lig,2]:= diff(f[n,k],y);jac[lig,3]:= diff(f[n,k],z);od;eval(jac);end:
> deriv(J,x,y,z,1,3);
donne :
[y z x z x y]
[ 0 1 0 ]
[ 1 0 1 ]

XENSECP
Habitué(e)
Messages: 6387
Enregistré le: 27 Fév 2008, 19:13

par XENSECP » 19 Sep 2008, 15:48

maple... ca me rappelle le bon temps ^^

On a pas un expert (enfin un mec qui se dit expert) en MAPLE sur le fofo ? Un 'membre complexe' ?

Sinon ba je veux bien essayer de t'aider si tu tape correctement les lignes de codes :)

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 19 Sep 2008, 16:54

mathieuH a écrit:non, en fait, je voudrais calculer la jacobienne.
c'est a dire l'application:

Dans le package linalg, il y a la fonction jacobian. Elle ne te convient pas ?

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 23 Sep 2008, 17:17

oui, en fait c'est exactement ce que je veux, mais il faut lui entrer en 'dur' le nombre de variables:
jacobian(fun,{p1,p2,p3}).

je voudrais une fonction
jacobian2(fun,p,3)

mon probleme est que je n'arrive pas a faire renvoyer une fonction par une procedure (proc)

par exemple, je voudrais pouvoir faire:

> fun:=p-> p[1]+p[2]*p[1];
(..)
> fun([1,2]);
3
> fun_der := jacobian2(fun,p,2);
(..)
> fun_der([1,2]);
[3,1]

mais je n'y arrive pas. Quoi que je fasse, je n'arrive pas à faire retourner une fonction à la procedure jacobian2

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 24 Sep 2008, 12:39

Et avec
Code: Tout sélectionner
jacobian2 := proc(fun,p,n)
  local i,j,s ;
  s := seq(p[i], i=1..n) ;
  j := jacobian([fun( [s] )], [s]) ;
  RETURN(unapply( j , s) );
end ;

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 24 Sep 2008, 13:12

ben non, ca ne marche pas:

j'ai fait une impression ecran mais je n'arrive pas a la mettre dans le message...

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 24 Sep 2008, 15:35

je recopie ce que donne mapple

>fun:=p->matrix(1,2,[p[2],1]);
fun:=p->matrix(1,2,[p[2],1]);

> fun([3,2]);
[2,1]

> jacobian2 := proc(fun,p,n)
local i,j,s;
s:=seq(p[i],i=1..n);
j:= jacobian([ fun( [s] ) ],[s]);
RETURN(unapply(j,s));
end proc;

(... je recopie pas)

> fun_der:=jacobian2(fun,p,2);
fun_der:=(p_1,p_2)->jacobian(array(1..1,1..2,[(1,1)=p_2,(1,2)=1]),[p_1,p_2])

> fun_der([3,2]);
Error, (in fun_der) fun_der uses a 2nd argument, p_2, which is missing

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 24 Sep 2008, 16:16

mathieuH a écrit:> fun:=p-> p[1]+p[2]*p[1];


mathieuH a écrit:fun:=p->matrix(1,2,[p[2],1]);


Oui, mais si tu changes le type des objets à chaque message, ça ne peut pas aller ... Précise bien les types de tes trucs, une fois pour toutes, et après je pourrais peut-être d'aider.

mathieuH
Membre Naturel
Messages: 59
Enregistré le: 07 Aoû 2008, 14:35

par mathieuH » 24 Sep 2008, 16:35

Certes, je me suis un peu troué...

bon disons que mon dernier post correspond à ce que je voudrais..

abcd22
Membre Complexe
Messages: 2426
Enregistré le: 13 Jan 2006, 14:36

par abcd22 » 24 Sep 2008, 17:45

Bonjour,
mathieuH a écrit:
> fun_der([3,2]);
Error, (in fun_der) fun_der uses a 2nd argument, p_2, which is missing

La fonction retournée par jacobian2 attend 2 arguments (s est une « séquence » de 2 éléments) et tu lui en donnes un seul, peut-être en renvoyant unapply(j, [s]) dans jacobian2 (apparemment il faut mettre des variables donc ça m'étonnerait que ça marche) ? On ne peut pas mettre s:= [seq(p[i], i = 1..n)] dès le départ et supprimer les crochets dans la définition de j ?

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 24 Sep 2008, 21:16

mathieuH a écrit:Certes, je me suis un peu troué...
bon disons que mon dernier post correspond à ce que je voudrais..

Personnellement, je prendrais plutôt une matrice colonne pour f(p) (et non une matrice ligne). Et tu es sûr de vouloir travailler avec des matrices ? parce que maple et les matrices, ça fait vraiment deux ! :we:

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 24 Sep 2008, 21:26

Bon voilà un truc qui fonctionne avec f(p) une matrice colonne :

Code: Tout sélectionner
with(linalg) :
 
jacobian2 := proc(f,n) local p,L,fp,s ;
   fp := f(p) ;
   L := [seq([seq( diff(fp[i,1], p[j]), j=1..n)], i=1..rowdim(fp))];
   s := seq(p[i],i=1..n) ;
   RETURN( matrix@unapply(L, s)@op );
end :



Ne dîtes pas que cela ne fonctionne pas : je viens de tester cette fois :zen:
Remarquer que la fonction jacobian2 n'a pas besoin de paramètre "p" puisque tout est "fonction".

Code: Tout sélectionner
> f := p -> matrix(2,1,[p[1]*p[2]+p[3]^4,p[2]^2*p[3]]);

                                               4      2
       f := p -> matrix(2, 1, [p[1] p[2] + p[3] , p[2]  p[3]])

> jf := jacobian2(f,4) ;

  jf := matrix@((p_1, p_2, p_3, p_4) ->

                         3                        2
        [[p_2, p_1, 4 p_3 , 0], [0, 2 p_2 p_3, p_2 , 0]])@op

> jf([a,b,c,d]);

                      [                 3     ]
                      [b      a      4 c     0]
                      [                       ]
                      [                2      ]
                      [0    2 b c     b      0]

>


PS : une session en ASCII, c'est pas le top, mais bon, à défaut de mieux...

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 25 Sep 2008, 07:30

Bon voilà un truc qui fonctionne avec f(p) une matrice colonne :

Code: Tout sélectionner
with(linalg) :
 
jacobian2 := proc(f,n) local p,L,fp,s ;
   fp := f(p) ;
   L := [seq([seq( diff(fp[i,1], p[j]), j=1..n)], i=1..rowdim(fp))];
   s := seq(p[i],i=1..n) ;
   RETURN( matrix@unapply(L, s)@op );
end :



Ne dîtes pas que cela ne fonctionne pas : je viens de tester cette fois :zen:
Remarquer que la fonction jacobian2 n'a pas besoin de paramètre "p" puisque tout est "fonction".

Code: Tout sélectionner
> f := p -> matrix(2,1,[p[1]*p[2]+p[3]^4,p[2]^2*p[3]]);

                                               4      2
       f := p -> matrix(2, 1, [p[1] p[2] + p[3] , p[2]  p[3]])

> f(x);

                         [                4]
                         [x[1] x[2] + x[3] ]
                         [                 ]
                         [       2         ]
                         [   x[2]  x[3]    ]

> jf := jacobian2(f,4) ;

  jf := matrix@((p_1, p_2, p_3, p_4) ->

                         3                        2
        [[p_2, p_1, 4 p_3 , 0], [0, 2 p_2 p_3, p_2 , 0]])@op

> jf([a,b,c,d]);

                      [                 3     ]
                      [b      a      4 c     0]
                      [                       ]
                      [                2      ]
                      [0    2 b c     b      0]

>


PS : une session en ASCII, c'est pas le top, mais bon, à défaut de mieux...

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 44 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite