Kurs  Cours

8. Datentypen
 Types de données

Die Gliederung dieses Kurses folgt in groben Zügen dem Buch von Nancy Blachman: A Practical Approach.... 
Hinweis: Kapitel 8 lesen!
 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... Indication: 
Lire le chapitre 8.
WIR94/98/99 // Copyright Rolf Wirz

Mathematica kennt keine Deklarationen von Typen für die Variablen wie z.B. in  klassischen Programmiersprachen, z.B. Modula II. Trotzdem.... Mathematica kann selber merken, um welchen Typ es sich handelt...
 Mathematica ne connaît pas de déclarations de types pour les variables comme p.ex. dans des langues de programmation classiques, p.ex. Modula II. Pourtant.... Mathematica s'aperçoit de quel type il s'agit....

8.1. Atomare Typen
     Types atomiques

8.1.1. Rufe die Information selbst ab
       Appelle l'information toi-même

Jeder Ausdruck ist aus folgenden "atomaren Typen" zusammengesetzt: Integer, Real, Rational, Complex, Symbol, String.
  Chaque expression est composée des "types atomiques" suivants: Integer, Real, Rational, Complex, String.

??Integer

?Real

?Rational

?Complex

?Symbol

?String

8.1.2. Probiere aus:
       Essaie:

?Head

Head[3452]

Head[67.94]

Head[3 + 4 I]

Head[E]

Head[Pi]

Head["Tschou zämä!"]

8.2. Andere Typen und Prädikatenfunktionen
     Autres types et fonctions de prédicats

8.2.1. Beispiele
        Exemples

Neben den atomaren Typen gibt es übergeordnete Typen. Z.B. Integer, Real, 
Rational u.s.w. sind Zahlen. Ein Vektor ist eine Liste etc.. Um zu prüfen, um welchen Typ es sich gerade handelt, existieren sogenannte Prädikatenfunktionen. Beispiele:
  A part des types atomiques il y a des types supérieurs. P.ex. Integer, Real, Rational etc. sont des nombres. Un vecteur est une liste etc.. Pour examiner de quel type il s'agit, il existe les dites fonctions de prédicats.

NumberQ[5/2 + 8 I/5]

NumberQ[5/2 + 8 I/5 - Pi]

VectorQ[{a, b, c, d, e, f, g}]

8.2.2. Uebersicht
       Vue d'ensemble

Die Prädikatenfunktionen enden mit "Q". Ihr Wertebereich ist {True, False}. Hier sind sie alle:
  Les fonctions de prédicats se terminent par "Q". Leur domaine de valeurs est "True, False". Voici tous:

?*Q

8.3. Interne Darstellung in Mathematica 
     Représentation intérieure dans Mathematica

8.3.1. Allgemeines
       Généralités

Operationszeichen oder spezielle Symbole wie "+", "/", "#", "/@" u.s.w. werden intern dargestellt durch Funktionen. Mit den Funktionen "FullForm[...]", "FullForm[Hold[...]]" oder "TreeForm" kann die interne Darstellung in Mathematica sichtbar gemacht werden. 
  Signes d'opérations ou symboles spéciaux tels que "+", "/", "#", "/@" etc. sont représentés intérieurement par des fonctions. Par les fonctions "FullForm[...]", "FullForm[Hold[...]]" ou "TreeForm" on peut rendre visible la représentation intérieure dans Mathematica.

?FullForm

?TreeForm

Beispiele:    Exemples:

FullForm[4/7]

FullForm[4 - 7 I]

FullForm[f[x]]

FullForm[x y^z / w]

TreeForm[x y^z / w]

FullForm[2 + 3 15]

8.3.2. Erzwungene oder verhinderte Ausführung
       Exécution obtenue de force ou empêchée

Im letzten Beispiel ist zuerst die Rechnung ausgeführt worden. Erst darauf wurde dann die Funktion "FullForm" angewandt. Die gültige Abarbeitungshierarchie kann aber geändert werden. Dazu dienen folgende Befehle:
  Dans le dernier exemple on a d'abord exécuté le calcul. Ensuite seulement on a appliqué la fonction "FullForm". On peut changer la hiérarchie de l'exécution valable par les ordres suivants:

?Hold

?HoldForm

?ReleaseHold

?Evaluate

Beispiele:    Exemples

FullForm[Hold[2 + 7 - 4]]

Hold[2 + 7 - 4]

HoldForm[2 + 7 - 4]

ReleaseHold[Hold[2 + 7 - 4]]

meineListe = {"Or", "And", "Abs"};
Attributes[meineListe]

Attributes[Evaluate[meineListe]]

t[x_] = Table[x^n, {n,4}]

Plot[t[x], {x, -1.5, 1.5}];

Plot[Evaluate[t[x]], {x, -1.5, 1.5}];

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

8.3.3. Der "Kopf" eines Ausdrucks und "FullForm"
       La "tête" d'une expression et "FullForm"

Vergleiche:    Comparer:

Head[x + y]

FullForm[x + y]

Head[FullForm[x + y]]

FullForm[{x, y}]

Head[{x, y}]

FullForm[Cos[x^3 - 4 x^2]]

Head[Cos[x^3 - 4 x^2]]

8.3.4. Veränderung des "Kopfs" 
       Changement de la "tête"

Vergleiche:    Comparer:

FullForm[{x, y, z, w}]

FullForm[x + y + z + w]

{x, y, z, w} /. List -> Plus

Was ist passiert?  Der "Kopf" ist ausgewechselt worden! Doch Mathematica kann noch mehr: Mit "Apply" lässt sich ein weiterer "Kopf" einem Ausdruck voranstellen:
  Que s'est-il passé? On a remplacé la "tête"! Mathematica peut cependant davantage. Pour "Apply" on peut placer devant une expression une autre "tête" encore.

FullForm[{x, y, z, w}]

summe = Apply[Plus, {x, y, z, w}]

FullForm[summe]

Head[summe]

Oder so:    Ou ainsi:

Apply[Plus, Range[1000]]

Das ist die Summe der natürlichen Zahlen von 1 bis 1000.
  Voici la somme des nombres naturels de 1 à 1000.

8.4. Herauslesen von gewissen Teilen von
       Ausdrücken
     Choisir certaines parties d'expressions

Allgemeines
 Généralités

Studiere:    Etudier:

?Position

