Kurs  Cours

9. Funktionen definieren
 Définir des fonctions

Die Gliederung dieses Kurses folgt in groben Zügen dem Buch von Nancy Blachman: A Practical Approach.... 
Hinweis: Kapitel 9 lesen!
Run mit WIN+Mathematica Version 5.2

 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... 
Indication: Lire le chapitre 9.
Testé avec Mathematica version 5.2+WIN

WIR94/98/99/2000/2007 // Copyright Rolf Wirz

9.1. Einfache Funktionen
     Fonctions simples

9.1.1. Funktionen selber schreiben: Falls in Mathematica die gewollte Funktion nicht schon vorhanden ist, kann man versuchen, sie selber zu schreiben.
 Ecrire les fonctions soi-même: Si la fonction voulue n'est pas contenue dans Mathematica, on peut l'écrire soi-même.

Erst "Clear", damit keine Ueberraschung auftritt! Beispiel: Quadrieren...
  D'abord "Clear", pour ne pas avoir de susrprise! Exemple: Elever au carré...

Clear[quadrat];
quadrat[x]:=x^2;
quadrat[x]

{quadrat[y], quadrat[5], quadrat[12]}

Offenbar klappt es bei dieser Funktion nicht mit demVariablenwechsel resp. mit dem Einsetzen von Werten. Wieso?
  Il est évident que le changement de variables ne fonctionne pas pour cette fonction, le placement de valeurs non plus. Pourquoi?

??quadrat

?_

Die Variable x ist kein "Muster", das für irgend einen andern Ausdruck oder Wert stehen kann. Nehmen wir "x_" statt "x", so klappt es:
  La variable x n'est pas un "patron" qui peut remplacer une expression ou une valeur quelconque. Si nous prenons "x_" au lieu de "x", cela fonctionne:

Clear[quadrat1];
quadrat1[x_]:=x^2;
quadrat1[x]

{quadrat1[y], quadrat1[5], quadrat1[12]}

??quadrat1

Oder:    Ou:

Table[quadrat1[n],{n,12}]

Oder:    Ou:

quadrat1[9z^3+2z-1]

quadrat1[9z^3+2z-1] // Expand

Oder:    Ou:

9.1.2. Funktionen mit mehreren Variablen:
       Fonction avec plusieurs variables:

Ein Beispiel, dass alles sagt (Cosinus-Satz):
  Un exemple qui dit tout (théorème du cosinus):

Clear[c];
c[a_, b_, gamma_] = Sqrt[a^2 + b^2  
					- 2 a b Cos[gamma]];
c[u, v, w]

c[3, 5, Pi/3]

9.1.3. Funktionen definiert in mehreren Schritten:
       Fonctions définies en plusieurs étapes:

Beispiel: Umrechnung in Polarkoordinaten:
  Exemple: Transformation en coordonnées polaires:

PolarTransformation[r_, phi_] := (
			x = r Cos[phi];
			y = r Sin[phi];
			{x, y}               );
PolarTransformation[a, b]

Neudefinition: Die Umrechnung in Polarkoordinaten könnte auch für einen Vektor aufgerufen werden. Daher ist eine zweite Definition ratsam:
  Nouvelle définition: La transformation en coordonnées polaires pourrait être appelée aussi pour un vecteur. C'est pourquoi on conseille une deuxième définition:

PolarTransformation[{r_, phi_}] := 
				PolarTransformation[r, phi];
PolarTransformation[{a, b}]

PolarTransformation[{3, 2}]

PolarTransformation[3, 2]

PolarTransformation[3, 2] // N

9.2. Typenprüfung
      Examen de types

9.2.1. f[arg_typ]       f[arg_typ]

"f[arg_typ]" funktioniert nur, falls gilt "Head[arg] === typ". Probiere:
  
"f[arg_typ]" fonctionne seulement s'il vaut "Head[arg] === typ". Essaie:

?Binomial

Clear[pascal];
pascal[n_Integer]:=Table[Binomial[n,i],{i,0,n}];

pascal[0]

pascal[1]

pascal[2]

pascal[3]

pascal[4]

pascal[5]

pascal[5.6]

pascal[6/5]

Ein anderes Beispiel (ausprobieren):
  Autre exemple (essayer):

Clear[mittelWert];

