4. Zahlendarstellungen in Mathematica 4.1. Zahlentypen und

Werbung
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
4. Zahlendarstellungen in Mathematica
4.1. Zahlentypen und Zahlenbereiche in Mathematica
●
Integer: ganze Zahl
123
Integer 123
●
●
●
Rational: Integer 4
Real:
Fließkommazahl bzw. genäherte reelle Zahl in
Standardgenauigkeit
123.
Complex: number + number I
123 + 0.4 I
Zahlenbereiche: Integers, Rationals, Reals, Complexes,
Primes, Algebraics, Booleans
Prädikate: Funktionen, die nur die Rückgabewerte True und False
besitzen oder den Ausdruck unvaluiert zurückgeben:
x ∈ Reals
bzw.
x ∈ Complexes
Beispiele:
a=2;b=3;c=3.;
Head[a]
Head[c]
Head[a/b]
Head[a/c]
Head[a + c I]
---->
---->
---->
---->
---->
Integer
Real
Rational
Real
Complex
a ∈ Integers
a ∈ Reals
a ∈ Complexes
---->
---->
---->
True
True
True
Seite 4-1
Scheffler: Einführung in Mathematica 2011
a/b ∈Integers
a/b ∈ Rationals
a/b ∈ Reals
a/c ∈ Rationals
a/c ∈ Reals
a/c ∈ Complexes
a + c I ∈ Reals
a + c I ∈ Complexes
b ∈ Algebraics
c ∈ Algebraics
4. Zahlendarstellungen in Mathematica
---->
---->
---->
---->
---->
---->
---->
---->
---->
---->
False
True
True
False
True
True
False
True
True
False
Konstanten und exakte Funktionswerte werden über Symbole
realisiert!
Mathematische Konstanten: Pi = π, E = , I = ,

