4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es...

13
4. Funktionen als Programme Neben vordefinierten Mathematica-Funktionen wie etwa Plus, Times, Sin, FullForm, ... und vielen vielen mehr bietet Mathematica auch die Möglichkeit, eigene Funktionen zu definieren. Im einafchsten Fall sind das Funktionen im Sinne von mathematischen Funktionen. Solche user-defined functions können aber auch komplexere Aufgaben erledigen, und bilden somit die Grundbausteine des Programmierens mit Mathematica. In diesem Abschnit werden Sie lernen, wie sie einfache Funktionen selbst definieren können (4.1), was man unter Überladen von Funktionen versteht (4.3), und wie komplexere Funktionen aus mehreren Teilschritten zusammengefügt werden können (4.4). 4.1 Einfache Funktionsdefinitionen Wir beginnen mit einer einfachen Funktion, wie wir sie in der Mathematik kennen: f(x) = sin(5x) + e x +2. Die entsprechende Funktionsdefinition in Mathematica lautet wie folgt: f@x_D := Sin@5xD x + 2 Auf der linken Seite legen wir den Funktionsnamen fest, hier “f” und wählen einen Namen für das Argument der Funktion “x”. Beachten Sie das wichtige “x_” auf der linken Seite, das ein sogenanntes Pattern bezeichnet (mehr über Patterns in Kapitel 10). Auf der rechten Seite von “:=” steht dann die eigentliche Fuktionsdefinition mit “x” als Argument, ohne dem “_”. Durch Aufrufen der Funktion mit unterschiedlichem Argument erreichen wir, dass “f” jeweilsmit dem entsprechenden Argument ausgewertet wird. f@xD f@yD f@1D f@ΠD f@1.0D 2 x + Sin@5xD 2 y + Sin@5yD 2 +ª+ Sin@5D 2 Π 3.75936 Wir können unsere Funktion f nun auch in Verbindung mit anderen Funktionen verwenden, zB:

Transcript of 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es...

Page 1: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

4. Funktionen als ProgrammeNeben vordefinierten Mathematica-Funktionen wie etwa Plus, Times, Sin, FullForm, ... und vielen vielen

mehr bietet Mathematica auch die Möglichkeit, eigene Funktionen zu definieren. Im einafchsten Fall

sind das Funktionen im Sinne von mathematischen Funktionen. Solche user-defined functions können

aber auch komplexere Aufgaben erledigen, und bilden somit die Grundbausteine des Programmierens

mit Mathematica. In diesem Abschnit werden Sie lernen, wie sie einfache Funktionen selbst definieren

können (4.1), was man unter Überladen von Funktionen versteht (4.3), und wie komplexere Funktionen

aus mehreren Teilschritten zusammengefügt werden können (4.4).

4.1 Einfache Funktionsdefinitionen

Wir beginnen mit einer einfachen Funktion, wie wir sie in der Mathematik kennen: f(x) = sin(5x) + ex+2.

Die entsprechende Funktionsdefinition in Mathematica lautet wie folgt:

f@x_D := Sin@5 xD + ãx

+ 2

Auf der linken Seite legen wir den Funktionsnamen fest, hier “f” und wählen einen Namen für das

Argument der Funktion “x”. Beachten Sie das wichtige “x_” auf der linken Seite, das ein sogenanntes

Pattern bezeichnet (mehr über Patterns in Kapitel 10). Auf der rechten Seite von “:=” steht dann die

eigentliche Fuktionsdefinition mit “x” als Argument, ohne dem “_”.

Durch Aufrufen der Funktion mit unterschiedlichem Argument erreichen wir, dass “f” jeweilsmit dem

entsprechenden Argument ausgewertet wird.

f@xDf@yDf@1Df@Π[email protected] + ã

x+ Sin@5 xD

2 + ãy

+ Sin@5 yD

2 + ã + Sin@5D

2 + ãΠ

3.75936

Wir können unsere Funktion f nun auch in Verbindung mit anderen Funktionen verwenden, zB:

Page 2: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Plot@f@xD, 8x, -4, 4<D

-4 -2 2 4

5

10

15

20

25

30

D@f@xD, xD H* oder ...*Lf'@yDãx

+ 5 Cos@5 xD

ãy

+ 5 Cos@5 yD

à f@xD âx

ãx

+ 2 x -1

5

Cos@5 xD

Series@f@ΞD, 8Ξ, 0, 4<D

3 + 6 Ξ +Ξ2

2

-62 Ξ3

3

+Ξ4

24

+ O@ΞD5

Mithilfe von “ ?f ” können wir auch jederzeit die Funktionsdefinition abrufen.

? f

Global`f

f@x_D := Sin@5 xD + ãx + 2

Die Clear-Funktion entfernt eine getroffene Funktionsdefinition aus dem globalen Context Global`f