mittelWert[x_List] := Apply[Plus, x]/Length[x];
mittelWert[{1,2,3,4,5}]

mittelWert[1,2,3,4,5]

Test, ob ein Ausdruck ein Polynom, eine Primzahl, ein Vektor u.s.w. ist, d.h. ob ein Ausdruck unter einer Prädikatenfunktion "wahr" ergibt. Beispiel:
  Tester si une expression est un polynôme, un nombre premier, un vecteur etc., c'est-à-dire, si une expression est "vraie" sous une fonction de prédicats. Exemple:

?*Q

{PrimeQ[45], PrimeQ[17]}

Anwendung auf die Definition einer Funktion:
  Application à la définition d'une fonction:

Clear[halb];
halb[x_?EvenQ] := x/2;
{halb[1], halb[2], halb[3], halb[4], halb[5]}

{halb[2], halb[4], halb[6], halb[8], halb[9]}

Was ist passiert?
  Que s'est-il passé?

Ein Beispiel in mehreren Schritten:
  Un exemple en plusieurs étapes:

Remove[signum];
signum[0                      ] :=  0;
signum[x_/; Positive[x]==True ] :=  1;
signum[x_/; Negative[x]==True ] := -1;

{signum[3], signum[-1], signum[0], signum[2]}

??Positive

??Integer

Positive[1]

signum[1]

??signum

9.3. Bedingte Ausführung
     Exécution conditionnée

Betrachte das obige Beispiel mit "signum"!
 Considère l'exemple ci-dessus avec "signum"!

Bei der Definition von "signum" ist in der Klammer "[ ]" nach "x_" das Symbol "/;" angegeben. Darauf folgt jeweils eine Bedingung!  Damit können Funktionen punktweise oder intervallweise definiert werden!!!!!! Anwendungen:
  Dans la définition de "signum", le symbole "/;" est indiqué dans la parenthèse "[ ]" après "x_". Il suit chaque fois une condition! Ainsi on peut définir des fonctions ponctuellement ou par intervalles! Applications:

Plot[signum[x], {x, -3, 3}];

Oder:    Ou:

Clear[rechteck];
rechteck[x_/; (-1<=x && x<=1) ]:= 2;
rechteck[x_/; Abs[x] > 1      ]:= 0;
Plot[rechteck[x], {x, -3, 3}];

Etwas "schöner":
  Un peu plus esthétiquement:

Plot[rechteck[x], {x, -3, 3},
	PlotStyle -> {{Thickness[0.01],
				   GrayLevel[0.4]}}];

Solche Funktionen können sogar integriert werden:
  On peut même intégrer de telles fonctions:

??rechteck

NIntegrate[rechteck[x], {x, -1, 1}]

NIntegrate[rechteck[x], {x, -3, 3}]

Was ist passiert? Studiere:
  Que s'est-il passé? Etudie:

?Which

Remove[funkt];
funkt[x_] := Which[x<=Pi,-2 Sin[x],x>Pi,
			(x^1.3-Pi^1.3) Cos[x]];
Plot[funkt[x],{x,-2Pi,3Pi}];

Remove[funkt];
funkt[x_] := Which[x<=Pi,2 Sin[x],x>Pi,
			(x^1.3-Pi^1.3) Cos[x]];
Plot[funkt[x],{x,-2Pi,3Pi}];

9.4. Vorgegebene Werte
     Valeurs données

9.4.1. Das Muster "x_.":
 Le patron ("Pattern") "x_.":

Das Muster "x_." bewirkt, dass x "default" mit dem neutralen Element der am 
"stärksten" mit x verknüpften Operation belegt wird. Dazu ein Beispiel:
  Le patron "x_." fait que x "default" est occupé par l'élément neutre de l'opération qui est le plus "fortement" lié à x. Voici un exemple:

Clear[f];
f[x_. + y_. z_.^e_.] := {x, y, z, e};

Clear[f];
f[x_. + y_. z_^e_.] := {x, y, z, e};

?f

f[4]

{f[0], f[1], f[2], f[3], f[4], f[5]}

{x, y, z, e}

Finde heraus, welche Werte "default" jeweils für x, y, z und e genommen worden sind und wieso!
  Cherche quelles valeurs "default" ont été prises respectivement pour x, y, z et e et pour quelle raison!

