Einführung in Mathematica - iam.uni-bonn.de · 9x fi RootA-1 + 4 ð13 + ð15 &, 4E=, 9x fi...

14
Einführung in Mathematica Carsten Rezny Institut für Angewandte Mathematik, Universität Bonn Eine andere Möglichkeit, eine Funktion in zwei Variablen darzustellen, ist DensityPlot: In[1]:= ManipulateADensityPlotASinAx 2 + y 2 E, 8x, - a, a<, 8y, - a, a<E, 88a, 1<, 0.01, 5<E Out[1]= a -1.0 -0.5 0.0 0.5 1.0 -1.0 -0.5 0.0 0.5 1.0 Eine andere Möglichkeit, eine Funktion in zwei Variablen darzustellen, ist ContourPlot:

Transcript of Einführung in Mathematica - iam.uni-bonn.de · 9x fi RootA-1 + 4 ð13 + ð15 &, 4E=, 9x fi...

Einführung in Mathematica

Carsten Rezny

Institut für Angewandte Mathematik, Universität Bonn

Eine andere Möglichkeit, eine Funktion in zwei Variablen darzustellen, ist DensityPlot:

In[1]:= ManipulateADensityPlotASinAx2 + y2E, 8x, -a, a<, 8y, -a, a<E, 88a, 1<, 0.01, 5<E

Out[1]=

a

-1.0 -0.5 0.0 0.5 1.0

-1.0

-0.5

0.0

0.5

1.0

Eine andere Möglichkeit, eine Funktion in zwei Variablen darzustellen, ist ContourPlot:

In[2]:= ContourPlotASinAx2 + y2E, 8x, -3, 3<, 8y, -3, 3<E

Out[2]=

-3 -2 -1 0 1 2 3

-3

-2

-1

0

1

2

3

Auch hier gibt es zahlreiche Optionen, um die Details der Ausgabe zu beeinflussen.

In[3]:= ContourPlotASinAx2 - y2E, 8x, -3, 3<, 8y, -3, 3<, Contours ® 4E

Out[3]=

-3 -2 -1 0 1 2 3

-3

-2

-1

0

1

2

3

2 vl4.nb

In[4]:= ContourPlotASinAx2 - y2E, 8x, -3, 3<, 8y, -3, 3<,

Contours ® 30, ColorFunction ® "StarryNightColors"E

Out[4]=

-3 -2 -1 0 1 2 3

-3

-2

-1

0

1

2

3

Es gibt zahlreiche Farbschemata:

In[5]:= ColorData@"Gradients"D

Out[5]= 8AlpineColors, Aquamarine, ArmyColors, AtlanticColors, AuroraColors, AvocadoColors,

BeachColors, BlueGreenYellow, BrassTones, BrightBands, BrownCyanTones,

CandyColors, CherryTones, CMYKColors, CoffeeTones, DarkBands, DarkRainbow,

DarkTerrain, DeepSeaColors, FallColors, FruitPunchColors, FuchsiaTones, GrayTones,

GrayYellowTones, GreenBrownTerrain, GreenPinkTones, IslandColors, LakeColors,

LightTemperatureMap, LightTerrain, MintColors, NeonColors, Pastel, PearlColors,

PigeonTones, PlumColors, Rainbow, RedBlueTones, RedGreenSplit, RoseColors, RustTones,

SandyTerrain, SiennaTones, SolarColors, SouthwestColors, StarryNightColors,

SunsetColors, TemperatureMap, ThermometerColors, ValentineTones, WatermelonColors<Ähnlich wie ContourPlot zeigt auch DensityPlot den Graphen der Funktion in der Draufsicht, verwendet aber statt Höhenlinien einen

kontinuierlichen Farbverlauf.

vl4.nb 3

In[6]:= DensityPlotASinAx2 - y2E, 8x, -3, 3<, 8y, -3, 3<, ColorFunction ® "LightTerrain"E

Out[6]=

-3 -2 -1 0 1 2 3

-3

-2

-1

0

1

2

3