Clear@fD? f

Global`f

2 04_Funktionen.nb

Page 3: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

f@xDf@xD

Funktionen von mehreren Argumenten können durch Anführen von durch Beistrich getrennten Patterns

auf der linken Seite der Funktionsdefinition definiert werden, also zB

In[1]:=

g@x_, y_, Β_D := 1 + Sin@xD Cos@yD ã-Β Ix2+y2M

? g

Global`g

g@x_, y_, Β_D := Sin@xD Cos@yD ã-Γ Ix2+y2M

gB1, 0,

1

2

FgB Π

2

, 1, ΖFg@a, b, cD

1 +Sin@1D

ã

1 + ã-K1+

Π2

4O Ζ

Cos@1D

1 + ã-Ia2+b2M c

Cos@bD Sin@aD

Plot3D@g@x, y, 0.1D, 8x, -2 Π, +2 Π<, 8y, -2 Π, +2 Π<, PlotRange ® AllD

-5

0

5

-5

0

5

0.5

1.0

1.5

04_Funktionen.nb 3

Page 4: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Manipulate@Plot3D@g@x, y, ΒD, 8x, -2 Π, +2 Π<,

8y, -2 Π, +2 Π<, PlotRange ® 80, 2<, PlotPoints ® 20D,8Β, 0, 0.5<D

Β

-5

0

5

-5

0

5

0.0

0.5

1.0

1.5

2.0

D@g@x, y, ΒD, xD H* 1. partielle Ableitung nach x *Lã

-Ix2+y2M ΒCos@xD Cos@yD - 2 ã

-Ix2+y2M Βx Β Cos@yD Sin@xD

D@g@a, b, cD, 8b, 2<D H* 2. partielle Ableitung nach b *LSin@aD

I-ã-Ia2+b2M c

Cos@bD + I-2 c ã-Ia2+b2M c

+ 4 b2c2

ã-Ia2+b2M cM Cos@bD + 4 b c ã

-Ia2+b2M cSin@bDM

D@g@a, b, cD, xD H* 1. partielle Ableitung nach x *L0

4.2 Conditional Functions “ /; “

Clear@f, gDMathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des

Arguments der Funktion. Dies kann zum Beispiel zur Definition von stückweise definierten mathematis-

chen Funktionen verwendet werden, wie in dem untenstehenden Beispiel.

4 04_Funktionen.nb

Page 5: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des

Arguments der Funktion. Dies kann zum Beispiel zur Definition von stückweise definierten mathematis-

chen Funktionen verwendet werden, wie in dem untenstehenden Beispiel.

f@x_D := x3 �; x £ 0

f@x_D := x �; 0 < x £ 1

f@x_D := Sin@xD �; x > 1

:fB -1

2

F, fB12

F, fB32

F>

:-1

8

,

1

2

, SinB3

2

F>

? f

Global`f

f@xD := x3 �; x £ 0

f@x_D := x3 �; x £ 0

f@x_D := x �; 0 < x £ 1

f@x_D := Sin@xD �; x > 1

Plot@f@xD, 8x, -2, 5<D

-2 -1 1 2 3 4 5

-3

-2

-1

1

Mathematica bietet auch eine eigene Funktion Piecewise an, um solche stückweisen Definititionen zu

realisieren:

? Piecewise

Piecewise@88val1, cond1<, 8val2, cond2<, … <D represents a

piecewise function with values vali in the regions defined by the conditions condi.

Piecewise@88val1, cond1<, … <, valD uses default value val if none of the condi apply. The default for val is 0. �

04_Funktionen.nb 5

Page 6: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Clear@gDg@x_D := PiecewiseA99x3, x £ 0=, 8x, 0 < x £ 1<, 8Sin@xD, x > 1<=Eg@ΞD

Ξ3 Ξ £ 0

Ξ 0 < Ξ £ 1

Sin@ΞD Ξ > 1

0 True

Plot@g@xD, 8x, -2, 5<D

-2 -1 1 2 3 4 5

-3

-2

-1

1

g'@xD3 x

2x < 0

1 0 < x < 1

Cos@xD x > 1

Indeterminate True

Plot@g'@xD, 8x, -2, 5<D

-2 -1 1 2 3 4 5

-1

1

2

3

4

5

4.3 Überladen von Funktionen

6 04_Funktionen.nb

Page 7: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

4.3 Überladen von Funktionen

Ein und derselbe Funktionsnamen kann für unterschiedliche Aufgaben verwendet werden, wenn sich

Anzahl und/oder Art der Funktionsargumente ändern. Diese Eigenschaft von Funktionen nennt man

Überladen.

Dazu ein Beispiel:

Clear@fD? f

Global`f

f@x_D := 1 + x + x2

f@x_, y_D := x + y

f@x_, y_, z_D :=1