9.4.2. Das Muster "x_:" :
       Le patron "x_:" :

Das Muster "x_:Wert" bewirkt, dass x "default" mit Wert belegt wird. Dazu ein Beispiel:
  Le patron "x_:Valeur" fait que x "default" est occupé par valeur. Voici un exemple:

Clear[UnserBereich];
UnserBereich[start_:34, ziel_] := 
					Range[start, ziel];
UnserBereich[100]

UnserBereich[80, 100]

UnserBereich[36]

UnserBereich[34]

UnserBereich[30]

9.5. Die Abarbeitungshierarchie bei Regeln

Mathematica bearbeitet die spezielleren Regeln vor den generelleren Regeln. Mit "?" kann die Abarbeitungshierarchie eingesehen werden.
  Mathematica travaille les règles spéciales avant les règles générales. Avec "?" on peut voir la hiérarchie de travail.

Clear[r];
r[x_]       := x^2;
r[x_Integer]:= x;
r[5]        := 11;
?r

Beachte, dass die Reihenfolge der Ausgabe nicht mit der der Eingabe übereinstimmt. Wieso wohl?
Considère que l'ordre de la sortie ne correspond pas à celui de l'entrée. Pourquoi?

{r[5], r[5.5], r[6], r[r.5], r[7]}

9.6. Zusammenfügen von Regeln mit "f/: "
     Assemblage de règles par "f/: "

Operationen links vom Zeichen ":= "
 Opérations à gauche du signe ":= "

Z.B. f[x_] + g[x_] := h[x_] "funktioniert" nicht. Beispiel:
  P.ex. f[x_] + g[x_] := h[x_] ne "fonctionne" pas. Exemple:

f[x_] + g[x_] := h[x_]

Wie lässt sich das Funktionieren trotzdem erzwingen? - 
Dafür ist das Symbol "f/ : " vorgesehen. Studiere das folgende Beispiel:
  Comment obtenir quand même le fonctionnement? -
Pour cela est prévu le symbole "f/ : ". Etudie l'exemple suivant:

Remove[f];
f/: f[x_] + g[x_] := h[x_]

?f

f[5] + g[5]

f wird hier assoziiert mit f[x]+g[x] := h[x]. Wird  f[x]+g[x] gerufen, so erscheint h[x]. Andernfalls erscheint   f[x] oder f[x1]+g[x2].
  Ici on associe f avec f[x]+g[x] := h[x]. Si on appelle f[x]+g[x], il arrive h[x]. Autrement il apparaît f[x] ou f[x1]+g[x2].

f[5]

f[5] + g[6]

Beispiel:    Exemple:

Remove[f];
f/: f[x_] + Sin[x_] := x^3;
f[3] + Sin[3]

Vergleiche:    Compare:

??_

?_.

?:

?/;

???

9.7. Dokumentieren der eigenen Funktionen
     Documenter les propres fonctions

9.7.1. Verschiedenes Verhalten einer 
          Transformationsregel:
       Comportement différent d'une règle de 
         transformation

Beachte, dass die Regel s[-x_] :> -s[x] den Ausdruck s[-a] in -s[a] transformiert, s[-3] aber nicht transformiert. Was wird mit s[1-x] geschehen und wieso? 
  Considère que la règle s[-x_] :> -s[x] transforme l'expression s[-a] en -s[a], mais ne transforme pas s[-3]. Que se passe-t-il avec s[1-x] et pourquoi?

sRegel = s[-x_] :> -s[x]

s[-a] /. sRegel

s[-3] /. sRegel

Wieso geschieht das? Beobachte, wie Mathematica -a und -3 interpretiert:
  Pourquoi cela arrive-t-il? Observe comment Mathematica interprète -a et -3:

FullForm[-a]

FullForm[-3]

Der Ausdruck -a ist mit dem Muster -(x_) verträglich, der Ausdruck -3 nicht.
  L'expression -a est compatible avec le patron -(x_), l'expression -3 ne l'est pas.

FullForm[1-x]

Der Ausdruck (1-x) ist mit dem Muster -(x_) nicht verträglich:
 L'expression (1-x)  n'est pas compatible avec le patron -(x_).

s[1-x] /. sRegel