Die Auflösung eines Plots wird durch die Optionen PlotPoints und MaxRecursion bestimmt. Zunächst bestimmt Plot die Funktion-

swerte an PlotPoints Stellen im darzustellenden Bereich. Wenn der Graph zwischen diesen Punkten noch zu “eckig” ist, werden bis zu

MaxRecursion Zwischenwerte bestimmt.

In[7]:= PlotBSin@xD

x

, 8x, -10, 10<, PlotPoints ® 10, MaxRecursion ® 0F

Out[7]=

-10 -5 5 10

0.2

0.4

0.6

0.8

Anschaulich wird das Verhalten mit Manipulate:

4 vl4.nb

In[8]:= ManipulateBPlotBSin@xD

x

, 8x, -10, 10<, PlotPoints ® pp, MaxRecursion ® mrF,

8pp, 2, 100, 1<, 8mr, 0, 10, 1<F

Out[8]=

pp

mr

-10 -5 5 10

-0.10

-0.08

-0.06

-0.04

-0.02

Zurück zur Option PlotRange:

In[9]:= PlotB1

x

, 8x, -5, 5<F

Out[9]=

-4 -2 2 4

-2

-1

1

2

vl4.nb 5

In[10]:= PlotB1

x

, 8x, -5, 5<, PlotRange ® AllF

Out[10]=

-4 -2 2 4

500

1000

Wenn ein Plot beliebig große (oder kleine) Werte enthalten kann, bestimmt die Auflösung, wie weit All geht.

In[11]:= PlotB1

x

, 8x, -5, 5<, PlotRange ® All, PlotPoints ® 200F

Out[11]=

-4 -2 2 4

-1000

1000

2000

3000

4000

5000

Die Funktion ParametricPlot zeichnet parametrisierte Kurven.

Z.B. Kreise

6 vl4.nb

In[12]:= ParametricPlot@8Sin@tD, Cos@tD<, 8t, 0, 2 Π<D

Out[12]=

-1.0 -0.5 0.5 1.0

-1.0

-0.5

0.5

1.0

Ellipsen

In[13]:= ParametricPlot@8Sin@tD, .6 Cos@tD<, 8t, 0, 2 Π<D

Out[13]=

-1.0 -0.5 0.5 1.0

-0.6

-0.4

-0.2

0.2

0.4

0.6

Spiralen

vl4.nb 7

In[14]:= ParametricPlotA9t Log@tD2Sin@tD, t Log@tD2

Cos@tD=, 8t, 0, 8 Π<E

Out[14]=

-200 -100 100

-200

-100

100

200

oder Lissajous-Figuren

In[15]:= ParametricPlot@8Sin@3 tD, Sin@12 tD<, 8t, 0, 2 Π<D

Out[15]=

-1.0 -0.5 0.5 1.0

-1.0

-0.5

0.5

1.0

8 vl4.nb

In[16]:= Manipulate@ParametricPlot@8Sin@3 t + uD, Sin@12 tD<, 8t, 0, 2 Π<D, 8u, 0, 2 Π<D

Out[16]=

u

-1.0 -0.5 0.5 1.0

-1.0

-0.5

0.5

1.0

Zufallszahlen und Statistik

Pseudozufallszahlen können einzeln oder als Liste aus einem frei wählbaren Bereich erzeugt werden.

In[17]:= RandomInteger@100D

Out[17]= 54

In[18]:= RandomInteger@81000, 1999<D

Out[18]= 1091

In[19]:= RandomInteger@81000, 1999<, 10D

Out[19]= 81049, 1452, 1011, 1546, 1626, 1595, 1771, 1976, 1972, 1706<Für Gleitkommazahlen gibt es RandomReal; RandomComplex für komplexe Zufallszahlen. RandomReal arbeitet per default mit einer

Präzision von sechs Stellen, was durch die Option WorkingPrecision beeinflusst werden kann.

In[20]:= RandomReal@10D

Out[20]= 8.06614

In[21]:= RandomReal@10, WorkingPrecision ® 25D