Infinity = ∞, Degree = 180 und GoldenRatio =
1 5
2
exakte Funktionswerte:
Sqrt[2], Sqrt[π], π, Sin[2], Sin[]
Testfunktionen für Zahlenbereiche und Zahlentypen:
NumericQ[x] ergibt True, falls x eine Zahl, eine mathematische
Konstante oder eine „numerische” Funktion ist
NumberQ[x]
ergibt True, falls x eine Zahl ist, d.h., falls der
Kopf zu einem der Zahlenbereiche gehört
Select[list,testq]
gibt die Teilliste von list zurück, für deren Elemente der
Test testq zu True evaluiert wurde
Seite 4-2
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
Beispiele für testq:
Head[x] == type
(auch für andere Typen einsetzbar)
NumberQ[x], NumericQ[x], IntegerQ[x],
EvenQ[x], OddQ[x], PrimeQ[x],
oder eigene Testfunktionen:
rationalq1[x_]:=
If[Head[x]==Rational,True,False]
rationalq2[x_]:= x ∈ Rationals
nums=
{1, 1., 2/3, 2./3, π, π//N, Sqrt[2], Sqrt[2.],
1+, 1.+, Sin[1], Sin[1.]};
Select[nums,IntegerQ]
---->
{1}
Select[nums,rationalq1]---->
2
{ }
3
Select[nums,rationalq2]---->
2
{1, }
3
Select[nums,NumericQ]
---->
{1,1. , 2 /3 , 0.666667, Pi ,3.14159 ,  2,1.41421,1I ,1.I , sin [1],0.841471 }
Select[nums,NumberQ]
---->
{ 1,1. , 2/ 3 ,0.666667,3.14159,1.41421 ,1I ,1.I ,0.841471 }
Seite 4-3
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
Betrachten wir einmal die internen Darstellungen von π und π//N
bzw. von Sin[1] und Sin[1.]:
Head[π ]
FullForm[π ]
Head[π //N]
FullForm[π//N]
FullForm[Sin[1]]
FullForm[Sin[1.]]
---->
---->
---->
---->
---->
---->
Symbol
Pi
Real
3.141592653589793 `
Sin[1]
0.8414709848078965`
Bei Zahlenvergleichen werden die symbolischen Ausdrücke vor dem
Vergleich in eine geeignete Zahlendarstellung überführt:
Sin[1.]<Sin[2.] ---->
Sin[1]<Sin[2.] ---->
Sin[1]==Sin[1.] ---->
Sin[1]===Sin[1.] ---->
True
True
True
False
Der letzte Test ergibt False, da === (bzw. SameQ) die
syntaktische Gleicheit der Ausdrücke testet.
Seite 4-4
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
4.2. Genauigkeitsuntersuchungen für Real-Zahlen
Fließ- oder Gleitkommazahl: Näherung für reelle bzw. komplexe
Zahlen einer bestimmten Genauigkeitsstufe
Precision[x]
beschreibt die Anzahl der gültigen Stellen der Zahl x,
Maß für den relativen Fehler von x
Accuracy [x]
beschreibt die Anzahl der gültigen Stellen nach dem
Dezimalpunkt der Zahl x, Maß für den absoluten Fehler von x
Bemerkungen: Die Werte dieser beiden Funktionen sind i.allg. nicht
ganzzahlig. Ist dx der absolute Fehler von x, so werden sie in
folgender Weise ermittelt:
Precision[x]= -log10 (dx/x) und Accuracy [x]= -log10 (dx).
Für eine Dezimalzahl x ist Precision[x] das Maximum von der
Mantissenlänge und $MachinePrecision, der durch den
mathematischen Koprozessor benutzten Mantissenlänge:
$MachinePrecision=MachinePrecision=
15.954589770191003`
a=1.00123400000000000000; b=1.001234;
Precision[a] ---->
20.0005
Precision[b] ---->
MachinePrecision
FullForm [a] ---->
1.001234`20.000535589000176`
FullForm [b] ---->
1.001234`
Seite 4-5
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
Hinweis: Folgende Beziehungen gelten:
 x=digits`
Precision[x]=MachinePrecision
 x=digits`p
Precision[x]=p
 x exakte Zahlen (Integer oder Rational) oder exakte
symbolische Zahl: Precision[x]=Accuracy [x]= ∞
Beispiele:
1.001234`4
----> 1.001
Precision[1.001234`4] ---->
4
1.001234`24
---->
1.00123400000000000000000
Precision[1.001234`24] ---->
24
Precision[π]
---->
∞
Accuracy[π]
---->
∞
Precision[Sqrt[2]]
---->
∞
Accuracy[Sqrt[2]]
---->
∞
Die Precision algebraischer Ausdrücke wird wesentlich durch die
kleinste Precision der auftretenden Terme bestimmt. Accuracy
ändert sich mit der absoluten Größe des Ergebnisses:
a=1.`20
---->
Precision[a]
---->
Precision[10 a] ---->
Precision[100 a] ---->
Accuracy[a]
---->
Accuracy[10a]
---->
Accuracy[100a] ---->
1.0000000000000000000
20
20.
20.
20.
19.
18.
Seite 4-6
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
Ermittlung einer Näherung einer exakten Zahl mit vorgegebener
Precision:
N[x] bzw. x//N
Näherungswert von x mit Maschinengenauigkeit
N[x,n]
Näherungswert von x mit der Precision n
N wandelt exakte Zahlen in Gleitkomma-Zahlen
(Typ: Real oder Complex) um:
N[Sqrt[2]]
----> 1.41421
N[Sqrt[2]]//FullForm ----> 1.4142135623730951`
N[Sqrt[2],20]
----> 1.41421356237309504880
N[Sqrt[2],20]//FullForm ---->
1.4142135623730950...`20.
Sqrt[2.]
----> 1.41421
Precision[%]
----> MachinePrecision
Sqrt[2.]//FullForm ----> 1.4142135623730951`
Sin[1]+Cos[1]
----> Sin[1]+Cos[1]
Precision[%]
----> ∞
Sin[1]+Cos[1.] ----> 1.38177
Precision[%]
----> MachinePrecision
Es können dabei auch paradoxe Situationen entstehen:
Sin[2 Pi]
Precision[%]
Sin[2. Pi]
Precision[%]
---->
---->
---->
---->
0
∞
-2.44921x10-16
MachinePrecision
Seite 4-7
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
Es gibt mehrere Möglichkeiten Rundungen von Zahlen auszuführen
bzw. betragsmäßig kleine Zahlen durch die exakte Zahl 0 zu ersetzen:
Chop[x]
bzw. Chop[x,eps]
ersetzt x durch 0, falls |x| < 10-10 bzw. |x| < eps gilt
Round[x] Integer-Zahl, welche x am nächsten liegt
Floor[x] größte Integer-Zahl, welche nicht größer als x ist
Ceiling[x] kleinste Integer-Zahl, welche nicht kleiner als x ist
Rationalize[x] bzw. Rationalize[x,dx]
ermittelt von der reellen Zahl x eine „benachbarte” rationale
Zahl bzw. eine rationale Zahl mit einem Fehler kleiner als dx
Beispiele:
Sin[2. Pi]//Chop ---->
0
(* numerisches Lösen einer Polynomgleichung: *)
NSolve[x^4==1,x] ---->
{{x→−1.},{x→5.07951×10-20-1.},
{x→5.07951×10-20+1.}, {x→+1.}}
Chop[%]
---->
{{x→−1.},{x→-1.},{x→1.},{x→+1.}}
Rationalize [%] ---->
{{x→−1},{x→-},{x→},{x→1}}
Seite 4-8
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
4.3. Beispiel zum Einsatz unterschiedlicher Genauigkeitsstufen
In dem Notebook 04_zahlenbereiche_numer_diff.nb wird die
numerische Berechnung von Ableitungen und deren Beziehungen zur
verwendeten Genauigkeit untersucht. Hierbei wird die Ableitung einer
Funktion f an einer Stelle x durch den einseitigen
Differenzenquotienten:
d 1 f  x ; h:=
f  xh− f  x 
h
und den zweiseitigen Differenzenquotienten:
d 2 f x ; h:=
f  xh− f  x−h
h
approximiert. Mittels Taylor-Entwicklung kann gezeigt werden, dass
zwischen f '  x und d 1 f  x ; h bzw. d 2 f  x ; h folgende
Beziehungen bestehen:
∣ f '  x−d 1 f  x ; h∣=0h
bzw.
∣ f '  x−d 2 f  x ; h∣=0 h2  .
Um diese Approximationsordnung auch rechnerisch nachweisen zu
können, muß die Genauigkeit bei der Berechnung der
Differenzenquotienten angepaßt werden. Einzelheiten werden in den
Notebooks beschrieben.
Dieses Beispiel hat Modellcharakter für alle numerischen Verfahren
und Berechnungen, die in Mathematica mit Real-Zahlen ausgeführt
werden.
Seite 4-9
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
4.4. Funktionen für Integer-Zahlen
FactorInteger[x]
Primfaktoren von x, falls x eine ganze oder rationale Zahl ist
FactorInteger[6.] arbeitet nicht!
Prime[k]
PrimeQ[k]
k-te Primzahl
Prädikat, welches für Primzahlen True ergibt,
sonst False
PrimePi[x]
Anzahl der Primzahlen < x
GCD[ n1 , n 2 , ] größter gemeinsamer Teiler der Argumente
LCM[ n1 , n 2 , ] kleinstes gemeinsames Vielfache der Argumente
Beispiel:
Berechnung der Summe s aller geraden Zahlen von 1 bis 100 (oder
kmax) und Bestimmung der Primfaktorenzerlegung der Summe
a) Schleifenanweisung mit Do und If
Do[expr,{k,kmin,kmax,dk}]
oder
Do[expr,{k,kmin,kmax}]
Evaluierung des (von k abhängigen) Ausdruckes expr mit dem
Laufparameter k ∈ [kmin,kmax], wobei sich k in jedem
Schritt um dk ändert, Standardwert von dk=1
If[cond,t,f] oder If[cond,t,f,u]
bedingte Anweisung
cond=True
Ausführung von t-Ausdrücken
cond=False Ausführung von f-Ausdrücken
cond =?
Ausführung von u-Ausdrücken
Seite 4-10
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
s=0;
Do[If[EvenQ[k],s=s+k],{k,1,100}];
Print[s]
----> 2550
FactorInteger[s] ----> {{2,1},{3,1},{5,2},{17,1}}
also 2550 =2*3*5²*17
verbesserte Ausgabe mit ToString:
ToString[expr]
Das Evaluierungsergebnis von expr wird in einen String verwandelt.
s=0;
Do[If[EvenQ[k],s=s+k],{k,1,100}];
Print["Die Summe lautet: ",s]
----> Die Summe lautet: 2550
dc=FactorInteger[s]
----> {{2,1},{3,1}, 5,2},{17,1}}
dp=Table[
Power[ToString[dc[[k,1]]],ToString[dc[[k,2]]]],
{k,1,Length[dc]}]
----> {21,31,52,171}
dp[[0]]=Times;
(* entspricht: dp=ReplacePart[dp,Times,0] *)
Print["Die Primfaktoren von s sind: ", dp]
----> Die Primfaktoren von s sind: 171 21 31 52
Seite 4-11
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
b) Verwendung der Summenfunktion
kmax
Sum[expr,{k,kmin,kmax}]
entspricht: ‚
expr
k=kmin
Sum[expr,{k,kmin,kmax,dk}]
kmax
entspricht:
‚ expr,
mit der Aufdatierung dk.
k=kmin
s = Sum[If[EvenQ[k],k,0],{k,1,100}];
FactorInteger[s] ----> {{2,1},{3,1},{5,2},{17,1}}
c) „nichtnumerische” Aufsummierung
s=Select[Table[k,{k,1,100}],EvenQ];
s[[0]]=Plus;
(* oder: s=ReplacePart[s,Plus,0] *)
FactorInteger[s] ----> {{2,1},{3,1},{5,2},{17,1}}
Fragen:
● Welche dieser Lösungen sind besonders effektiv hinsichtlich der
benötigten Zeit bzw. des Speicherbedarfs?
● Wie kann man diese Varianten ohne Benutzung von If- und
Select-Anweisungen realisieren?
Timing[expr]
Evaluierung von expr und Rückgabe einer Liste, die die
benötigte CPU-Zeit und das Ergebnis enthält
AbsoluteTiming[expr]
wie oben, wobei die benötigte Gesamtzeit angezeigt wird
MemoryInUse[]
Anzahl der Bytes zur Speicherung der aktuellen Notebook-Daten
Seite 4-12
Scheffler: Einführung in Mathematica 2011
4. Zahlendarstellungen in Mathematica
MaxMemoryUsed[]
Anzahl der Bytes zur Speicherung aller Notebook-Daten
ByteCount[expr]
Anzahl der Bytes, um expr zu speichern
Aufgabe:
Summieren Sie alle Primzahlen von 1 bis 100 (oder einer anderen
Zahl) auf, und bestimmen Sie deren Primfaktoren.
Ersetzen Sie Primzahlen bzw. gerade Zahlen durch andere Kriterien.
Seite 4-13
Herunterladen