x + y - z

? f

Global`f

f@x_D := 1 + x + x2

f@x_, y_D := x + y

f@x_, y_, z_D :=1

x+y-z

f@ΞDf@a, bDf@a, b, cDf@a, b, c, dD1 + Ξ + Ξ

2

a + b

1

a + b - c

f@a, b, c, dD

Wie wir in Kapitel 10 (Patterns) noch genauer lernen werden, kann das Überladen von Funktionen auch

dazu benutzt werden, unterschiedliche Aufgaben auszuführen, abhängig vom Typ des Arguments.

04_Funktionen.nb 7

Page 8: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Clear@gDg@x_IntegerD := x

g@x_RealD := x

g@x_ComplexD := x - Conjugate@xD

? g

Global`g

g@x_IntegerD := x

g@x_RealD := x

g@x_ComplexD := x - Conjugate@xD

g@[email protected]@1 + äDg@ΠD2

1.41421

2 ä

g@ΠD

Der Grund, warum g[Π] nicht ausgewertet wird liegt daran, dass die Spezifikation nach dem Pattern x_

also Integer, Real, und Complex mit dem Head des Ausdrucks x übereinstimmen muss. Es gilt aber:

Head@ΠDSymbol

Die Funktionsdefinition könnte also noch entsprechend erweitert werden, zB

g@x_SymbolD := x2

? g

8 04_Funktionen.nb

Page 9: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Global`g

g@x_IntegerD := x

g@x_RealD := x

g@x_ComplexD := x - Conjugate@xD

g@x_SymbolD := x2

g@ΠDg@xDΠ2

x2

4.4 Compound Functions and Modules

Wie auch in anderen Programmiersprachen ist es auch in Mathematica möglich Funktionen zu

definieren, die aus mehreren Teilschritten bestehen bzw. die ihrerseits andere Funktionen aufrufen.

Hierzu behandeln wir zwei Möglichkeiten, nämlich die Konstruktion von sogenannten Compound

Functions und die Variante über die Funktion “Module”. Die letztere Variante ist vorzuziehen, da sie die

Möglichkeit bietet lokale Variablen zu definieren, die nur innerhalb der Funktion bekannt sind, was für

eine modularen Programmierstil unerlässlich ist.

Compound Functions

Um eine Compound Function zu definieren, werden die werden die Teilschritte in runden Klammern ( )

eingeschlossen, und die einzelnen Teilschritte durch Strichpunkte ; von einander getrennt.

name[args] := (expr1; expr2; ...; exprn)

name is der Name der Funktion, expr1, expr2, ... sind die Ausdrücke, die nacheinander in dieser Reihen-

folge abgearbeitet werden. Dazu ein einfaches Beispiel:

f@x_D := Iy = x2; 2 yM

f@3D18

Der Nachteil von Compound Functions ist, dass etwaige Zuweisungen, die innerhalb der Compound

Function passieren, auch außerhalb sichtbar sind. Das heißt in unserem Beispiel, dass die Variable y

nach Aufrufen von f[3] den Wert 9 hat!

04_Funktionen.nb 9

Page 10: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

y

? y

9

Global`y

y = 9

f@4Dy

32

16

Die Tatsache, dass Hilfsfunktionen (oder Hilfsvariablen) globalen Charakter haben, kann zu ernsthaften

Problemen führen, wie das untenstehende Beispiel verdeutlichen soll:

PowerSum@x_, n_D :=

Is = 0;

DoAs = s + xi, 8i, 1, n<E;

sMUnsere Funktion PowerSum soll die Summe x + x

2+ x

3+ ... bis nur n-ten Potenz von x berechnen. Das

tut die Funktion auch, wenn man als Argument zB x, y, oder 2 wählt

Clear@x, yDPowerSum@x, 5DPowerSum@y, 5DPowerSum@2, 5Dx + x

2+ x

3+ x

4+ x

5

y + y2

+ y3

+ y4

+ y5

62

Ein Problem ergibt sich allerdings, wenn als Argument “i” oder “s” gewählt wird, da diese Namen auch

innerhalb der Compound Function als lokale Ausdrücke verwendet werden:

10 04_Funktionen.nb

Page 11: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

Clear@sDPowerSum@s, 5DPowerSum@i, 5D0

5

Dieses und ähnliche Probleme können durch die Verwendung des Module-Konstrukts vermieden

werden.

Module: Verwendung von lokalen Variablen

Innerhalb einer Module-Function ist es möglich expressions als lokal zu definieren, das heißt, diese

Variablen sind außerhalb des Modules nicht bekannt.

name[args] := Module[{variables to localize},

expr1;

expr2;

...

expr]

Remove@i, x, sD

PowerSum2@x_, n_D := ModuleA8i, s<,s = 0;

DoAs = s + xi, 8i, 1, n<E;

