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,1I ,1.I , sin [1],0.841471 } Select[nums,NumberQ] ----> { 1,1. , 2/ 3 ,0.666667,3.14159,1.41421 ,1I ,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 xh− f x h und den zweiseitigen Differenzenquotienten: d 2 f x ; h:= f xh− 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∣=0h 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