Définition d’une fonction utilisateur

### 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)]`