Out[21]= 6.997275582593105916826172

In[22]:= RandomComplex@10 + 10 ä, WorkingPrecision ® 25D

Out[22]= 0.9724387591783456736132996 + 2.270163456404061137116325 ä

Der Zufallszahlengenerator berechnet eine Sequenz von annähernd gleich verteilten Zahlen, die durch ihren Startwert eindeutig bestimmt ist

(daher Pseudo-Zufallszahlen). Der Startwert wird beim Start von Mathematica aus einer möglichst zufälligen Quelle gesetzt (/dev/random,

Systemuhr). Zum Testen einer Rechnung ist es oft nützlich, reproduzierbare Zufallszahlen zu erhalten. Dafür kann man den Startwert manuell

setzen:

vl4.nb 9

Der Zufallszahlengenerator berechnet eine Sequenz von annähernd gleich verteilten Zahlen, die durch ihren Startwert eindeutig bestimmt ist

(daher Pseudo-Zufallszahlen). Der Startwert wird beim Start von Mathematica aus einer möglichst zufälligen Quelle gesetzt (/dev/random,

Systemuhr). Zum Testen einer Rechnung ist es oft nützlich, reproduzierbare Zufallszahlen zu erhalten. Dafür kann man den Startwert manuell

setzen:

In[23]:= SeedRandom@42D; RandomReal@D

Out[23]= 0.425905

In[24]:= RandomReal@D

Out[24]= 0.391023

In[25]:= SeedRandom@42D; RandomReal@D

Out[25]= 0.425905

Die Funktion BlockRandom lokalisiert den Zufallszahlengenerator, so dass die Verwendung von Random-Funktionen innerhalb von

BlockRandom sich nicht auf später generierte Zufallszahlen auswirkt.

In[26]:= 8RandomReal@D, BlockRandom@SeedRandom@42D; RandomReal@DD, RandomReal@D<

Out[26]= 80.391023, 0.425905, 0.347069<Einige Statistikfunktionen:

In[27]:= list = RandomReal@50, 1000D;Mean@listD

Out[28]= 25.1434

In[29]:= StandardDeviation@listD

Out[29]= 14.5994

Anstelle von gleichverteilten Zufallszahlen kann man auch andere Verteilungen verwenden.

In[30]:= RandomInteger@BinomialDistribution@100, 0.7D, 30D

Out[30]= 871, 68, 69, 75, 71, 60, 64, 68, 70, 62, 68, 74, 69,

75, 71, 64, 69, 68, 68, 71, 70, 70, 69, 75, 71, 69, 67, 70, 63, 68<Werte zählen:

In[31]:= % �� Tally

Out[31]= 8871, 5<, 868, 6<, 869, 5<, 875, 3<, 860, 1<,864, 2<, 870, 4<, 862, 1<, 874, 1<, 867, 1<, 863, 1<<

In[32]:= list = RandomInteger@BinomialDistribution@100, 0.3D, 100000D;

In[33]:= ListPlot@Tally@listD, Filling ® AxisD

Out[33]=

20 30 40 50

2000

4000

6000

8000

10 vl4.nb

Oder einfacher:

In[34]:= Histogram@listD

Out[34]=

20 30 40 50

2000

4000

6000

8000

Es gibt eine größere Auswahl an Wahrscheinlichkeitsverteilungen: NormalDistribution, CauchyDistribution,

PoissonDistribution, ...

Die Wahrscheinlichkeitsdichtefunktion (probability density function, PDF) einer Verteilung kann man auch direkt plotten:

In[35]:= DiscretePlot@PDF@PoissonDistribution@15D, xD, 8x, 0, 50<D

Out[35]=

10 20 30 40 50

0.02

0.04

0.06

0.08

0.10

Ein Beispiel für eine einfache Irrfahrt (Random Walk):

In[36]:= data = Module@8t = 0<, Table@t += RandomReal@8-1, 1<D, 82000<DD;

In[37]:= ListPlot@dataD

Out[37]=

500 1000 1500 2000