9.7.2. Der Ausdruck ' Funktion ::usage = "Erklärung" '
        L'expression ' Funktion ::usage = "explication" '

Bisher ist öfters schon das Symbol "?" erschienen. Damit ist einige Information abrufbar. Beispiel:
  Jusqu'à présent le symbole "?" est apparu plusieurs fois. Par cela on peut appeler bien de l'information. Exemple:

?f

?Sin

??Sin

Manchmal möchte man aber gern dem System eigene Kommentare einverleiben, die dann wieder abgerufen werden können. Das ist möglicn mit "...::usage=...". 
Beispiel:  Wir verwenden die oben definierte Funktion "pascal".
  Parfois on aimerait incorporer au système ses propres commentaires, qu'on pourrait de nouveau appeler. Cela est possible avec "...::usage=...".
Exemple: Nous employons la fonction "pascal" définie ci-dessus.

Clear[pascal];
pascal[n_Integer]:=Table[Binomial[n,i],{i,0,n}];

?pascal

Wir fügen nun an:
  Nous ajoutons:

pascal::usage = "pascal[n] gibt die n-te Zeile 
des Pascalschen Dreiecks aus - sort la ligne n
du triangle de Pascal."

Abfragen:    Appeler:

?pascal

??pascal

Gute Sache, nicht?  
  C'est bon, n'est-ce pas?

9.8. Attribute
     Attributs

Spezielle Funktionen bestimmen:
 Déterminer des fonctions spéciales:

Funktionen haben Attribute. Beispiel "Sinus": 
  Les fonctions ont des attributs. Exemple "Sinus":

Attributes[Sin]

??Attributes

??Attributes

Die möglichen Attribute sind vom System vorgegeben. Einige Beispiele:
  Les attributs possibles sont donnés par le système. Quelques exemples:

??Constant

?Flat

?Hold*

?HoldAll

?HoldFirst

?HoldRest

?Listable

?Locked

?Orderless

?Protected

?ReadProtected

9.9. Die Art der Abarbeitung eines Ausdrucks
     La façon de travailler une expression

9.9.1. Normalfall
       Cas normal

Folgende Reihenfolge ist im System voreingestellt: Zuerst Kopf des Ausdrucks abarbeiten. Dann Elemente (Teile) des Ausdrucks abarbeiten.
Wenn ein Element kein Atomarer Ausdruck ist: Teile des Elements abarbeiten etc..  Dieses Procedere wird rekursiv angewandt. 
  L'ordre suivant est déjà réglé dans le système: Travailler d'abord l'en-tête de l'expression. Travailler ensuite les éléments (parties) de l'expression. Si un élément n'est pas une expression atomique: Procéder par parties etc.. Ce procédé est appliqué récursivement.

9.9.2. Ausnahmefall
        Exception

Wenn ein Element oder Ausdruck das Attribut HoldFirst, HoldAll, HoldRest hat oder die Funktion Evaluate aufruft, wird die Voreinstellung durchbrochen. Erkunde, wo solche Attribute vorkommen:
  Quand un élément en une expression a l'attribut HoldFirst, HoldAll, HoldRest ou appellent la fonction Evaluate, le règlement préalable est interrompu. Cherche où se trouvent de tels attributs:

??Sin

??Plot

??Table

??Attributes

??Evaluate

Vergleiche die Resultate bei Abänderung der Abarbeitungsreihenfolge und erkläre den Unterschied der Resultate:
  Compare les résultats lors des changements de l'ordre de travail et explique la différence des résultats:

Table[Random[], {5}]

Table[Evaluate[Random[]], {5}]

Wieso kommt das so, wie es kommt?
  Pourquoi cela se déroule ainsi?

9.10. Diskrete Funktionen
       Fonctions discrètes

Ein Beispiel:
  Un exemple:

Clear[ungerade, t];
ungerade[x_?OddQ ] := (ungerade[x] = 1);
ungerade[x_?EvenQ] := (ungerade[x] = -1);

t = Table[ungerade[x], {x,1, 15}]

ListPlot[t, PlotStyle -> PointSize[0.04]];

?ListPlot

"Putzmaschine" einsetzen
 Employer la "machine de nettoyage"

(* Old Form: Remove["Global`@*"] *)

Remove["Global`*"]