sE

? s

? i

Global`s

Global`i

PowerSum2@x, 5Dx + x

2+ x

3+ x

4+ x

5

PowerSum2@i, 5Di + i

2+ i

3+ i

4+ i

5

04_Funktionen.nb 11

Page 12: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

PowerSum2@s, 5Ds + s

2+ s

3+ s

4+ s

5

Ein weiteres Beispiel. Hier sind y und z die lokalen Variablen, und die letzte Expression (z) wird als

Resultat der Funktion g[x] ausgegeben.

g@x_D := ModuleA8y, z<,y = Sin@xD;z = ExpA-y

2EE

g@yDã

-Sin@yD2

Es ist natürlich auch möglich, dass die Funktion von mehreren Argumenten abhängt (hier: x und y). Als

lokale Variablen sind unten die Variablen i, j und k definiert. Als Ergebnis dieser Funktion h[x,y] wird

hier eine Liste {i,j,k} übergeben.

h@x_, y_D := ModuleB8i, j, k<,i = Sin@xD - Cos@yD;j = Exp@x yD;k = i j ;

8i, j, k<F

h@a, bD

:-Cos@bD + Sin@aD, ãa b, ã

a b H-Cos@bD + Sin@aDL >

Für umfangreichere Funktionen ist es sinnvoll, einen Hilfetext zu verfassen, der darüber Auskunft gibt,

wie die Funktion zu verwenden ist, und was sie bezweckt. Unten ein Beispiel:

dsolve@eqn_, initial_, functions_, variable_D := Module@8system, solution, r, v<,system = Join@eqn, initialD;solution = DSolve@system, functions, variableD @@1DD;r = Simplify@functions �. solutionD;v = D@r, tD;8r, v<D

dsolve::usage = "dsolve@eqn,initial,functions,variableDThis module analytically solves the system of differential equations

HeqnL with the initial conditions HinitialL for the functions

HfunctionsL depending on the variable HvariableL. The module

returns the solution and its first derivative, that is 8r@tD,v@tD<,where rHtL is the position vector and vHtL is the velocity.";

12 04_Funktionen.nb

Page 13: 4. Funktionen als Programmepep/Lehre/Mathematica2014/04_Funktion… · Mathematica erlaubt es mehrere Funktionsdefinition zu verwenden in Abhängigkeit von Wert des Arguments der

? dsolve

dsolve@eqn,initial,functions,variableDThis module analytically solves the system of differential equations HeqnL with the initial conditions HinitialL for

the functions HfunctionsL depending on the variable HvariableL. The module returns the solution

and its first derivative, that is 8r@tD,v@tD<, where rHtL is the position vector and vHtL is the velocity.

eom = 8m x''@tD � 0, m z''@tD � -m g<;initial = 8x@0D � 0, z@0D � 0, x'@0D � v0 Cos@ΘD, z'@0D � v0 Sin@ΘD<;dsolve@eom, initial, 8x@tD, z@tD<, tD

::t Cos@ΘD v0, -g t

2

2

+ t Sin@ΘD v0>, 8Cos@ΘD v0, -g t + Sin@ΘD v0<>

Übungsaufgaben

Ü4.1: Betrachten Sie die folgenden fehlerhaften Funktionsdefinitionen und berichtigen Sie sie.

f@xD := x2

g@x_, y_D := Sin@x_D Cos@y_D;h Ha_L := a + 3;

D@x_D := Hx - 2L3;

Ü4.2: Definieren Sie eine Funktion abs(x), die den Absolutbetrag |x| berechnet. Die Funktion soll dabei

unterscheiden, ob x eine reelle bzw. komplexe Zahl ist und entsprechend der mathematischen Defini-

tion den Betrag berechnen. (Hinweis: Es gibt in Mathematica natürlich bereits eine Funktion Abs[x], die

genau das macht, von dieser Funktion sollen Sie hier keinen Gebrauch machen ;-). Plotten Sie: Plot[ab-

s[x],{x,-2,2}]

Ü4.3: Schreiben Sie eine Funktion int, die entweder das unbestimmte ( int[f] ) oder das bestimmte

Integral ( int[f,a,b] ) einer Funktion f(x) berechnet. Testen Sie ihre Funktion mit: (i) int[Sin[x]], (ii)

int[Sin[x],0,Π], (iii) intB1� x ,0,2]

Ü4.4: Schreiben Sie eine Funktion s[x,n], die folgende endliche Reihe berechnet: 1 -1

x+

1

x2

- ...H-1Ln

xn

.

Hinweise: Verwenden Sie Module und eine “Do”-Schleife (und nicht die Sum-Funktion). Berechnen Sie:

(i) s[1,100], (ii) s[1,101], (iii) s[2,100], (iv) s[2.0,100]

04_Funktionen.nb 13