### 6.18.3 Définition d’une fonction utilisateur

#### Généralités

On distingue les fonctions ou commandes de Xcas et les fonctions définies par l’utilisateur. Pour éviter le risque d’utiliser un nom de fonction de Xcas, il est conseillé de nommer les fonctions utilisateurs en utilisant une majuscule comme première lettre.
Pour définir des fonctions (utilisateurs), on distinguera

- les fonctions définies par une expression algébrique. Leur définition peut se faire simplement avec :=
- les fonctions qui nécessitent des calculs intermédiaires ou des structures de contrôle (test, boucle). Leur définition se fait au moyen d’un programme, en utilisant les instructions fonction...ffonction, local et retourne et les structures de contrôle.
- valeur par défaut d’une variable
  On veut définir les fonctions :
  f1 définie pour x ∈ ℝ, par f1(x)=x2+1 et
  f2 définie pour (x,y) ∈ ℝ2, par f2(x,y)=x2+y2.
  On tape simplement :
  f1(x):=x`^`2+1
  Ou on tape :
  fonction f1(x,y) x`^`2+1;ffonction
  On tape simplement :
  f2(x,y):=x`^`2+y`^`2
  Ou on tape :
  fonction f2(x,y) x`^`2+y`^`2;ffonction
  f1 est le nom de la fonction et f1 a 1 argument réel : x (en mathématique on dit que x est la variable de f1).
  La valeur de la fonction f1 est x2+y2.
  f2 est le nom de la fonction et f2 a 2 arguments réels : x,y (en mathématique on dit que x,y sont les variables de f2).
  La valeur de la fonction f2 est x2+y2.
  On peut définir la valeur par défaut de l’argument y et ainsi donner à ces 2 fonctions le même nom f.
  On tape simplement :
  f(x,y):=x`^`2+y`^`2
  On tape :
  f(x,y=1):=x`^`2+y`^`2
  Ou on tape :
  fonction f(x,y=1) x`^`2+y`^`2;ffonction
  On tape :
  f(3,4)
  On obtient :
  25
  On tape alors :
  f(3)
  On obtient :
  10

#### Définition d’une fonction de ℝp dans ℝ

On tape pour définir la fonction f : (x)−>x*sin(x) :

f(x):=x*sin(x)

Ou on tape :

f:=x->x*sin(x)

Ou on tape :

f:=fonction(x) x*sin(x);ffonction

Ou on tape :

f:=function(x) x*sin(x);end

Ou on tape :

fonction f(x) x*sin(x);ffonction

On obtient :

(x)->x*sin(x)

On tape pour définir la fonction f : (x,y)−>x*sin(y) :

f(x,y):=x*sin(y)

Ou on tape :

f:=(x,y)->x*sin(y)

Ou on tape :

f:=fonction(x,y) x*sin(y);ffonction

Ou on tape :

f:=function(x,y) x*sin(y);end

Ou on tape :

fonction f(x,y) x*sin(y);ffonction

On obtient :

(x,y)->x*sin(y)

Attention !!! ce qui se trouve après -> n’est pas évalué.
Si on a besoin de variables locales.
On tape pour définir la fonction f : (x,y)−>x*sin(y) :

f(a,b):={local c; c:=gcd(a,b) retourne a*b/c;}

Ou on tape :

f:=(a,b)->{local c; c:=gcd(a,b) retourne a*b/c;}

Ou on tape :

f:=fonction(a,b) local c; c:=gcd(a,b) retourne a*b/c;ffonction

Ou on tape :

f:=function(a,b) local c; c:=gcd(a,b) retourne a*b/c;end

Ou on tape :

fonction f(a,b) local c; c:=gcd(a,b); retourne a*b/c;ffonction

On obtient :

    (a,b)->
    { local c;
      c:=gcd(a,b);
      return(a*b/c);
    }

#### Définition d’une fonction de ℝp dans ℝq

On tape pour définir la fonction h : (x,y)−>(x*cos(y),x*sin(y)) :

h(x,y):=(x*cos(y),x*sin(y))

On tape pour définir la fonction h : (x,y)−>[x*cos(y),x*sin(y)] :

h(x,y):=[x*cos(y),x*sin(y)];

Ou on tape :

h:=(x,y)->[x*cos(y),x*sin(y)];

Ou on tape :

h(x,y):={[x*cos(y),x*sin(y)]};

Ou on tape :

h:=(x,y)->return[x*cos(y),x*sin(y)];

Ou on tape

h(x,y):={return [x*cos(y),x*sin(y)];}

Ou on tape :

h:=fonction(x,y) retourne [x*cos(y),x*sin(y)];ffonction

Ou on tape :

h:=function(x,y) return[x*cos(y),x*sin(y)];end

On obtient :

(x,y)->{return([x*cos(y),x*sin(y)]);}

Attention !!! ce qui se trouve après -> n’est pas évalué.

#### Définition d’une fonction de ℝp−1 dans ℝq à partir d’une fonction de ℝp dans ℝq

On définit la fonction f(x,y)=x*sin(y), puis on veut définir la famille de fonctions dépendant du paramètre t par g(t)(y):=f(t,y).
Comme ce qui se trouve après -> n’est pas évalué, on ne peut pas définir g(t) par g(t):=y->f(t,y) et on doit utiliser la commande unapply.
On tape pour définir les fonctions f(x,y)=xsin(y) et g(t)=y−>f(t,y) :

f(x,y):=x*sin(y);g(t):=unapply(f(t,y),y)

On obtient :

((x,y)->x*sin(y), (t)->unapply(f(t,y),y))

On tape

g(2)

On obtient :

y->2· sin(y)

On tape

g(2)(1)

On obtient :

2· sin(1)

On définit la fonction h(x,y)=(x*cos(y),x*sin(y)), puis on veut définir la famille de fonctions dépendant du paramètre t par k(t)(x):=h(x,t).
Comme ce qui se trouve après -> n’est pas évalué, on ne peut pas définir k(t) par k(t):=x−>h(x,t) et on est obligé d’utiliser la commande unapply.
On tape pour définir la fonction h(x,y) :

h(x,y):=(x*cos(y),x*sin(y))

On tape pour définir la fonction k(t) :

k(t):=unapply(h(x,t),x)

ce qui veut dire que k(t) est est une fonction de x et que k(t)(x) est égal à (x*cos(y),x*sin(y))
On obtient :

(t)->unapply(h(x,t),x)

On tape

k(2)

On obtient :

(x)->(x*cos(2),x*sin(2))

On tape

k(2)(1)

On obtient :

(2*cos(1),2*sin(1))

Ou encore On définit la fonction h(x,y)=[x*cos(y),x*sin(y)], puis on veut définir la famille de fonctions dépendant du paramètre t par k(t)(y):=h(t,y).
Comme ce qui se trouve après -> n’est pas évalué, on ne peut pas définir k(t) par k(t):=y−>h(x,y) et on est obligé d’utiliser la commande unapply.
On tape pour définir la fonction h(x,y) :

h(x,y):={[x*cos(y),x*sin(y)]}

On tape pour définir la fonction k(t) :

k(t):=unapply(h(x,t),x)

ce qui veut dire que k(t) est est une fonction de x et que k(t)(x) est égal à [x*cos(y),x*sin(y)]
On obtient :

(t)->unapply(h(x,t),x)

On tape

k(2)

On obtient :

(x)->{[x*cos(2),x*sin(2)];}

On tape

k(2)(1)

On obtient :

[2· cos(1),2· sin(1)]