?[[

?Part

neueListe = 2 Range[9]

neueListe[[4]]

Head[neueListe[[4]]]

HoldForm[neueListe[[4]]]

Bearbeite:    Travailer:

ausdruck = 4 + a - b + Cos[4 Pi x^z - 3]

TreeForm[ausdruck]

ausdruck[[3]]

ausdruck[[4]]

ausdruck[[4, 1]]

ausdruck[[4, 1, 2]]

Was ist passiert? ---  Studiere weiter die Funktion "Position":
 Que s'est-il passé? ---  Continuer d'étudier la fonction "Position":

ausdruck1 = Expand[(r + s + w)^3]

Position[ausdruck1,r]

Position[ausdruck1,s]

Deute diesen Output! ---  Damit kann man auch komponieren:
Interpréter cet output! ---  On peut aussi en faire des compositions:

u = {ausdruck1[[2]], ausdruck1[[2,2]], 
ausdruck1[[2,2,1]], ausdruck1[[5,2]]}

v = Apply[Plus, u]

v /. r->3

8.5. Symbole wie "unendlich" etc.
     Symboles tels que "infini" etc.

Allgemeines
 Généralités

Studiere:    Etudier

?Infinity

Head[Infinity]

1 a

0 a

0 5

0 Infinity

?Limit

Limit[1/x, x->0]

Limit[Log[x], x->0]

Head[-Infinity]

FullForm[-Infinity]

Limit[Log[1/x], x->0]

-5 Infinity

7 / 0

?ComplexInfinity

0 / 0

?Indeterminate

8.6. Memory: Wie Mathematica speichert
     Memory: La façon de mémoriser de 
       Mathematica

8.6.1. Allgemeines
       Généralités

Studiere:    Etudier:

?MemoryInUse

Beispiele:    Exemples:

MemoryInUse[]

"Putzmaschine" einsetzen:
  Effacer:

Remove["Global`@*"]

MemoryInUse[]

t = 1;

MemoryInUse[]

Was hat t sowie die ausgeführten Operationen "gekostet"?
  Qu'est-ce que t ainsi que les opérations exécutées ont-ils "coûté"?

vorher = MemoryInUse[]

Table[Random[],{10000}];

nachher = MemoryInUse[]

N[nachher - vorher] / 1000

Wieviel Speicher hat Mathematica "verbraten"?
 Combien de mémoire Mathematica a-t-il "gaspillé"?

8.6.2. Gemeinsame Speichernutzung (sharing)
       Utilisation commune de la mémoire (sharing)

Studiere:    Etudier:

(	Clear[a, b];
	vorher1 = MemoryInUse[];
	a = Table[Random[],{10000}];
	nachher1 = MemoryInUse[];
	b = a;
	nachher2 = MemoryInUse[];
	{nachher1 - vorher1, nachher2- nachher1}
)

Beachte: b hat keinen Speicher mehr belegt. b belegt erst dann Speicher, wenn a manipuliert wird. Offenbar gibt es von a und b aus Zeiger auf diesselbe Speicheradresse. Das kann mit der Funktion "Share" auch künstlich bewirkt werden. Im folgenden Beispiel werden 1000 Pseudozufallszahlen im Intervall zwischen 10'000 und 10'100 gerechnet. Da dieses Intervall nur 100 Zahlen enthält, gibt es sicher Duplikate. Mit "Share" kann dabei eine Mehrfachspeicherung vermieden werden. Probiere:
  Retenir: b n'a pas plus occupé de mémoire. b occupe la mémoire seulement si l'on manipule a. Il est évident qu'il a de a et de b des indicateurs pour la même adresse dans la mémoire. On peut obtenir cela aussi artificiellement par la fonction "Share". Dans l'exemple suivant on calcule 1'000 nombres pseudo-aléatoires dans l'intervalle entre 10'000 et 10'100. Comme cet intervalle ne compte que 100 nombres, il y aura certainement des doubles. Par "Share" on peut éviter une mise en mémoire répétitive. Essaie:

?Share

(	Clear[c];
	vorherSpeicher = MemoryInUse[];
	c = Table[Random[Integer, {10000, 10100}],
					{10000}];
	nachherSpeicher = MemoryInUse[];
	c = Share[c];
	nachherShare = MemoryInUse[];
	{nachherSpeicher - vorherSpeicher, 
	 nachherShare- vorherSpeicher}
)

Probiere:    Essaie:

?ByteCount

t = 2

ByteCount[t]

ByteCount[neueVariable]

neueVariable = 1;

ByteCount[neueVariable]

ByteCount[a]

ByteCount[{a, b}]

Beispiele für Speicherbelegung:
  Exemple pour l'occupation de mémoire:

z = 15;  {Head[z], ByteCount[z]}

z = 1;  {Head[z], ByteCount[z]}

z = 100;  {Head[z], ByteCount[z]}

z = 1000000000000000;  {Head[z], ByteCount[z]}

z = 3.1;  {Head[z], ByteCount[z]}

z = 3.14159666666666;  {Head[z], ByteCount[z]}

z = 3/8;  {Head[z], ByteCount[z]}

z = 3 + 5 I;  {Head[z], ByteCount[z]}

z = Range[10];  {Head[z], ByteCount[z]}

z = Range[10000];  {Head[z], ByteCount[z]}

z = "tschou";  {Head[z], ByteCount[z]}

z = "t";  {Head[z], ByteCount[z]}

z = "tschou zaeaeaeaeaeaemmaeaeaeaeaeaeaeae";  
     {Head[z], ByteCount[z]}

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

Remove["Global`@*"]