-10

-5

5

10

15

vl4.nb 11

Lösen von Gleichungen

Viele Gleichungen kann man mit Solve lösen.

In[38]:= eqn = x4

- 4 x3

+ 3 x - 1 � 0

Out[38]= -1 + 3 x - 4 x3

+ x4

� 0

In[39]:= sol = Solve@eqn, xD

Out[39]= ::x ®1

2

2 - 5 - 7 - 2 5 >, :x ®1

2

2 - 5 + 7 - 2 5 >,

:x ®1

2

2 + 5 - 7 + 2 5 >, :x ®1

2

2 + 5 + 7 + 2 5 >>Das Resultat ist eine geschachtelte Liste von Ersetzungsregeln. Dazu ein kurzer

Exkurs: Ersetzungsregeln

Ein Ausdruck der Form x ® y2 ist eine Ersetzungsregel. Im Unterschied zur Zuweisung wird eine Ersetzungsregel nur auf Anforderung

angewandt, nie automatisch.

Die Anwendung einer Ersetzungsregel geschieht mit dem Operator /. (ReplaceAll).

In[40]:= x2

+ 2 x - 1 �. x ® y2

Out[40]= -1 + 2 y2

+ y4

Der Pfeil-Operator ® kam schon bei Funktionsoptionen vor, die tatsächlich auch Ersetzungsregeln sind.

Ersetzungsregeln können auch Muster verwenden:

In[41]:= f@x^2D + f@yD - 2 fAHu + 1L2E �. fAx_2E ® g@xD

Out[41]= f@yD - 2 g@1 + uD + g@xDAnalog zu verzögerten Zuweisungen (:=) gibt es auch bei Ersetzungsregeln eine Variante mit verzögerter Auswertung der rechten Seite (:>).

In[42]:= a = 2; rule = x ® 2 a + 1

Out[42]= x ® 5

In[43]:= rule = x ¦ 2 a + 1

Out[43]= x ¦ 2 a + 1

Ersetzungen werden nicht rekursiv durchgeführt. Wird ./ mit einer Liste von Ersetzungsregeln verwendet, werden die Regeln der Reihe nach

probiert, bis eine passt.

In[44]:= x �. 8x -> 1, x -> 3, x -> 7<

Out[44]= 1

Eine geschachtelte Liste von Regeln erzeugt eine Liste von Resultaten:

In[45]:= x �. 88x -> 1<, 8x -> 3<, 8x -> 7<<

Out[45]= 81, 3, 7<Exkurs Ende

Deshalb ist auch das Resultat von Solve eine Liste von Listen. Wendet man es auf die gelöste Gleichung an, erhält man

12 vl4.nb

In[46]:= eqn �. sol

Out[46]= :-1 +3

2

2 - 5 - 7 - 2 5 -1

2

2 - 5 - 7 - 2 5

3

+1

16

2 - 5 - 7 - 2 5

4

� 0,

-1 +3

2

2 - 5 + 7 - 2 5 -1

2

2 - 5 + 7 - 2 5

3

+1

16

2 - 5 + 7 - 2 5

4

� 0,

-1 +3

2

2 + 5 - 7 + 2 5 -1

2

2 + 5 - 7 + 2 5

3

+1

16

2 + 5 - 7 + 2 5

4

� 0,

-1 +3

2

2 + 5 + 7 + 2 5 -1

2

2 + 5 + 7 + 2 5

3

+1

16

2 + 5 + 7 + 2 5

4

� 0>In[47]:= Simplify@%D

Out[47]= 8True, True, True, True<Für Gleichungen fünften und höheren Grades können die Lösungen im Allgemeinen nicht in geschlossener Form notiert werden.

In[48]:= SolveAx5 + 4 x3

- 1 � 0, xE

Out[48]= 99x ® RootA-1 + 4 ð13

+ ð15&, 1E=,

9x ® RootA-1 + 4 ð13

+ ð15&, 2E=, 9x ® RootA-1 + 4 ð1

3+ ð1

5&, 3E=,

