4. funktionen als programmepep/lehre/mathematica2014/04_funktion… · mathematica erlaubt es...
Post on 30-Apr-2020
0 Views
Preview:
TRANSCRIPT
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@ΠDf@1.0D2 + ã
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:
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
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
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
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
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
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
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@2Dg@2.0Dg@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
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
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
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
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
? 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
top related