9x ® RootA-1 + 4 ð13

+ ð15&, 4E=, 9x ® RootA-1 + 4 ð1

3+ ð1

5&, 5E==

Dennoch sind diese Lösungen exakte Zahlen, die Mathematica durch sogenannte Root-Objekte darstellt. Mit Root-Objekten kann man wie mit

anderen Zahlen weiterrechnen.

In[49]:= x5

+ 4 x3

- 1 �. x ® RootA-1 + 4 ð13

+ ð15&, 1E

Out[49]= -1 + 4 RootA-1 + 4 ð13

+ ð15&, 1E3

+ RootA-1 + 4 ð13

+ ð15&, 1E5

In[50]:= Simplify@%D

Out[50]= 0

Wenn eine numerische Lösung gesucht ist, kann auch das deutlich schnellere NSolve verwendet werden:

In[51]:= NSolveAx5 + 4 x3

- 1 � 0, xE

Out[51]= 88x ® -0.336836 - 0.542772 ä<, 8x ® -0.336836 + 0.542772 ä<,8x ® 0.0310993 - 2.00169 ä<, 8x ® 0.0310993 + 2.00169 ä<, 8x ® 0.611473<<

In[52]:= Clear@a, b, cD

Generische und nicht-generische Lösungen

Für parametrisierte Gleichungen wie

In[53]:= eqn = a x2

+ b x + c � 0;

liefert Solve nur generische Lösungen, also solche, die sich explizit auf die gesuchte Variable beziehen. Dabei macht Solve implizit

Annahmen über die Parameter.

In[54]:= Solve@eqn, xD

Out[54]= ::x ®-b - b

2 - 4 a c

2 a

>, :x ®-b + b

2 - 4 a c

2 a

>>In diesem Fall liefert Reduce eine allgemeinere Lösung, die auch die vorhandenen Parameter berücksichtigt:

vl4.nb 13

In[55]:= Reduce@eqn, xD

Out[55]= a ¹ 0 && x �-b - b

2 - 4 a c

2 a

ÈÈ x �-b + b

2 - 4 a c

2 a

ÈÈ

a � 0 && b ¹ 0 && x � -c

b

ÈÈ Hc � 0 && b � 0 && a � 0LReduce liefert auch Lösungsbedingungen für Ungleichungen.

In[56]:= ReduceAx3 - 2 x2

+ 1 > 0, xE

Out[56]=

1

2

J1 - 5 N < x < 1 ÈÈ x >1

2

J1 + 5 NIm Unterschied zu Solve gibt Reduce keine Ersetzungsregeln zurück, sondern logische Ausdrücke von (Un-)Gleichungen. Im Fall von

Gleichungen kann man diese mit ToRules wieder in Ersetzungsregeln umwandeln:

In[57]:= ToRules@Reduce@eqn, xDD

Out[57]= SequenceB:x ®-b - b

2 - 4 a c

2 a

>, :x ®-b + b

2 - 4 a c

2 a

>, :a ® 0, x ® -c

b

>, 8c ® 0, b ® 0, a ® 0<FNumerische Lösungen

Wenn weder Solve noch Reduce eine Lösung finden, kann mit FindRoot numerisch nach Lösungen gesucht werden.

In[58]:= eqn = LogAx2 + 1E � x

Out[58]= LogA1 + x2E � x

In[59]:= Reduce@eqn, xD

Reduce::nsmet : This system cannot be solved with the methods available to Reduce. �

Out[59]= ReduceBLogA1 + x2E � x , xF

(Solve und Reduce benötigen unter Umständen recht lange.)

FindRoot sucht ausgehend vom angegebenen Startwert eine Lösung der Gleichung mit dem Newton-Verfahren. Wie viele Lösungen es gibt,

erfährt man so nicht.

In[60]:= FindRoot@eqn, 8x, 0<D

Out[60]= 8x ® 0.<In[61]:= FindRoot@eqn, 8x, 1<D

Out[61]= 8x ® 1.59038<

14 vl4.nb