Einführung in Maple: 1. Arbeitsblatt
Einführung in Maple: 1. Arbeitsblatt
Einführung in Maple: 1. Arbeitsblatt
Verwandeln Sie Ihre PDFs in ePaper und steigern Sie Ihre Umsätze!
Nutzen Sie SEO-optimierte ePaper, starke Backlinks und multimediale Inhalte, um Ihre Produkte professionell zu präsentieren und Ihre Reichweite signifikant zu maximieren.
Priv. Doz. Dr. Bernhard Schmidt 22.4.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: <strong>1.</strong> <strong>Arbeitsblatt</strong><br />
Nach dem Start von <strong>Maple</strong> bef<strong>in</strong>den Sie sich <strong>in</strong> e<strong>in</strong>em <strong>Maple</strong>-<strong>Arbeitsblatt</strong> (worksheet). Innerhalb<br />
des <strong>Arbeitsblatt</strong>s reagiert <strong>Maple</strong> auf die E<strong>in</strong>gabe von Befehlen mit e<strong>in</strong>er Ausgabe.<br />
E<strong>in</strong>gaben und Ausgaben von <strong>Maple</strong> s<strong>in</strong>d hier immer im Fettdruck geschrieben. Wichtige<br />
Punkte:<br />
• <strong>Maple</strong>-Befehle müssen immer mit e<strong>in</strong>em Semikolon oder e<strong>in</strong>em Doppelpunkt abgeschlossen<br />
werden.<br />
• Dabei unterdrückt e<strong>in</strong> Doppelpunkt die Ausgabe des Ergebnisses.<br />
• <strong>Maple</strong> unterscheidet zwischen Kle<strong>in</strong>- und Großschreibung.<br />
• Nur runde Klammern s<strong>in</strong>d Klammern im mathematischen S<strong>in</strong>n. Geschweifte Klammern<br />
umschlie¨sen Mengen, eckige Klammern umschließen Listen.<br />
• <strong>Maple</strong>-Variablen brauchen nicht deklariert zu werden.<br />
• E<strong>in</strong>e Zuweisung erfolgt mit :=, nicht e<strong>in</strong>fach mit =. Richtung wäre z.B. pi:=3.14;,<br />
falsch dagegen pi=3.14.<br />
• Kommazahlen werden wie im Englischen mit e<strong>in</strong>em Dezimalpunkt geschrieben, z.B.<br />
3.1415926<br />
• Man sollte von vornehere<strong>in</strong> allen Zwischenergebnissen durch Zuweisungen Namen<br />
geben, um später leicht auf sie zugreifen zu können.<br />
1
1 Arithmetische Operationen, mathematische Funktionen<br />
Operation<br />
Befehlsbeispiel<br />
Addition 5+444;<br />
Subtraktion 324-234;<br />
Multiplikation 234*2432;<br />
Division 234324/3;<br />
Potenzierung 2ˆ23434;<br />
Divisionsrest 33 mod 13;<br />
Fakultät 10!;<br />
Kreiszahl π<br />
Pi;<br />
Dezimaldarstellung<br />
evalf(Pi);<br />
Exponetialfunktion e x<br />
exp(10);<br />
Eulersche Zahl<br />
exp(1);<br />
Natürlicher Logarithmus<br />
log(23);<br />
S<strong>in</strong>us<br />
s<strong>in</strong>(Pi/2);<br />
Mehrgliedrige Summe<br />
sum(i,i=<strong>1.</strong>.10);<br />
Mehrgliedriges Produkt<br />
product(1+1/x, x=<strong>1.</strong>.10);<br />
Runden zur nächsten ganzen Zahl round(2.6);<br />
Zuweisungen<br />
A:=200034; B:=evalf(s<strong>in</strong>(10));<br />
Aufgabe <strong>1.</strong>1 a) Berechnen Sie die Dezimaldarstellung von<br />
π 8 + π 2 + 3π<br />
e 4 + 1<br />
(e = Eulersche Zahl). Achtung: E<strong>in</strong>e Multiplikation erfordert e<strong>in</strong>en * (z.B. 3*Pi). Runden<br />
Sie dann zur näcsten ganzen Zahl z und berechen Sie z 10 modulo 13.<br />
Notwendige Befehle: exp, evalf, round, mod.<br />
b) Berechnen Sie die Dezimaldarstellung von<br />
für n = 10000.<br />
2 Die Hilfefunktion<br />
log n −<br />
<strong>Maple</strong> verfügt über e<strong>in</strong>e hervorragende Hilfefunktion. Nach E<strong>in</strong>gabe von ?B; wird e<strong>in</strong>e<br />
ausführliche Beschreibung des Befehls B angezeigt und auf weitere verwandte Befehle<br />
verwiesen. Die Hilfefunktion ist so gut, dass man durchaus große Teile von <strong>Maple</strong> alle<strong>in</strong><br />
mit ihrer Hilfe erlernen kann. Wichtig:<br />
• Die Beispiele am Ende der Hilfe-Anzeige s<strong>in</strong>d meist am hilfreichsten.<br />
Befehl<br />
?matrix;<br />
???matrix;<br />
n∑<br />
i=1<br />
Kommentar<br />
Hilfe zu Matrizen wird angezeigt<br />
Beispiele zu Matrizen werden angezeigt<br />
Aufgabe 2.1 F<strong>in</strong>den Sie durch ?randmatrix; heraus, wie man e<strong>in</strong>e Zufallsmatrix erzeugt.<br />
Erzeugen Sie als Beispiel e<strong>in</strong>e 30x30-Zufallsmatrix.<br />
2<br />
1<br />
i
3 Die <strong>Maple</strong>-Pakete<br />
<strong>Maple</strong>-Pakete s<strong>in</strong>d Pakete von nützlichen Befehlen jeweils zu e<strong>in</strong>em bestimmten mathematischen<br />
Gebiet.<br />
Wichtig: Bevor man e<strong>in</strong>en Befehl (z.B. matrix) e<strong>in</strong>es Pakets (hier l<strong>in</strong>alg) verwenden<br />
kann, muss das Paket geladen werden (hier mit with(l<strong>in</strong>alg);).<br />
Alle verfügbaren Pakete kann man sich mit ?package; anzeigen lassen. Da man zu den<br />
e<strong>in</strong>zelnen Paketen durch die Hilfefunktion sehr gute Informationen erhält, kann man sich<br />
so <strong>in</strong>teraktiv schnell e<strong>in</strong>en Überblick verschaffen.<br />
Überblick e<strong>in</strong>iger Pakete<br />
• l<strong>in</strong>alg Rechnen mit Matrizen und Vektoren, von der Matrizenmultiplikation bis zu<br />
Eigenwertbestimmung und Normalformen<br />
• numtheory Befehle für elementare Zahlentheorie, z.B. Primzahltest, Bestimmung<br />
der n-ten Primzahl, Faktorisierung ganzer Zahlen.<br />
• plots Hilfsmittel zum Erzeugen von zwei- und dreidimensionalen Graphiken.<br />
• stats Das Statistik-Paket.<br />
Aufgabe 3.1 F<strong>in</strong>den Sie mit Hilfe von ?l<strong>in</strong>alg; den Befehl zum Lösen l<strong>in</strong>earer Gleichungssysteme<br />
und lösen Sie<br />
x 1 + x 2 + x 3 = 5<br />
2x 1 − x 2 − x 3 = 10<br />
5x 1 − 3x 2 + x 3 = 0<br />
H<strong>in</strong>weis: Dazu muss man die Koeffizienten der l<strong>in</strong>ken Seiten mit<br />
A:=matrix([[1,1,1],[2,-1,-1],[5,-3,1]]); <strong>in</strong> e<strong>in</strong>e Matrix und die rechten Seiten mit<br />
b:=vector([5,10,0]); <strong>in</strong> e<strong>in</strong>en Vektor schreiben.<br />
4 Ausdrücke, Typen und Funktionen<br />
E<strong>in</strong> Ausdruck ist <strong>in</strong> <strong>Maple</strong> e<strong>in</strong>e beliebige Folge von Zeichen, die die Syntaxregeln nicht<br />
verletzt. Zum Beispiel s<strong>in</strong>d s<strong>in</strong>(x) und jdfksk234 gültige Ausdrücke, aber nicht aˆˆx, da<br />
ˆˆ e<strong>in</strong> Syntaxfehler ist.<br />
Jeder Ausdruck X besitzt <strong>in</strong> <strong>Maple</strong> e<strong>in</strong>en Typ, den man sich mit whattype(X); anzeigen<br />
lassen kann. Zum Beispiel liefert a:=10: whattype(a); die Ausgabe <strong>in</strong>teger. Mit<br />
type(X,T); kann man prüfen, ob der Ausdruck X vom Typ T ist. E<strong>in</strong> Ausdruck kann<br />
durchaus mehrere Typen haben. Zum Beispiel ist der Ausdruck 10 sowohl vom Typ <strong>in</strong>teger<br />
als auch vom Typ polynom. E<strong>in</strong> Ausdruck X kann (falls erlaubt) mit Hilfe des<br />
Befehls convert(X,T); <strong>in</strong> e<strong>in</strong>en Ausdruck vom Typ T umgewandelt werden. Mit op(X);<br />
erhält man die “Operanden” des Ausdrucks X. Mit subs(x=t,A); kamm man die Variable<br />
x im Ausdruck A durch t ersetzen.<br />
Wichtig: Machen Sie sich mit den unentbehrlichen Befehlen op, subs, map, convert<br />
vertraut. Beispiele s<strong>in</strong>d unten zu f<strong>in</strong>den.<br />
3
Aufgabe<br />
Bestimmung des Typs<br />
Test, ob Ausdruck vom Typ rational<br />
Umwandlung <strong>in</strong> Typ float<br />
Operanden bestimmen<br />
Anzahl der Operanden<br />
S<strong>in</strong>usfunktion auf E<strong>in</strong>träge e<strong>in</strong>er Liste anwenden<br />
Variablen-Substitution <strong>in</strong> Ausdruck<br />
Erzeugung e<strong>in</strong>er Funktion<br />
Befehlsbeispiel<br />
whattype(<strong>1.</strong>44);<br />
type(5433,rational);<br />
covert(1/2,float);<br />
op([1,2,3]);<br />
nops([1,2,3]);<br />
map(s<strong>in</strong>,[0.1,<strong>1.</strong>4]);<br />
subs(x=2,s<strong>in</strong>(x)ˆ2);<br />
f:=x ->x*s<strong>in</strong>(x);<br />
<strong>Maple</strong>-Typen Bedeutung<br />
<strong>in</strong>teger ganze Zahl<br />
float<br />
Kommazahl<br />
rational Bruch<br />
complex komplexe Zahl (imag<strong>in</strong>äre E<strong>in</strong>heit ist I)<br />
exprseq Aufzählung von Ausdrücken, Trennung durch Kommas<br />
list<br />
Auszählung von Ausdrücken <strong>in</strong> eckigen Klammern<br />
set<br />
Auszählung von Ausdrücken <strong>in</strong> geschweiften Klammern<br />
Aufgabe 4.1 a) Geben Sie Z:=<strong>1.</strong>4; e<strong>in</strong>. Bestimmen Sie mit whattype den Typ von Z.<br />
Wandeln Sie Z mit convert <strong>in</strong> e<strong>in</strong>e Zahl Z1 vom Typ rational um.<br />
b) Erzeugen Sie mit f:=x ->convert(x,float); e<strong>in</strong>e Funktion und wenden Sie sie auf Z1<br />
an.<br />
Aufgabe 4.2 a) Geben Sie den Befehl L:=[<strong>1.</strong>3, 3.44, 0.34, 5.0, 30.03]; e<strong>in</strong>. Das erzeugt<br />
e<strong>in</strong>e Liste L, die fünf Kommazahlen enthält.<br />
b) Verwandeln Sie die E<strong>in</strong>träge von L mit g:=x ->convert(x,rational); L1:=map(g,L);<br />
<strong>in</strong> Brüche.<br />
c) Überprüfen Sie mit type(L1[2],rational);, ob der zweite E<strong>in</strong>trag von L1 tatsächlich<br />
vom Typ rational ist.<br />
d) Wenden Sie mit Hilfe von map die S<strong>in</strong>usfunktion auf alle E<strong>in</strong>träge von L an.<br />
e) Bestimmen Sie mit nops die Anzahl der E<strong>in</strong>träge von L und L<strong>1.</strong><br />
5 Die Typen exprseq, list, set<br />
Folgen, Listen und Mengen s<strong>in</strong>d grundlegend für fast alle <strong>Maple</strong>-Anwendungen. E<strong>in</strong>e<br />
durch Kommas getrennte Folge von Ausdrücken hat <strong>in</strong> <strong>Maple</strong> den Typ exprseq (für<br />
expression sequence). Längere Folgen von Ausdrücken kann mit mit seq erzeugen, z.B.<br />
ergibt S:=seq(aˆ2, a=<strong>1.</strong>.100); die Folge der ersten 100 Quadratzahlen. Eckige bzw.<br />
geschweifte Klammern um e<strong>in</strong>e exprseq machen sie zu e<strong>in</strong>er list bzw. set.<br />
Befehl<br />
s:=4,5,6,a,b,c;<br />
whattype(s);<br />
L:=[s];<br />
whattype(s);<br />
m:=op(L);<br />
M:={m};<br />
whattype(M);<br />
Erläuterung<br />
Erzeugung e<strong>in</strong>er Folge<br />
Typbestimmung (ergibt exprseq)<br />
Umwandlung <strong>in</strong> e<strong>in</strong>e Liste<br />
Typbestimmung (ergibt list)<br />
Entfernung der eckigen Klammern<br />
Umwandlung <strong>in</strong> e<strong>in</strong>e Menge<br />
Typbestimmung (ergibt set)<br />
4
Auf das i-te Element e<strong>in</strong>er Folge oder Liste L kann man mit L[i] zugreifen. E<strong>in</strong>e set<br />
ist e<strong>in</strong>e Menge von ungeordneten Elementen, also e<strong>in</strong>e Menge im mathematischen S<strong>in</strong>n.<br />
Mengen kann man schneiden, vere<strong>in</strong>igen und vone<strong>in</strong>ander abziehen:<br />
Befehl Erläuterung<br />
s:=1,2,3,a,b,c; Erzeugung e<strong>in</strong>er Folge<br />
s[5]; Auswertung des 5. Elements der Folge (ergibt b)<br />
m:={s}; Umwandlung <strong>in</strong> e<strong>in</strong>e Menge<br />
n:={1,2,3,4}; Erzeugung e<strong>in</strong>er Menge<br />
m <strong>in</strong>tersect n; Schnittmenge<br />
m union n; Vere<strong>in</strong>igungsmenge<br />
m m<strong>in</strong>us n; Differenzmenge<br />
Aufgabe 5.1 a) Erzeugen Sie mit Hilfe von seq e<strong>in</strong>e Folge, die die ersten 100 Primzahlen<br />
enthält (notwendiger Befehl: ithprime). Geben Sie dieser Folge den Namen PrimFolge.<br />
b) Wandelen Sie PrimFolge mit PrimList:=[PrimFolge]; <strong>in</strong> e<strong>in</strong>e Liste um. Probieren<br />
Sie aus, was der Befehl op(PrimList); liefert. Wandeln Sie dann PrimList mit Hilfe von<br />
op und geschweiften Klammern <strong>in</strong> e<strong>in</strong>e Menge PrimSet um. Überprüfen Sie die Typen<br />
von PrimList und PrimSet mit whattype.<br />
c) Erzeugen Sie e<strong>in</strong>e Menge M, die die zweite, vierte,...,hundertste Primzahl enthält.<br />
Lassen Sie sich die Differenzmenge von PrimSet und M anzeigen.<br />
6 Die Befehle vector und matrix<br />
Die Befehle vector und matrix gehören zum Paket l<strong>in</strong>alg. Man muss dieses Paket also<br />
mit with(l<strong>in</strong>alg): laden, bevor man mit diesen Befehlen arbeitet (oder man benutzt die<br />
lange Befehlsform a la l<strong>in</strong>alg[vector], was aber umständlich ist).<br />
6.1 Initialisierung von Vektoren und Matrizen<br />
Befehl<br />
v:=vector([1,2,3]);<br />
v[2];<br />
v[1]:=100;<br />
M:=matrix([[1,2,3],[4,5,6]]);<br />
M:=matrix(2,3,[1,2,3,4,5,6]);<br />
M[1,1]:=234;<br />
Erläuterung<br />
Erzeugen e<strong>in</strong>es Vektors<br />
Auswerten des 2. E<strong>in</strong>trags<br />
Setzen des <strong>1.</strong> E<strong>in</strong>trags<br />
Erzeugung e<strong>in</strong>er 2x3-Matrix<br />
Erzeugt die gleiche Matrix<br />
Setzen des (1,1)-E<strong>in</strong>trags<br />
Aufgabe 6.1 Initialisieren Sie e<strong>in</strong>e 10x10-Matrix M = (m ij ), wobei m ij = ij 2 .<br />
H<strong>in</strong>weise: Laden Sie zunächst das Paket l<strong>in</strong>alg. Deklarieren Sie die Matrix mit M:=matrix(10,10);<br />
Weisen Sie die E<strong>in</strong>träge mit e<strong>in</strong>er doppelten for-Schleife zu:<br />
for i from 1 to 10 do<br />
for j from 1 to 10 do<br />
M[i,j]:=i*jˆ2: od: od:<br />
Das Ergebnis kann man mit evalm(M); überprüfen.<br />
5
6.2 Rechnen mit Matrizen und Vektoren<br />
Zunächst e<strong>in</strong> Experiment, das zeigt, wie es nicht geht:<br />
Befehl<br />
Kommentar<br />
v:=vector([1,1]); w:=vector([2,2]); Erzeugung von Vektoren<br />
v; Versuch e<strong>in</strong>er Auswertung, schlägt fehl<br />
v+w;<br />
Versuch e<strong>in</strong>er Addition, schlägt fehl<br />
Vektoren und Matrizen streuben sich gegen Auswertungen, und daher muss man den speziellen<br />
Auswertungsbefehl evalm e<strong>in</strong>setzen.<br />
Wichtig: Der Operator für Matrizenmultiplikation und Matrix-Vektor-Multiplikation ist<br />
&* und nicht e<strong>in</strong>fach *.<br />
Befehl<br />
M:=matrix([[1,2],[2,3]]);<br />
N:=matrix([[1,2],[0,0]]);<br />
evalm(M);<br />
A:=evalm(M+N);<br />
B:=evalm(3*M);<br />
C:=M*N;<br />
C:=evalm(M&*N);<br />
D:=evalm(Mˆ5);<br />
v:=vector([1,9]);<br />
w:=evalm(M&*v);<br />
E:=transpose(M);<br />
F:=<strong>in</strong>verse(M);<br />
Erläuterung<br />
Erzeugen von Matrizen<br />
Auswerten e<strong>in</strong>er Matrix<br />
Summe von Matrizen<br />
Matrix mal Skalar<br />
Falsch!<br />
Matrizenprodukt<br />
Matrizenpotenzierung<br />
Erzeugung e<strong>in</strong>es Vektors<br />
Matrix-Vektor-Produkt<br />
transponierte Matrix<br />
Inverse<br />
Aufgabe 6.2 Die Cholesky-Faktorisierung e<strong>in</strong>er quadratischen Matrix A ist e<strong>in</strong>e Darstellung<br />
A = RR t , wobei R e<strong>in</strong>e untere Dreiecksmatrix ist.<br />
a) Erzeugen Sie die Matrix<br />
⎛<br />
4 −6 68<br />
⎞<br />
M := ⎝−6 8658 −1032⎠<br />
68 −1032 1265<br />
b) Berechnen Sie mit R:=cholesky(M); die Cholesky-Faktorisierung von M.<br />
c) Überprüfen Sie, ob tatsächlich RR t = M gilt.<br />
6
Priv. Doz. Dr. Bernhard Schmidt 29.4.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 2. <strong>Arbeitsblatt</strong><br />
Die <strong>Maple</strong>-Programmiersprache und<br />
Prozeduren<br />
1 Kontrollstrukturen<br />
Die wichtigsten Kontrollstrukturen <strong>in</strong> <strong>Maple</strong> s<strong>in</strong>d for- und while-Schleifen sowie if-else-<br />
Verzweigungen.<br />
<strong>1.</strong>1 for-Schleifen<br />
Befehlsbeispiel<br />
for i from 1 to 10 do<br />
pr<strong>in</strong>t(iˆ2);<br />
od;<br />
for i from 1 to 10 by 2 do<br />
pr<strong>in</strong>t(iˆ2);<br />
od;<br />
for i from 1 to 10<br />
while iˆ3 < 500 do<br />
pr<strong>in</strong>t(iˆ2);<br />
od;<br />
M:={1,5,8,10,12};<br />
for x <strong>in</strong> M do<br />
pr<strong>in</strong>t(2*x-4);<br />
od;<br />
Erläuterung<br />
Die Variable i wird von 1 bis 10 hochgezählt<br />
und für jeden Wert wird das Quadrat ausgegeben.<br />
Wichtig: Die Schleifenanweisungen müssen durch<br />
do ... od; e<strong>in</strong>geschlossen werden.<br />
Wie oben, wegen by 2 wird jetzt jedoch <strong>in</strong> Zweierstatt<br />
<strong>in</strong> E<strong>in</strong>erschritten hochgezählt.<br />
Wie oben, allerd<strong>in</strong>gs mit e<strong>in</strong>er Abbruchbed<strong>in</strong>gung.<br />
Die Schleife wird vollständig abgebrochen, sobald<br />
die Bed<strong>in</strong>gung nicht mehr erfüllt ist.<br />
Die for-Schleife iteriert hier über e<strong>in</strong>e Menge. Für<br />
jedes Element x der Menge wird 2x-4 ausgegeben.<br />
Aufgabe <strong>1.</strong>1 a) Berechnen Sie mit e<strong>in</strong>er for-Schleife die Dezimaldarstellung von ∫ 1<br />
0 s<strong>in</strong>(x)i dx<br />
für i = 1, 2, ..., 10.<br />
Notwendige Befehle: <strong>in</strong>t, evalf. Mit ?<strong>in</strong>t; können Sie die Hilfe zur Integrals-Funktion<br />
aufrufen.<br />
b) Schreiben Sie e<strong>in</strong>e for-Schleife, die für i = 1, ..., 10 die Zahl 2 2i + 1 ausgibt und sofort<br />
abbricht, falls diese Zahl ke<strong>in</strong>e Primzahl ist.<br />
Notwendige Befehle: while, isprime.<br />
1
c) Schreiben Sie e<strong>in</strong>e for-Schleife unter Verwendung von by, die jede 20. Primzahl < 1000<br />
ausggibt.<br />
Notwendige Befehle: while, ithprime.<br />
d) Erzeugen Sie e<strong>in</strong>e Menge M, die 10 ganzzahlige Zufallszahlen aus dem Intervall [2, 101]<br />
enthält. Testen Sie mit e<strong>in</strong>er for-Schleife über M, welche Elemente von M Primzahlen<br />
s<strong>in</strong>d.<br />
Notwendige Befehle: seq, rand(2..101)()<br />
<strong>1.</strong>2 while-Schleifen<br />
while-Schleifen führen Anweisungen aus bis e<strong>in</strong>e Abbruchbed<strong>in</strong>gung erfüllt ist. Innerhalb<br />
der Anweisungen muss man sicherstellen, dass die Abbruchbed<strong>in</strong>gung wirklich irgendwann<br />
erfüllt wird, ansonsten hat man e<strong>in</strong>e Endlosschleife.<br />
Befehlsbeispiel<br />
i:=10;<br />
while i< 20 do<br />
i:=i+2;<br />
pr<strong>in</strong>t(i);<br />
od;<br />
Erläuterung<br />
i wird solange um 2 hochgezählt und ausgegeben<br />
bis der Wert 20 erreicht ist.<br />
Aufgabe <strong>1.</strong>2 Schreiben Sie e<strong>in</strong>e while-Schleife, die i beg<strong>in</strong>nend mit 1 <strong>in</strong> jedem Schritt<br />
um e<strong>in</strong>s hochzählt und abbricht, falls 7*i+1 e<strong>in</strong>e Primzahl ist.<br />
<strong>1.</strong>3 if-else-Verzweigungen<br />
if-else-Verzweigungen dienen dazu, den Programmverlauf durch Bed<strong>in</strong>gungen zu steuern.<br />
Befehlsbeispiel<br />
p:=ithprime(100);<br />
if p< 1000 then<br />
pr<strong>in</strong>t(”p ist kle<strong>in</strong>”);<br />
fi;<br />
p:=ithprime(100);<br />
if p< 1000 then<br />
pr<strong>in</strong>t(”p ist kle<strong>in</strong>”);<br />
else<br />
pr<strong>in</strong>t(”p ist gross”);<br />
fi;<br />
Erläuterung<br />
Es wird getest, ob die hundertste Primzahl kle<strong>in</strong>er<br />
als 1000 ist und e<strong>in</strong>e Ausgabe-Anweisung wird genau<br />
dann ausgeführt, wenn dies der Fall ist. Die<br />
if-Verzweigung wird durch if ... then ... fi; umschlossen,<br />
wobei ke<strong>in</strong> Teil weggelassen werden darf.<br />
Wie oben, nur mit else-Alternative. Die Anweisung<br />
nach else wird genau dann ausgeführt, wenn<br />
die if-Bed<strong>in</strong>gung nicht erfüllt ist.<br />
Aufgabe <strong>1.</strong>3 Schreiben Sie e<strong>in</strong>e for-Schleife über i=990,991,...,1010, die i ausgibt,<br />
falls i e<strong>in</strong>e Primzahl ist und andernfalls die Teilermenge von i ausgibt.<br />
Notwendige Befehle: isprime, numtheory[divisors]<br />
2
2 Logische Ausdrücke<br />
In while- und if-Bed<strong>in</strong>gungen werden logische Ausdrücke getestet. Logische Ausdrücke<br />
erzeugt man mit Funktionen oder Operatoren mit Rückgabetyp bool. Beispiele:<br />
isprime (Funktion), =, < , >, < =, >= (Vergleichsoperatoren)<br />
Verknüpfung logischer Ausdrücke<br />
Die Verknüpfung logischer Ausdrücke erfolgt mit den Operatoren and, or, not sowie<br />
runden Klammern zum Zusammenfassen. Beispiel:<br />
a:5; b:=6; c:=7;<br />
if ((a< b) and (b< c)) or (not isprime(a)) then<br />
pr<strong>in</strong>t(a,b,c);<br />
fi;<br />
Aufgabe 2.1 Schreiben Sie e<strong>in</strong>e for-Schleife über i=1,2,...,100, die i genau dann ausgibt,<br />
wenn<br />
(a) i ke<strong>in</strong>e Primzahl oder iˆ2 größer als 500 ist und<br />
(b) i mod 20 gleich 3, 5 oder 18 ist.<br />
3 Prozeduren<br />
Für wiederkehrende Aufgaben kann man <strong>in</strong> <strong>Maple</strong> Prozeduren schreiben. Bei Bedarf kann<br />
man Prozeduren als Textdateien speichern und <strong>in</strong> anderen <strong>Maple</strong>-Sitzungen wiederverwenden.<br />
E<strong>in</strong>e Prozedur P wird erzeugt <strong>in</strong> der Form<br />
Erläuterungen:<br />
P:=proc(Parameter) Anweisungen end;<br />
• Die Parameter bestehen aus e<strong>in</strong>er Folge von Variablen, deren Werte beim Aufruf<br />
an die Prozedur übergeben werden müssen. Prozeduren mit ke<strong>in</strong>en Parametern s<strong>in</strong>d<br />
erlaubt.<br />
• Die Anweisungen s<strong>in</strong>d e<strong>in</strong>e beliebige Folge von <strong>Maple</strong>-Befehlen, meist unter Verwendung<br />
von Kontrollstrukturen.<br />
Befehlsbeispiel<br />
P:=proc(a,b)<br />
return a+b;<br />
end;<br />
P(5,20);<br />
Erläuterung<br />
Prozedur mit zwei Parametern, die die Summe der<br />
Parameter zurückgibt.<br />
Aufruf der Prozedur. Für a wird der Wert 5 und<br />
für b wird der Wert 20 übergeben. Rückgabe ist<br />
25.<br />
3
Aufgabe 3.1 Schreiben Sie e<strong>in</strong>e Prozedur Concat:=proc(L1,L2), die zwei Listen L1<br />
und L1 ane<strong>in</strong>anderhängt. Bei A:=[1,2]: B:=[3,4]: soll Concat(A,B); zum Beispiel die<br />
Ausgabe [1,2,3,4] ergeben.<br />
Notwendige Befehle: proc...end; op. Zwei Folgen F1, F2 kann man e<strong>in</strong>fach mit F1,F2;<br />
ane<strong>in</strong>anderhängen.<br />
Aufgabe 3.2 Schreiben Sie e<strong>in</strong>e Prozedur Zufall:=proc(n), die n Zufallszahlen im Bereich<br />
0,1,...,100 erzeugt und deren Mittelwert und Varianz berechnet. Die Rückgabe soll<br />
die Liste [M,V] se<strong>in</strong>, wobei M und V als Kommazahlen ausgegeben werden sollen.<br />
Notwendige Befehle:<br />
rand(0..100)(), seq, stats[describe,mean], stats[describe,variance]<br />
Aufgabe 3.3 Schreiben Sie e<strong>in</strong>e Prozedur SumAll:=proc(A), die die Summe aller E<strong>in</strong>träge<br />
e<strong>in</strong>er Matrix A zurückgibt.<br />
Notwendige Befehle: with(l<strong>in</strong>alg); rowdim, coldim, sum<br />
Aufgabe 3.4 Bestimmung der Fäche des E<strong>in</strong>heitskreises ohne Kenntnis von π<br />
Das <strong>in</strong> den E<strong>in</strong>heitskreis e<strong>in</strong>geschriebene regelmäßige n-Eck hat die Fläche<br />
Es gilt s<strong>in</strong>(π/2) = 1 und<br />
F (n) = (n/2) s<strong>in</strong>(2π/n).<br />
für 0 ≤ x ≤ π/2 (W<strong>in</strong>kelhalbierungsformel).<br />
s<strong>in</strong>(x/2) =<br />
√<br />
1<br />
2 (1 − √ 1 − s<strong>in</strong>(x) 2 )<br />
a) Berechnen Sie <strong>in</strong> e<strong>in</strong>er for-Schleife die Dezimaldarstellungen von p i := s<strong>in</strong>(π/2 i ) für<br />
i = 1, ..., 20.<br />
H<strong>in</strong>weis: Es gilt p 1 = s<strong>in</strong>(π/2) = <strong>1.</strong> Den Wert von p 2 erhält man als Ausdruck <strong>in</strong> p 1 mit<br />
Hilfe der W<strong>in</strong>kelhalbierungsformel. Allgeme<strong>in</strong> erhält man p i+1 als Ausdruck <strong>in</strong> p i mit Hilfe<br />
dieser Formel.<br />
b) Erhöhen Sie die Rechengenauigkeit mit Digits:=20; und wiederholen Sie die Berechung<br />
aus Teil a.<br />
c) Das <strong>in</strong> den E<strong>in</strong>heitskreis e<strong>in</strong>geschriebene regelmäßige 2 i -Eck hat die Fläche F (2 i ) =<br />
2 i−1 p i−1 . Schreiben Sie e<strong>in</strong>e Prozedur Flaeche:=proc(i), die die Fläche F (2 i ) berechnet.<br />
d) F (2 i ) konvergiert gegen π für i → ∞. Überprüfen Sie dies durch Berechung von F (2 i )<br />
für i = 3, ..., 20.<br />
4
Priv. Doz. Dr. Bernhard Schmidt 6.5.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 3. <strong>Arbeitsblatt</strong><br />
1 Lösung von Gleichungssystemen<br />
Der Grundbefehl zur Lösung von Gleichungssystemen ist solve. Syntax:<br />
solve(Gln, Var);<br />
Dabei ist Gln e<strong>in</strong>e Menge von Gleichungen, und Var ist e<strong>in</strong>e Menge von Variablen,<br />
nach denen aufgelöst werden soll (optional). Standardardmäßig wird nach allen Variablen<br />
aufgelöst. Die Ausgabe ist e<strong>in</strong>e Folge von Mengen, von denen jede e<strong>in</strong>e Lösung enthält.<br />
Bei E<strong>in</strong>gabe von L:=solve(Gln, Var); kann man auf die i-te Lösung mit L[i] zugreifen.<br />
E<strong>in</strong>e Probe der i-ten Lösung ist mit subs(L[i],Gln); möglich. Beispiele:<br />
Befehl<br />
Gln:= {xˆ2=4};<br />
L:=solve(Gln);<br />
subs(L[1],Gln); subs(L[2],Gln);<br />
solve({x+y=4}, {x});<br />
Kommentar<br />
Def<strong>in</strong>ition der Gleichungen<br />
Lösungen werden berechnet<br />
Probe<br />
Gleichung wird nach x aufgelöst<br />
Es stellt sich sofort die Frage, wie man auf die e<strong>in</strong>zelnen Werte der Lösungen zugreifen<br />
kann, da diese ja zum Beispiel <strong>in</strong> der Form {x=5, y=7, z=10} ausgegeben werden. Das<br />
geht wieder am besten mit dem Befehl subs:<br />
E<strong>in</strong>gabe<br />
Ausgabe<br />
L := solve({x + y = 4, x − y = 2}); L := {x = 3, y = 1}<br />
L1 := subs(L, [x, y]); L1 := [3, 1]<br />
K := solve({xˆ2 = 4}); K := {x = 2}, {x = −2}<br />
K1 := subs(K[1], [x]); K1 := [2]<br />
Oft zeigt <strong>Maple</strong> Lösungen unter Verwendung von RootOf an, so dass diese Lösungen<br />
zunächst unausgewertet bleiben. Die explizite Ausgabe der Lösungen erzw<strong>in</strong>gt man mit<br />
dem Befehl allvalues:<br />
Befehl<br />
Gln:= {xˆ2+y=0, x-2∗y=2};<br />
L:=solve(Gln);<br />
allvalues(L);<br />
Kommentar<br />
Lösungen enthalten RootOf<br />
Explizite Ausgabe<br />
1
Aufgabe <strong>1.</strong>1 Lösen Sie das Gleichungssystem<br />
x 2 + 2y + z = 4<br />
x + y + z = 2<br />
x + y = 0.<br />
Lassen Sie sich mit allvalues die zwei Lösungen explizit ausgeben. Führen Sie e<strong>in</strong>e Probe<br />
der Lösungen durch. Extrahieren Sie die Werte von x,y,z mit dem Befehl subs aus den<br />
e<strong>in</strong>zelnen Lösungen und schreiben Sie diese <strong>in</strong> Listen der Form [x,y,z].<br />
2 Numerisches Lösen von Gleichungssystemen<br />
Mit dem Befehl solve will man <strong>in</strong> der Regel exakte Lösungen erhalten. Für komplizierte<br />
Gleichungssysteme ist das jedoch oft unmöglich und man muss auf numerische Lösungen<br />
zurückgreifen. Dafür steht der Befehl fsolve zur Verfügung. Die Syntax von fsolve ist wie<br />
die von solve, nur dass man noch Optionen hat wie x=0..1 (E<strong>in</strong>schränkung der Variablen<br />
x auf das Intervall [0,1]) oder complex (erzw<strong>in</strong>gt Ausgabe nicht-reller Lösungen).<br />
Beispiele: fsolve(xˆ4+1=0, {x}, complex);<br />
fsolve(tan(x)=0, {x}, x=0..10);<br />
Wichtig: fsolve f<strong>in</strong>det i.a. ke<strong>in</strong>eswegs alle Lösungen, sondern liefert nur irgende<strong>in</strong>e Lösung.<br />
Wenn fsolve ke<strong>in</strong>e Lösung f<strong>in</strong>det, kann man noch nicht sicher se<strong>in</strong>, dass ke<strong>in</strong>e Lösung<br />
existiert. Ob man alle Lösungen gefunden hat, kann man manchmal durch Plotten der<br />
<strong>in</strong>volvierten Funktionen überprüfen.<br />
Aufgabe 2.1 F<strong>in</strong>den Sie mit Hilfe von fsolve und plot alle Nullstellen von s<strong>in</strong> x und<br />
von e cos x − log(2 + s<strong>in</strong> x) im Intervall [0,10].<br />
Aufgabe 2.2 Bestimmen Sie mit fsolve alle (auch komplexe) Nullstellen von f = x 64 +<br />
39x 49 + 20x 20 + 14x 5 + 2304 und bestimmen Sie die Anzahl dieser Nullstellen mit Hilfe<br />
von nops. H<strong>in</strong>weis: nops lässt sich auf Listen anwenden, nicht aber auf Folgen.<br />
3 isolve, msolve, rsolve<br />
Aufgabe 3.1 Informieren Sie sich über die Befehle isolve, msolve, rsolve und lösen<br />
Sie folgende Probleme:<br />
a) Bestimmen Sie sie alle ganzzahligen Lösungen von x 2 + y 2 = t für t = 100, 1000, 10000.<br />
b) Betimmen Sie alle Lösungen mod m von x 2 + y 2 + z 2 = 7 für m = 50, ..., 60.<br />
c) Die Fibonacci-Folge (f i ) ist def<strong>in</strong>iert durch f 1 = 1, f 2 = 1 und f i+1 = f i + f i−1 für<br />
i ≥ 2. F<strong>in</strong>den Sie mit rsolve e<strong>in</strong>e explizite Formel für f i . Berechnen Sie mit Hilfe dieser<br />
Formel f 1000 .<br />
2
4 L<strong>in</strong>eare Gleichungssysteme<br />
Wir betrachten e<strong>in</strong> l<strong>in</strong>eares Gleichungssystem Ax = b, wobei A e<strong>in</strong>e m × n-Matrix und<br />
b ∈ R m ist. Zur Lösung e<strong>in</strong>es solchen Gleichungssystems steht im Paket l<strong>in</strong>alg der Befehl<br />
l<strong>in</strong>solve(A,b) zur Verfügung. Dabei sollte A vom Typ matrix und b vom Typ vector<br />
se<strong>in</strong>. Die Ausgabe ist e<strong>in</strong> e<strong>in</strong> Lösungsvektor oder nichts (NULL), falls ke<strong>in</strong>e Lösung<br />
existiert. Ist die Lösungsmenge e<strong>in</strong> aff<strong>in</strong>er Unterraum mit e<strong>in</strong>er Dimension ≥ 1, so enthält<br />
der Lösungsvektor freie Parameter t i . Beispiel:<br />
Befehl<br />
with(l<strong>in</strong>alg):<br />
A:=matrix(2,2,[1,1,1,-1]); b:=vector([3,5]);<br />
l<strong>in</strong>solve(A,b);<br />
Kommentar<br />
Laden des Pakets l<strong>in</strong>alg<br />
Initialisieren von A und b<br />
Ax=b wird gelöst<br />
Aufgabe 4.1 Lösen Sie Ax = b, wobei A = (A[i, j]) i,j=1,...,10 mit A[i, j] = j i−1 und<br />
b[i] = i 2 , i = 1, ..., 10.<br />
H<strong>in</strong>weis: Initialisieren Sie A mit A:=matrix(10,10) und weisen die Werte A[i,j] mit<br />
Hilfe e<strong>in</strong>er for-Schleife zu.<br />
Aufgabe 4.2<br />
a) Erzeugen Sie mit dem Befehl randmatrix e<strong>in</strong>e 30x30-Zufallsmatrix A und e<strong>in</strong>en Zufallsvektor<br />
b mit 30 Komponenten und lösen Sie Ax = b.<br />
b) Beachten Sie, dass die Lösung <strong>in</strong> a) <strong>in</strong> Form von Brüchen exakt ausgegeben wird.<br />
Vielleicht kann man die Rechenzeit verkürzen, wenn man vor dem Aufruf von l<strong>in</strong>solve<br />
alle E<strong>in</strong>träge von A <strong>in</strong> Kommazahlen umwandelt und <strong>Maple</strong> somit zum Rechnen mit<br />
Kommazahlen zw<strong>in</strong>gt?! Tun Sie das und vergleichen Sie die Rechenzeiten.<br />
Notwendige Befehle: f:= x->convert(x,float); map(f,A); time();<br />
(Aufruf von time(); gibt die bis zu diesem Zeitpunkt verbrauchte CPU-Zeit an)<br />
Zum Lösen e<strong>in</strong>es homogenen l<strong>in</strong>earen Gleichungssystems Ax = 0 ist der Befehl kernel(A);<br />
besser geeignet als l<strong>in</strong>solve. Die Ausgabe von kernel(A); ist e<strong>in</strong>e Basis für den<br />
Kern von A (das ist der Unterraum aller x mit Ax = 0).<br />
Aufgabe 4.3 Bestimmen Sie den Kern der Matrix<br />
⎛<br />
⎞<br />
1 2 −4 2 −1<br />
0 1 −2 1 0<br />
⎜ 3 −5 6 −5 1<br />
⎟<br />
⎝ −2 4 −3 4 −3 ⎠<br />
−5 2 0 2 1<br />
3
5 Determ<strong>in</strong>anten und Eigenwerte<br />
Zur Berechnung von Determ<strong>in</strong>aten steht im Paket l<strong>in</strong>alg der Befehl det zur Verfügung.<br />
Aufgabe 5.1 Determ<strong>in</strong>anten von 40x40-Matrizen mit ganzzahligen E<strong>in</strong>trägen s<strong>in</strong>d für<br />
<strong>Maple</strong> ke<strong>in</strong> Problem. Überprüfen Sie das an e<strong>in</strong>er Zufallsmatrix.<br />
Die Eigenwerte e<strong>in</strong>er quadratischen Matrix A kann man mit dem Befehl eigenvals(A);<br />
berechnen. Hierbei muss man auf die Typen der E<strong>in</strong>träge achten:<br />
• Ist e<strong>in</strong> E<strong>in</strong>trag von A vom Typ float, so müssen alle E<strong>in</strong>träge vom Typ float se<strong>in</strong>.<br />
In diesem Fall werden die Eigenwerte <strong>in</strong> Dezimalnäherung ausgegeben.<br />
• S<strong>in</strong>d alle E<strong>in</strong>träge von A ganze Zahlen, Brüche oder Variablen (der symbolische<br />
Fall), so werden die Eigenwerte exakt berechnet und gegebenenfalls unter Verwendung<br />
von RootOf ausgegeben. Die e<strong>in</strong>zelnen Eigenwerte erhält man dann mit Hilfe<br />
von allvalues.<br />
Aufgabe 5.2<br />
a) Berechnen Sie die Eigenwerte e<strong>in</strong>er 10x10 Zufallsmatrix mit ganzzahligen E<strong>in</strong>trägen.<br />
Lassen Sie sich mit evalf die numerischen Werte der Eigenwerte ausgeben.<br />
b) Überprüfen Sie, ob das Produkt der <strong>in</strong> a) berechneten Eigenwerte gleich der Determ<strong>in</strong>ante<br />
der Matrix ist. Dafür muss man wahrsche<strong>in</strong>lich die Rechengenauigkeit mit Digits:=t;<br />
für geeignetes t erhöhen.<br />
4
Priv. Doz. Dr. Bernhard Schmidt 13.5.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
Organisatorischer H<strong>in</strong>weis:<br />
Der <strong>Maple</strong>-Kurs f<strong>in</strong>det ab dem 27. Mai im Mac-CIP-Pool, Raum 1012/1013 statt<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 4. <strong>Arbeitsblatt</strong><br />
Erzeugen und Exportieren von Graphiken<br />
1 Der Befehl plot<br />
Der Grundbefehl zur Erzeugung e<strong>in</strong>er graphischen Darstellung e<strong>in</strong>er Funktion f(x) ist<br />
plot. Dabei kann f e<strong>in</strong> Ausdruck <strong>in</strong> x, e<strong>in</strong>e mit x->f(x) def<strong>in</strong>ierte Funktion oder auch<br />
e<strong>in</strong>e Prozedur se<strong>in</strong>. Als Optionen können der darzustellende x- bzw. y-Bereich angegeben<br />
werden. Beispiele:<br />
Befehl<br />
Kommentar<br />
plot(s<strong>in</strong>);<br />
Plot der S<strong>in</strong>usfunktion, x-y-Bereiche Standard<br />
plot(s<strong>in</strong>(x),x=0..2,y=0..1); Plot mit Vorgabe der Bereiche<br />
plot(s<strong>in</strong>(x)/x,x=0..<strong>in</strong>f<strong>in</strong>ity); Plot über “unendlichen Bereich”<br />
f:=x->s<strong>in</strong>(x)ˆ3∗xˆ4;<br />
Erzeugung e<strong>in</strong>er Funktion f<br />
plot(f, 0..1); Plotten der Funktion f(x) für x ∈ [0, 1]<br />
P:=proc(x) return xˆ3; end; Erzeugung e<strong>in</strong>er Prozedur P<br />
plot(P,0..3); Plotten von P(x) für x ∈ [0, 3]<br />
Plots kann man auch Namen geben und sie dann mit dem Befehl display e<strong>in</strong>zeln oder<br />
geme<strong>in</strong>sam anzeigen lassen:<br />
Befehl<br />
p1:=plot(s<strong>in</strong>): p2:=plot(s<strong>in</strong>(x),x=0..2,y=0..1):<br />
with(plots): display([p1,p2]);<br />
Kommentar<br />
Plots p1, p2 <strong>in</strong> e<strong>in</strong>er Graphik<br />
Aufgabe <strong>1.</strong>1<br />
a) Plotten sie tan x so, dass man die Nullstellen im Bereich [0, 10] e<strong>in</strong>igermassen genau<br />
erkennen kann. H<strong>in</strong>weis: Wählen Sie den y-Bereich geeignet.<br />
b) Plotten Sie den E<strong>in</strong>heitskreis, <strong>in</strong>dem Sie ihn mit display aus je e<strong>in</strong>em Teil für den<br />
unteren und oberen Halbkreis zusammensetzen. H<strong>in</strong>weise: Die nötigen Funktionen s<strong>in</strong>d<br />
± √ 1 − x 2 . Mit der Option scal<strong>in</strong>g=constra<strong>in</strong>ed <strong>in</strong> plot kann man die Verzerrung beseitigen.<br />
c) Erzeugen Sie e<strong>in</strong>e Prozedur P, so dass P(x) den Wert -1 liefert für x ≤ 0 und<br />
s<strong>in</strong>(x) für x > 0. Plotten Sie die Prozedur im Bereich x ∈ [−5, 5]. Notwendige Befehle:<br />
proc(x)...end; if...then...else...fi; return x; H<strong>in</strong>weis: Das Plotten funktioniert<br />
nur mit plot(P,-5..5);, nicht mit plot(P(x),x=-5..5);
2 Exportieren von Graphiken<br />
Oft ist es nützlich, <strong>Maple</strong>-Graphiken <strong>in</strong> andere Dokumente e<strong>in</strong>b<strong>in</strong>den zu können, z.B. <strong>in</strong><br />
Sem<strong>in</strong>arausarbeitungen oder Diplomarbeiten. Da mathematische Texte fast ausschließlich<br />
mit dem Textverbeitungsprogramm latex geschrieben werden, konzentrieren wir uns auf<br />
die E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> latex-Dokumente.<br />
Aufgabe 2.1 a) Plotten Sie den Betrag der Riemannschen Zetafunktion im Bereich {1/2+<br />
it : 0 ≤ t ≤ 100} mit plot(abs(Zeta(1/2+t*I)),t=0..100);.<br />
b) Rechter Mausklick auf Plot der Zetafunktion, → ExportAs → EncapsulatedPostscript,<br />
Speichern als zeta.eps.<br />
c) Downloaden Sie die Datei zeta.tex von der Homepage dieses Kurses. Die Datei zeta.tex<br />
enthält e<strong>in</strong>e kurze Beschreibung der Riemann-Hypothese im latex-Format. Sehen Sie sich<br />
an, wie dort die Datei zeta.eps e<strong>in</strong>gebunden wird. Das Ergebnis der latex-Kompilierung<br />
f<strong>in</strong>den Sie <strong>in</strong> der Datei latex.pdf.<br />
H<strong>in</strong>weis: Mit dem Programm latex sollte man sich so früh wie möglich vertraut machen.<br />
E<strong>in</strong> hervorragendes Buch dazu ist Latex, E<strong>in</strong>e <strong>E<strong>in</strong>führung</strong> von Helmut Kopka.<br />
3 Parametrische Plots<br />
Statt den E<strong>in</strong>heitskreis aus zwei Stücken zusammenzusetzen, kann man ihn e<strong>in</strong>facher als<br />
parametrischen Plot erzeugen. Die Syntax für parametrische 2D-Plots lautet<br />
plot([A(t),B(t),t=a..b]);<br />
Dabei s<strong>in</strong>d A(t) und B(t) Ausdrücke <strong>in</strong> t. Geplottet wird die Kurve [A(t), B(t)], t ∈ [a, b].<br />
Den E<strong>in</strong>heitskreis erhält man folgendermaßen:<br />
plot([cos(t),s<strong>in</strong>(t),t=0..2*Pi]);<br />
Aufgabe 3.1 Plotten Sie e<strong>in</strong>e Spirale im R 2 um den Nullpunkt mit 5 W<strong>in</strong>dungen.<br />
H<strong>in</strong>weis: Man kann zum Beispiel den E<strong>in</strong>heitkreis mehrmals durchlaufen und die Punkte<br />
mit e<strong>in</strong>em monoton wachsenden Streckungsfaktor (z.B. t) multiplizieren.<br />
4 Dreidimensionale Graphiken mit plot3d<br />
E<strong>in</strong>e Funktion f(x, y) lässt sich als Fläche im R 3 darstellen. Der entsprechende Plot wird<br />
mit<br />
plot3d(f(x,y), x=a..b,y=c..d);<br />
erzeugt, wobei a,b,c,d zu spezifizierende Bereichsgrenzen s<strong>in</strong>d. Beispiel:<br />
plot3d(s<strong>in</strong>(x*y), x=0..4,y=0..4);<br />
Durch klicken mit der l<strong>in</strong>ken Maustaste auf das Bild kann man die Zeichnung nach belieben<br />
rotieren. Verfe<strong>in</strong>ern oder vergröbern kann man die Darstellung mit Hilfe der Option<br />
grid=[m,n], die den x- bzw. y-Bereich <strong>in</strong> m bzw. n Teile rastert. Beispiel:<br />
plot3d(s<strong>in</strong>(x*y), x=0..4,y=0..4, grid=[50,50]);<br />
Auch parametrische 3D-Plots s<strong>in</strong>d möglich. Beispiel:<br />
plot3d([s<strong>in</strong>(s), cos(s)*s<strong>in</strong>(t),s<strong>in</strong>(t)], s=-Pi..Pi, t=-Pi..Pi);
Aufgabe 4.1 Erzeugen Sie e<strong>in</strong>en parametrischen Plot der E<strong>in</strong>heitskugel im R 3 . H<strong>in</strong>weis:<br />
Ist R = (x, y, z) e<strong>in</strong> Punkt auf der E<strong>in</strong>heitskugel, so gilt x = s<strong>in</strong> t cos s, y = s<strong>in</strong> t s<strong>in</strong> s und<br />
z = cos t. Dabei ist s der W<strong>in</strong>kel zwischen der x-Achse und der Projektion von R auf die<br />
x-y-Ebene und t ist der W<strong>in</strong>kel zwischen z-Achse und R.<br />
5 Darstellung der Mandelbrotmenge<br />
Mit <strong>Maple</strong> kann man fraktale Mengen ansprechend graphisch darstellen. E<strong>in</strong>e fraktale<br />
Menge M hat die Eigenschaft, dass unendlich viele beliebig kle<strong>in</strong>e Teile von M der Gesamtmenge<br />
ähnlich sehen (Selbstähnlichkeit). E<strong>in</strong>e der bekanntesten fraktalen Mengen ist<br />
die Mandelbrotmenge <strong>in</strong> der komplexen Zahlenebene.<br />
Def<strong>in</strong>ition der Mandelbrotmenge<br />
Zu jedem c ∈ C wird e<strong>in</strong>e Folge (a n (c)) def<strong>in</strong>iert durch a 1 (c) = c und a n+1 (c) = a n (c) 2 + c<br />
für n ≥ <strong>1.</strong> Die Mandelbrotmenge ist def<strong>in</strong>iert als<br />
M := {c ∈ C : |a n (c)| ≤ 2 ∀ n ∈ N}.<br />
Um mit <strong>Maple</strong> zu prüfen, ob c ∈ M ist, kann man natürlich nicht die unendlich vielen<br />
Bed<strong>in</strong>gungen |a n (c)| ≤ 2 testen. Statt dessen testet man diese Bed<strong>in</strong>gung z.B. nur für alle<br />
n ≤ 20. Bei positiven Ausgang wird c <strong>in</strong> die Menge aufgenommen, ansonsten nicht. Das<br />
liefert e<strong>in</strong>e sehr gute Approximation der Mandelbrotmenge.<br />
Aufgabe 5.1<br />
a) Schreiben Sie e<strong>in</strong>e Prozedur P:=proc(x,y), so dass P(x,y) den Wert 1 liefert, falls<br />
|a n (x + I ∗ y)| ≤ 2 für alle n ≤ 20. Ansonsten soll die Prozedur 0 liefern.<br />
b) Plotten Sie die Mandelbrotmenge mit dem Befehl<br />
plot3d(P, -2..2, -2.. 2, grid=[50, 50]);<br />
Dabei ist P die Prozedur aus Teil a. Sehen Sie sich durch Änderung der grid-Werte<br />
verschiedene Verfe<strong>in</strong>erungsstufen an.<br />
c) Sehen Sie sich immer kle<strong>in</strong>ere Bereiche der Mandelbrotmenge an und versuchen Sie, ihre<br />
Selbstähnlichkeit zu bestätigen. E<strong>in</strong> <strong>in</strong>teressanter Bereich ist zum Beispiel -0.06..-0.03,<br />
-<strong>1.</strong>. -0.98.
6 Graphische Animationen<br />
Zur Animation von Graphiken stehen im Paket plots die Befehle animate und animate3d<br />
zur Verfügung. Syntax:<br />
animate(F(x,t),x=a..b,t=c..d,frames=n);<br />
Dabei ist F(x,t) die darzustellende Funktion oder e<strong>in</strong>e Menge solcher Funktionen. x=a..b<br />
gibt den x-Bereich an. Der für die Animation zuständige Parameter ist t (kann man sich<br />
als Zeitparameter vorstellen). <strong>Maple</strong> erzeugt für n Werte von t im angegeben Bereich je<br />
e<strong>in</strong> Bild. Die Ausgabe ist e<strong>in</strong>e Folge von n Bildern, die man sich wie e<strong>in</strong>en Film ansehen<br />
kann. Beispiel:<br />
animate(exp(-t∗x)∗s<strong>in</strong>(x),x=0..5,t=0..5);<br />
Um die Animation zu starten, klickt man erst auf die Graphik und dann auf den Rechtspfeil<br />
<strong>in</strong> der neu ersche<strong>in</strong>enden zweiten Werkzeugleiste oben. Analog funktioniert animate3d:<br />
animate3d(F(x,y,t), x=a..b, y=c..d,t=e..f);<br />
Hier ist F die darzustellende Funktion oder e<strong>in</strong>e Menge solcher Funktionen. F kann<br />
reellwertig se<strong>in</strong>, kann aber auch Werte im R 3 annehmen. Will man Verzerrungen aufgrund<br />
automatischer Skalierungen der Achsen vermeiden, muss man als Option scal<strong>in</strong>g=constra<strong>in</strong>ed<br />
e<strong>in</strong>geben. Beispiel e<strong>in</strong>er Kugel vom Radius 1, die sich um 10 E<strong>in</strong>heiten<br />
entlang der x-Achse bewegt:<br />
Kugel:=[s<strong>in</strong>(t)∗cos(s)+u, s<strong>in</strong>(t)∗s<strong>in</strong>(s),cos(t)]:<br />
animate3d(Kugel,s=0..2∗Pi,t=0..Pi,u=0..10,scal<strong>in</strong>g=constra<strong>in</strong>ed);<br />
Aufgabe 6.1 Erzeugen Sie e<strong>in</strong>e Animation zweier Kugeln vom Radius 1 im R 3 , von denen<br />
die erste im Ursprung ruht und die zweite sie im Abstand von 5 E<strong>in</strong>heiten <strong>in</strong> der x-<br />
y-Ebene umkreist. H<strong>in</strong>weise: Die ruhende Kugel kann man aus obigem Beispiel ablesen<br />
(+u weglassen!). Die andere Kugel br<strong>in</strong>gt man zum rotieren, <strong>in</strong>dem man 5∗cos(u) zur x-<br />
Koord<strong>in</strong>ate und 5∗s<strong>in</strong>(u) zur y-Koord<strong>in</strong>ate addiert. Vergessen Sie nicht, das Paket plots<br />
mit with(plots): zu laden.
Priv. Doz. Dr. Bernhard Schmidt 27.5.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 5. <strong>Arbeitsblatt</strong><br />
Analysis mit <strong>Maple</strong><br />
1 Grenzwerte von Funktionen<br />
Für Berechnungen von Grenzwerten von Funktionen steht der Befehl limit zur Verfügung.<br />
Syntax:<br />
limit(f,x=a);<br />
Dabei ist f e<strong>in</strong> analytischer Ausdruck <strong>in</strong> der Variablen x. Es wird lim x→a f(x) berechnet.<br />
Ist f e<strong>in</strong>e Funktion, so muss man f(x) statt f e<strong>in</strong>geben. Die Berechnung von l<strong>in</strong>ksseitigen/rechtsseitigen<br />
Grenzwerten erreicht man mit Hilfe der Optionen left/right. Beispiele:<br />
Befehl<br />
limit(xˆx,x=0);<br />
limit(abs(x)/x,x=0);<br />
limit(abs(x)/x,x=0,right);<br />
limit((2*xˆ3+4*xˆ2)/(7*xˆ3+12),x=<strong>in</strong>f<strong>in</strong>ity);<br />
f:=x->s<strong>in</strong>(x)/x;<br />
limit(f,x=0);<br />
limit(f(x),x=0);<br />
Aufgabe <strong>1.</strong>1 Folgende Grenzwerte sollen bestimmt werden:<br />
lim<br />
x→0<br />
Kommentar<br />
Berechung von lim x→0 x x<br />
Ausgabe undef<strong>in</strong>ed, da<br />
lim x→0 |x|/x nicht existiert<br />
Rechtsseitiger Grenzwert<br />
Berechung von lim x→∞<br />
Def<strong>in</strong>ition e<strong>in</strong>er Funktion<br />
funktioniert nicht, f wird als<br />
Konstante <strong>in</strong>terpretiert<br />
funktioniert<br />
|x|(e x − 1) s<strong>in</strong> 2 x<br />
(1 − cos x) 3/2 tan x , lim tan −3 (x − π/2)<br />
x→0+ |x|(e s<strong>in</strong>2 x − 1) , lim |x| cot −3 (1/x)<br />
x→∞ e s<strong>in</strong>2 1/x − 1<br />
2 Reihen und unendliche Produkte<br />
Vorbemerkung zu sum und product<br />
Bei der Verwendung des Befehls sum zur Summenbildung gibt es oft ärgerliche Fehler,<br />
wenn die Summationsvariable vorher schon e<strong>in</strong>en Wert hatte. Beispiel:<br />
n:=1; sum(n,n=<strong>1.</strong>.10); ⇒ Fehler!<br />
Diesen Fehlern geht man e<strong>in</strong> für alle mal aus dem Weg, <strong>in</strong>dem man die Summationvariable<br />
und den zu summierenden Ausdruck <strong>in</strong> e<strong>in</strong>fache Anführungszeichen setzt:<br />
n:=1; sum(’n’,’n’=<strong>1.</strong>.10); ⇒ OK!<br />
Gleiches gilt für den Befehl product.<br />
Berechnung von Reihen und Produkten<br />
Zur Berechung e<strong>in</strong>er Reihe ∑ ∞<br />
n=1<br />
f(n) kann man folgendermaßen vorgehen: Man def<strong>in</strong>iert<br />
sich mit p:=sum(’f(n)’,’n’=<strong>1.</strong>.k); e<strong>in</strong>en Ausdruck, der die Partialsummen beschreibt
und rechnet dann mit limit(p,k=<strong>in</strong>f<strong>in</strong>ity); den Grenzwert der Partialsummen, d.h. den<br />
Wert der Reihe aus. Beispiel:<br />
p:=sum(’1/nˆ2’,’n’=<strong>1.</strong>.k); limit(p,k=<strong>in</strong>f<strong>in</strong>ity);<br />
In diesem Beispiel liefert <strong>Maple</strong> den exakten Wert π 2 /6. Analog kann man unendliche<br />
Produkte berechnen. Ist man nur an Dezimalnäherungen <strong>in</strong>teressiert, so kann man die<br />
Befehle sum(’f(n)’,’n’=<strong>1.</strong>.<strong>in</strong>f<strong>in</strong>ity); bzw. product(’f(n)’,’n’=<strong>1.</strong>.<strong>in</strong>f<strong>in</strong>ity); verwenden<br />
und die Auswertung mit evalf erzw<strong>in</strong>gen. Beispiel:<br />
p:=product(’(1+1/nˆ2)’,’n’=<strong>1.</strong>.<strong>in</strong>f<strong>in</strong>ity); evalf(p);<br />
Häufig kann <strong>Maple</strong> jedoch ke<strong>in</strong>e vernünftige Dezimalnäherung berechnen und es wird ke<strong>in</strong><br />
Wert ausgegeben. Dann kann man Werte von Partialsummen bzw. Partialprodukten für<br />
möglichst große k als Näherungen nehmen.<br />
Aufgabe 2.1 Berechnen Sie Dezimalnäherungen für folgende Reihen und Produkte. F<strong>in</strong>den<br />
Sie auch die exakten Werte, falls möglich.<br />
∞∑<br />
n=1<br />
1 + √ n<br />
n 2 ,<br />
∞∑<br />
n=1<br />
s<strong>in</strong> 2 n<br />
n 2 ,<br />
∞∏<br />
(1 − 1<br />
4n 2 ),<br />
n=1<br />
∞ ∏<br />
n=1<br />
(1 − 9<br />
4n 2 )<br />
<strong>Maple</strong> kann auch Reihen berechnen, die von Parametern abhängen:<br />
Aufgabe 2.2 Berechnen Sie S = ∑ ∞ 2z<br />
n=1<br />
. Überprüfen Sie durch Plots, dass für z ∉ Z<br />
z 2 −n 2<br />
1<br />
+ S − π cot πz = 0<br />
z<br />
gilt (das ist die sogenannte Partialbruchentwicklung des Kotangens).<br />
3 Differenzieren von Funktionen e<strong>in</strong>er Variablen<br />
E<strong>in</strong> Ausdruck f <strong>in</strong> x wird mit diff(f,x); differenziert. Um e<strong>in</strong>e Funktion g zu differenzieren,<br />
muss man diff(g(x),x); e<strong>in</strong>geben. Man kann auch differenzieren, ohne die Funktionen zu<br />
spezifizieren. Gibt man zum Beispiel diff(f(x)/g(x),x); e<strong>in</strong>, ohne dass f und g vorher<br />
def<strong>in</strong>iert wurden, erhält man als Ausgabe die Quotientenregel. Die n-te Ableitung von<br />
f erhält man durch diff(f(x),x$n);. Will man die Ableitung als Funktion und nicht als<br />
Ausdruck erhalten, kann man den Ableitungsoperator D benutzen.<br />
Für e<strong>in</strong>e Funktion f: x->f(x) liefert D(f) die Funktion x->f’(x). Mit (D@@n)(f); berechnet<br />
man die n-te Ableitung von f als Funktion. Beispiele:<br />
Befehl<br />
f:=xˆ5; diff(f,x);<br />
f:=x->xˆ2; diff(f(x),x);<br />
diff(f,x$3);<br />
diff((h@g(x)),x);<br />
f:=x->s<strong>in</strong>(x); D(f); (D@@3)(f);<br />
Kommentar<br />
Differenzieren e<strong>in</strong>es Ausdrucks<br />
Differenzieren e<strong>in</strong>er Funktion<br />
3. Ableitung<br />
Kettenregel wird ausgeben (@ ist der<br />
Operator für die Verkettung)<br />
<strong>1.</strong> und 3. Ableitung werden als Funktionen<br />
ausgegeben
Aufgabe 3.1 Sei f = s<strong>in</strong> x 3 . Mit f (i) bezeichnen wir die i-te Ableitung von f. Berechnen<br />
sie<br />
10∑ f (j) (0)x j<br />
g := f(0) +<br />
j!<br />
j=1<br />
(Taylorentwicklung 10. Ordnung um 0). Plotten Sie f und g im Intervall [0, 3/2] <strong>in</strong> e<strong>in</strong>er<br />
geme<strong>in</strong>samen Graphik.<br />
H<strong>in</strong>weise: Man def<strong>in</strong>iert am besten f als Funktion f:=x->s<strong>in</strong>(xˆ3);. Auch g sollte man als<br />
Funktion def<strong>in</strong>ieren. Den Wert f (j) (0) erhält man mit (D@@j)(f)(0). Den geme<strong>in</strong>samen<br />
Plot erhält man z.B. mit plot({f,g},0..3/2);<br />
4 Differenzieren von Funktionen mehrerer Variablen<br />
Beim Differenzieren von Funktionen mehrerer Variablen muss man mit Vektoren und Matrizen<br />
arbeiten und daher vorher das Paket l<strong>in</strong>alg laden. Wichtige Befehle s<strong>in</strong>d grad,<br />
jacobian, hessian. Beispiele:<br />
Befehl<br />
with(l<strong>in</strong>alg):<br />
f:=xˆ2*s<strong>in</strong>(x*y)+x*exp(y+z);<br />
g:=grad(f,[x,y,z]);<br />
Kommentar<br />
Laden des Pakets l<strong>in</strong>alg<br />
Def<strong>in</strong>ition e<strong>in</strong>es Ausdrucks<br />
Gradient wird berechnet; die Variablen, nach denen<br />
differenziert wird, werden als Liste e<strong>in</strong>gegeben<br />
Differenziert nur nach x und y<br />
Berechnung der Hesse-Matrix<br />
h:=grad(f,[x,y]);<br />
hessian(f,[x,y,z]);<br />
v:=vector([xˆ2*yˆ2,s<strong>in</strong>(x+y)]); Def<strong>in</strong>ition e<strong>in</strong>er Funktion v : R 2 → R 2<br />
jacobian(v,[x,y]);<br />
Berechnung der Jacobi-Matrix<br />
Mit Hilfe von Gradienten und Hesse-Matrizen kann man nach lokalen Extrema von Funktionen<br />
suchen. Mit ∇f(x) bzw. H f (x) bezeichnet man den Gradienten bzw. die Hesse-<br />
Matrix von f am Punkt x. In der Analysis oder Optimierung beweist man folgenden Satz:<br />
Satz Sei f : R n → R zweimal differenzierbar.<br />
a) Ist x e<strong>in</strong> lokales Extremum von f, so gilt ∇f(x) = 0.<br />
b) Ist ∇f(x) = 0 und hat H f (x) nur positive (nur negative) Eigenwerte, so ist x e<strong>in</strong> lokales<br />
M<strong>in</strong>imum (Maximum) von f.<br />
Anwendungsbeispiel:<br />
Befehl<br />
Kommentar<br />
f:=xˆ4+xˆ2+yˆ2+6*y;<br />
Def<strong>in</strong>ition e<strong>in</strong>es Ausdrucks<br />
g:=grad(f,[x,y]);<br />
Gradientenberechnung<br />
s:=solve({g[1]=0,g[2]=0}); Lösungen von ∇f = 0<br />
allvalues(s[2]);<br />
Auflösen von RootOf<br />
t:=subs(s[1],[x,y]);<br />
Zugreifen auf die (e<strong>in</strong>zige reelle) Lösung<br />
H:=hessian(f,[x,y]);<br />
Berechnung der Hesse-Matrix von f<br />
Ht:=map(a->subs(x=t[1],y=t[2],a),H); E<strong>in</strong>setzen des Lösungspunkts <strong>in</strong> Hesse-Matrix<br />
eigenvals(Ht);<br />
Alle Eigenwerte >0, lokales M<strong>in</strong>imum
Aufgabe 4.1 Suchen Sie nach lokalen Extrema folgender Funktionen. H<strong>in</strong>weise: Bleiben<br />
unausgewertete Ausdrücke zwischendurch stehen, so wendet man evalf an.<br />
5 Integration<br />
f = x 2 + 2 xz + 2 x + y 2 − 2 yz − 2 y + 2 z 2 + 2 z + e (x+y−z)2<br />
h = −2 x 2 − 2 y 2 − 4 yz − 8 y − 3 z 2 − 2 z<br />
Bestimmte und unbestimmte Integrale berechnet man mit dem Befehl <strong>in</strong>t. Auch uneigentliche<br />
Integrale kann man so auswerten. Zur Berechnung mehrdimensionaler Integrale<br />
iteriert man den Befehl <strong>in</strong>t. Beispiele:<br />
Befehl<br />
<strong>in</strong>t(xˆ5,x=0..1);<br />
<strong>in</strong>t(s<strong>in</strong>(x)ˆ2*exp(x),x);<br />
<strong>in</strong>t(1/xˆ2,x=<strong>1.</strong>.<strong>in</strong>f<strong>in</strong>ity);<br />
<strong>in</strong>t(<strong>in</strong>t(<strong>in</strong>t(x+y+z,x=0..1),y=0..1),z=0..1);<br />
Kommentar<br />
Bestimmtes Integral<br />
Unbestimmtes Integral<br />
Uneigentliches Integral<br />
Iteriertes Integral<br />
Aufgabe 5.1 Die Fläche von S ⊂ R 2 ist ∫ S<br />
1 dxdy. Berechnen Sie die Fläche der Ellipse<br />
E := {(x, y) : 3x 2 + y 2 ≤ 1}.<br />
H<strong>in</strong>weise: Wählen Sie im äußeren Integral den y-Bereich y=-<strong>1.</strong>.<strong>1.</strong> Der x-Bereich muss<br />
dann gemäß der Bed<strong>in</strong>gung 3x 2 + y 2 ≤ 1 gewählt werden (Bed<strong>in</strong>gung nach x auflösen,<br />
ergibt Bereich<br />
[− √ (1 − y 2 )/3, √ (1 − y 2 )/3]). Die Ellipse kann man übrigens am e<strong>in</strong>fachsten plotten mit<br />
implicitplot(3*xˆ2+yˆ2=1,x=-<strong>1.</strong>.1,y=-<strong>1.</strong>.1,scal<strong>in</strong>g=constra<strong>in</strong>ed);<br />
6 Koord<strong>in</strong>atentransformationen, Jacobideterm<strong>in</strong>anten<br />
Zur Vere<strong>in</strong>fachung von Integralen s<strong>in</strong>d Koord<strong>in</strong>atentransformationen oft unerläßlich. Betrachten<br />
wir als Beispiel e<strong>in</strong> Integral über die E<strong>in</strong>heitskugel K im R 3 :<br />
∫<br />
V := f(x, y, z)dxdydz<br />
K<br />
Um V zu berechnen, muss das Integral <strong>in</strong> e<strong>in</strong> iteriertes Integral umgewandelt werden. Das<br />
macht aber wegen der komplizierten Integrationsgrenzen bei e<strong>in</strong>er Kugel im x-y-z-System<br />
Mühe. Daher substituiert man die Kugelkoord<strong>in</strong>aten x(r, s, t) = r s<strong>in</strong> t cos s, y(r, s, t) =<br />
r s<strong>in</strong> t s<strong>in</strong> s, z(r, s, t) = r cos t und berechnet das Integral gemäß der Formel<br />
∫<br />
∫ π ∫ 2π ∫ 1<br />
f(x, y, z)dxdydz =<br />
f(x(r, s, t), y(r, s, t), z(r, s, t))|J(r, s, t)|drdsdt (1)<br />
K<br />
0<br />
0<br />
0<br />
Dabei ist |J(r, s, t)| der Betrag der Jacobideterm<strong>in</strong>ante der Transformation<br />
(r, s, t) ↦→ (x(r, s, t), y(r, s, t), z(r, s, t)).<br />
Diese Determ<strong>in</strong>ante lässt sich mit dem Befehl jacobian berechnen:<br />
Befehl<br />
xyz:=vector([r*s<strong>in</strong>(t)*cos(s),r*s<strong>in</strong>(t)*s<strong>in</strong>(s),r*cos(t)]);<br />
J:=det(jacobian(xyz,[r,s,t]));<br />
J1:=simplify(abs(J));<br />
Kommentar<br />
Transformation<br />
Jacobideterm<strong>in</strong>ante<br />
Ergebnis: s<strong>in</strong>(t)rˆ2
Das Volumen der E<strong>in</strong>heitskugel ist also nach der Formal (1) zum Beispiel<br />
∫<br />
K<br />
1 dxdydz =<br />
∫ π ∫ 2π ∫ 1<br />
0<br />
0<br />
0<br />
s<strong>in</strong>(t)r 2 drdsdt = 4π 3 .<br />
Aufgabe 6.1 Zyl<strong>in</strong>derkoord<strong>in</strong>aten im R 3 s<strong>in</strong>d gegeben durch x = r cos s, y = r s<strong>in</strong> s,<br />
z = z. Berechnen Sie die Jacobideterm<strong>in</strong>ante dieser Transformation.<br />
Aufgabe 6.2 Das Trägheitsmoment von S ⊂ R 3 bzgl. der z-Achse ist<br />
∫<br />
(x 2 + y 2 )ρ(x, y, z)dxdydz,<br />
S<br />
wobei ρ(x, y, z) die Dichte des Körpers S <strong>in</strong> (x, y, z) ist. Berechnen Sie mit Hilfe von (1)<br />
das Trägheitsmoment der E<strong>in</strong>heitskugel mit Dichte <strong>1.</strong>
Priv. Doz. Dr. Bernhard Schmidt 3.6.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 6. <strong>Arbeitsblatt</strong><br />
1 Schreiben <strong>in</strong> Dateien<br />
Input und Output<br />
Nach umfangreichen Rechnungen hat man unter Umständen e<strong>in</strong> ellenlanges <strong>Maple</strong>-<strong>Arbeitsblatt</strong><br />
mit größtenteils irrelevanten Informationen vor sich. Dann kann man sich helfen,<br />
<strong>in</strong>dem man die <strong>in</strong>teressanten Daten extrahiert und <strong>in</strong> e<strong>in</strong>e Datei schreibt.<br />
Wichtig: E<strong>in</strong> Pfadname für e<strong>in</strong>e Datei sieht <strong>in</strong> <strong>Maple</strong> zum Beipiel folgendermaßen aus:<br />
”C:\\test.txt”. Der Pfadname ist also <strong>in</strong> Anführungszeichen zu setzen.<br />
Die wichtigsten Befehle für das Schreiben <strong>in</strong> Dateien s<strong>in</strong>d open, writel<strong>in</strong>e, writedata,<br />
close. Der Befehl writedata ist besonders für numerische Werte geeignet, da man damit<br />
durch e<strong>in</strong>en e<strong>in</strong>zigen Befehl e<strong>in</strong>e ganze Matrix mit Integer- oder Float-E<strong>in</strong>trägen <strong>in</strong> e<strong>in</strong>e<br />
Datei schreiben kann.<br />
Achtung: Existiert e<strong>in</strong>e Datei schon, wird sie durch diese Befehle überschrieben.<br />
Befehl<br />
open(”test.txt”,WRITE);<br />
writel<strong>in</strong>e(”test.txt”,”1028340”);<br />
writel<strong>in</strong>e(”test.txt”,<br />
convert(ithprime(30),str<strong>in</strong>g));<br />
close(”test.txt”);<br />
writedata(”test.txt”,<br />
[[1,2,3],[1,3,5]]);<br />
with(l<strong>in</strong>alg):<br />
A:=matrix([[1,2,3],[1,3,5]]);<br />
writedata(”test.txt”,A);<br />
Kommentar<br />
Datei test.txt wird zum Schreiben geöffnet,<br />
und zwar <strong>in</strong> dem Verzeichnis, von<br />
dem aus <strong>Maple</strong> gestartet wurde. Will man<br />
test.txt <strong>in</strong> e<strong>in</strong>em anderen Verzeichnis<br />
speichern, so muss man den Pfadnamen<br />
angeben, z.B.<br />
open(”C:\\test.txt”,WRITE);<br />
Schreiben von Str<strong>in</strong>gs <strong>in</strong> die Datei<br />
test.txt. Da writel<strong>in</strong>e nur Str<strong>in</strong>gs schreiben<br />
kann, müssen Zahlen vor dem Schreiben<br />
<strong>in</strong> Str<strong>in</strong>gs umgewandelt werden.<br />
Schließen der Datei test.txt. Ohne das<br />
Schließen kann es zu Fehlern kommen.<br />
Liste von Listen wird <strong>in</strong> test.txt geschrieben.<br />
Dabei werden nur die E<strong>in</strong>träge geschrieben,<br />
nicht die Kommas und Klammern.<br />
Dies kann man durch Öffnen von<br />
test.txt <strong>in</strong> e<strong>in</strong>em Texteditor überprüfen.<br />
Def<strong>in</strong>ition e<strong>in</strong>er Matrix<br />
Matrix wird <strong>in</strong> test.txt geschrieben
Aufgabe <strong>1.</strong>1 a) Schreiben Sie mit writel<strong>in</strong>e die ersten 100 Primzahlen zeilenweise <strong>in</strong><br />
e<strong>in</strong>e Datei primzahlen.txt. Öffnen Sie die Datei zur Kontrolle <strong>in</strong> e<strong>in</strong>em Texteditor. Notwendige<br />
Befehle: for-Schleife, ithprime, open, close, convert(..,str<strong>in</strong>g)<br />
b) Erzeugen Sie e<strong>in</strong>e 30x30-Zufallsmatrix und schreiben Sie ihre E<strong>in</strong>träge mit writedata<br />
e<strong>in</strong>e Datei matrix.txt. Überprüfen Sie das Ergebnis mit e<strong>in</strong>em Texteditor. Notwendige<br />
Befehle: with(l<strong>in</strong>alg); randmatrix.<br />
2 Lesen aus Dateien<br />
Will man e<strong>in</strong>en größeren Datensatz mit <strong>Maple</strong> bearbeiten, muss man die Daten aus Dateien<br />
lesen können. Dafür stehen vor allem die Befehle fscanf und readdata zur Verfügung.<br />
Der Befehl fscanf ist fast identisch mit dem gleichnamigen Befehl <strong>in</strong> der Programmiersprache<br />
C und auf beliebige Datenypen anwendbar. Der Befehl readdata ist anwendbar<br />
auf Textdateien, die Kommazahlen oder ganze Zahlen als E<strong>in</strong>träge haben.<br />
Rückgabe von readdata:<br />
readdata(”Datei”,n); liefert e<strong>in</strong>e Liste von Listen, wobei die j-te Liste jeweils die ersten<br />
n E<strong>in</strong>träge der j-ten Zeile der Datei enthält. Will man alle Zeilen vollständig e<strong>in</strong>lesen, so<br />
muss man also n groß genug wählen.<br />
Befehl<br />
Kommentar<br />
writedata(”test.txt”,[1,2,3]); Erzeugt Datei test.txt mit E<strong>in</strong>trägen 1 2<br />
3.<br />
a:=fscanf(”test.txt”, ”%d%d%d”); Lesen der drei E<strong>in</strong>träge von test.txt<br />
als Integers (%d). Zum Lesen von<br />
Str<strong>in</strong>gs/Floats schreibt man %s bzw. %f<br />
statt %d. Die Rückgabe ist e<strong>in</strong>e Liste der<br />
zwei gelesenen Werte.<br />
readdata(”matrix.txt”,10);<br />
Zeilen der Datei matrix.txt (aus Aufgabe<br />
<strong>1.</strong><strong>1.</strong>b) werden bis zum 10. E<strong>in</strong>trag als<br />
Kommazahlen (Standard) e<strong>in</strong>gelesen<br />
A:=readdata(”matrix.txt”,<strong>in</strong>teger,30); Gesamtmatrix wird ganzzahlig e<strong>in</strong>gelesen<br />
with(l<strong>in</strong>alg): B:=matrix(A);<br />
Stellt die Ausgangsmatrix wieder her<br />
Aufgabe 2.1 a) Lesen Sie mit Hilfe von fscanf die 100 Primzahlen aus der Datei primzahlen.txt<br />
aus Aufgabe <strong>1.</strong>1 <strong>in</strong> e<strong>in</strong>em Vektor p e<strong>in</strong>. Verwenden Sie dazu e<strong>in</strong>e for-Schleife<br />
und beachten Sie, dass die Rückgabe von fscanf e<strong>in</strong>e Liste der gelesen Werte ist (Werte<br />
extrahieren mit op oder eckigen Klammern). Überprüfen Sie das Resultat mit evalm(p);.<br />
b) Downloaden Sie von der Homepage dieses Kurses die Datei floats.txt und lesen Sie<br />
die dar<strong>in</strong> enthalten 100 float-Werte mit fscanf <strong>in</strong> e<strong>in</strong>en Vektor f e<strong>in</strong>.<br />
Aufgabe 2.2 a) Downloaden Sie von der Homepage dieses Kurses die Dateien matrixA.txt<br />
und vektorb.txt.<br />
b) Lesen Sie die beiden Dateien mit readdata ganzzahlig <strong>in</strong> <strong>Maple</strong> e<strong>in</strong>. H<strong>in</strong>weis: matrixA<br />
hat 10 Zeilen und 30 Spalten, vektorb hat 10 Zeilen und e<strong>in</strong>e Spalte.<br />
c) Machen Sie aus matrixA e<strong>in</strong>e Matrix A und aus vektorb e<strong>in</strong>en Vektor b.
3 Ausflug <strong>in</strong> die l<strong>in</strong>eare Optimierung<br />
Gerade haben wir e<strong>in</strong>e Matrix A und e<strong>in</strong>en Vektor b <strong>in</strong> <strong>Maple</strong> e<strong>in</strong>gelesen. Jetzt soll das<br />
l<strong>in</strong>eare Optimierungsproblem<br />
(LP )<br />
max −<br />
30∑<br />
i=1<br />
x i unter Ax = b, x ≥ 0<br />
mit <strong>Maple</strong> gelöst werden. In dem Paket simplex steht dafür der Befehl maximize zur<br />
Verfügung. Syntax:<br />
maximize(f,M,Option);<br />
Dabei ist f e<strong>in</strong>e l<strong>in</strong>eare Zielfunktion, hat also die Form f = ∑ n<br />
i=1 c ix i , wobei c i ∈ R<br />
Konstanten s<strong>in</strong>d. M ist e<strong>in</strong>e Menge von l<strong>in</strong>earen Ungleichungen und Gleichungen, die die<br />
Restriktionen darstellen. Für e<strong>in</strong> Problem mit Nichtnegativitätsbed<strong>in</strong>gung x ≥ 0 wählt<br />
man die Option NONNEGATIVE. Existiert ke<strong>in</strong>e Optimallösung, so gibt <strong>Maple</strong> nichts<br />
oder die leere Menge zurück. Beispiel für die Lösung e<strong>in</strong>es Problems max f unter Ax =<br />
b, x ≥ 0:<br />
Befehl<br />
with(simplex):<br />
f:=-3*x[1]-x[2];<br />
M:={x[1]-x[2] < = 5, x[1]+x[2]=2};<br />
L:=maximize(f,M,NONNEGATIVE);<br />
Kommentar<br />
Laden des Pakets simplex<br />
Def<strong>in</strong>ition der Zielfunktion<br />
Def<strong>in</strong>ition der Restriktionen<br />
Lösung des Problems<br />
Aufgabe 3.1 Lösen Sie das Problem<br />
(LP )<br />
max −<br />
30∑<br />
i=1<br />
x i unter Ax = b, x ≥ 0<br />
für die Matrix A und den Vektor b, die Sie <strong>in</strong> Aufgabe 2.2 e<strong>in</strong>gelesen haben. Schreiben<br />
Sie den Lösungsvektor mit writedata <strong>in</strong> e<strong>in</strong>e Datei loesung.txt. Diese Datei soll außer<br />
den E<strong>in</strong>trägen des Lösungsvektors nichts weiter enthalten.<br />
H<strong>in</strong>weise: Ist L die durch maximize gelieferte Lösung, so greift man auf die Komponenten<br />
der Lösung zum Beispiel mit subs(L,[seq(x[t],t=<strong>1.</strong>.30)]); zu. Um die Menge der<br />
Gleichungen Ax = b zu erzeugen, können Sie folgende Prozedur verwenden.<br />
P:=proc(A,b)<br />
M:={};<br />
m:=nops(convert(b,list));<br />
n:=nops(convert(row(A,1),list));<br />
for i from 1 to m do M:=M union {sum(’A[i,r]*x[r]’,’r’=<strong>1.</strong>.n)=b[i]}; od;<br />
M;<br />
end;
4 Speichern und Lesen von Variablen und Prozeduren<br />
Ist X e<strong>in</strong>e e<strong>in</strong>e Folge von Variablen (<strong>in</strong>sbesondere Prozeduren), so kann man X mit save<br />
X,”Datei”; <strong>in</strong> e<strong>in</strong>er Datei speichern. So kann man sich mit der Zeit e<strong>in</strong>e eigene “Bibliothek”<br />
von nützlichen Prozeduren anlegen, die man schnell <strong>in</strong> jedes <strong>Maple</strong>-Worksheet laden<br />
kann.<br />
Erhält der Date<strong>in</strong>ame die Endung .m, so wird X im <strong>in</strong>ternen <strong>Maple</strong>-Format gespeichert<br />
(ermöglicht schnelleres Laden als im Textformat). Das Laden und automatische Aufrufen<br />
(!) von X erfolgt mit read ”Datei”;. Achtung: save und read werden ohne runde<br />
Klammern verwendet. Beispiele:<br />
Befehl<br />
P:=proc(a,b) a*b; end;<br />
save P,”prozedur.m”;<br />
restart;<br />
read ”prozedur.m”;<br />
Kommentar<br />
Def<strong>in</strong>ition e<strong>in</strong>er Prozedur<br />
Speichern im <strong>in</strong>ternen <strong>Maple</strong>-Format<br />
Löschen aller Variablenwerte (also auch der Prozedur<br />
P).<br />
Prozedur wird e<strong>in</strong>gelesen und ist wieder unter<br />
dem Namen P verfügbar.<br />
Aufgabe 4.1 Speichern Sie die Prozedur aus Aufgabe 3.1 im <strong>in</strong>ternen <strong>Maple</strong>-Format (mit<br />
Dateiendung .m). Führen Sie restart; aus, laden Sie die Prozedur wieder mit read und<br />
überprüfen Sie, ob sie danach wieder verfügbar ist.<br />
Oft es bequemer, Prozeduren außerhalb von <strong>Maple</strong> <strong>in</strong> e<strong>in</strong>em Texteditor zu schreiben (nicht<br />
zuletzt wegen gelegentlichen Abstürzens von <strong>Maple</strong> ...) und dann mit read <strong>in</strong> <strong>Maple</strong> zu<br />
laden.<br />
Aufgabe 4.2 Schreiben Sie <strong>in</strong> e<strong>in</strong>em Texteditor e<strong>in</strong>e <strong>Maple</strong>-Prozedur P:=proc(n), die<br />
die Menge der ersten n Primzahlen zurückliefert. Speichern Sie die Datei als primset.txt.<br />
Laden Sie die Prozedur mit read <strong>in</strong> <strong>Maple</strong> und testen Sie sie an e<strong>in</strong>em Beispiel.
Priv. Doz. Dr. Bernhard Schmidt 22.7.2002<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 12. <strong>Arbeitsblatt</strong><br />
<strong>Maple</strong>ts<br />
<strong>Maple</strong>ts s<strong>in</strong>d Java-basierte graphische Benutzeroberflächen für mit <strong>Maple</strong> erzeugte Programme. <strong>Maple</strong>ts<br />
s<strong>in</strong>d vor allem von <strong>Maple</strong>-Arbeitsblättern unabhängig und können daher auch von <strong>Maple</strong>-Unkundigen<br />
bedient werden. E<strong>in</strong> <strong>Maple</strong>t besteht aus Elementen und Aktionen. Elemente s<strong>in</strong>d Bestandteile der<br />
graphischen Oberfäche und Aktionen s<strong>in</strong>d Prozeduren, die bei Anklicken oder Auswählen bestimmter<br />
Elemente ausgelöst werden.<br />
1 W<strong>in</strong>dows<br />
Das Fundament e<strong>in</strong>es <strong>Maple</strong>ts ist meist e<strong>in</strong> W<strong>in</strong>dow. Syntax:<br />
W<strong>in</strong>dow(Optionen, [[Elemente 1],...,[Elemente n]]);<br />
Dabei bestehen Elemente i aus vordef<strong>in</strong>ierten Bestandteilen der graphischen Oberfäche, z.B.<br />
- Button (Schaltfläche),<br />
- TextField (E<strong>in</strong>- und Ausgabe von Text) oder<br />
- Plotter (zur Ausgabe von <strong>Maple</strong>-Plots).<br />
- e<strong>in</strong> e<strong>in</strong>facher Str<strong>in</strong>g, z.B. ”Hallo”<br />
Die [Elemente 1],...,[Elemente n] werden untere<strong>in</strong>ander angezeigt. Elemente enthalten meist Prozeduren<br />
als Argumente, die bestimmte Aktionen auslösen, z.B. Shutdown() zum Schließen des <strong>Maple</strong>ts.<br />
Jeder E<strong>in</strong>trag Elemente i kann e<strong>in</strong> e<strong>in</strong>zelnes Element oder e<strong>in</strong>e Folge von Elementen se<strong>in</strong>. Ist e<strong>in</strong><br />
E<strong>in</strong>trag e<strong>in</strong>e Folge, so werden die Elemente der Folge nebene<strong>in</strong>ander angezeigt. Besteht Elemente 1<br />
z.B. aus Elt1, Elt2, Elt3, so werden Elt1, Elt2, Elt3 nebene<strong>in</strong>ander angezeigt.<br />
Anzeigen e<strong>in</strong>es W<strong>in</strong>dows W:<br />
restart; #zur Sicherheit<br />
with(<strong>Maple</strong>ts[Elements]):<br />
M:=<strong>Maple</strong>t(W):<br />
<strong>Maple</strong>ts[Display](M);<br />
Aufgabe 1 Erzeugen Sie e<strong>in</strong> <strong>Maple</strong>t, das folgendes anzeigt (verwenden Sie Str<strong>in</strong>gs ”Feld1”,... als<br />
Elemente):<br />
Feld1 Feld2 Feld3<br />
Feld4 Feld5 Feld6<br />
2 TextField, Button, SetOption, Evaluate<br />
Das folgende W<strong>in</strong>dow zeigt, wie man mit Hilfe e<strong>in</strong>es TextFields e<strong>in</strong>e Benutzere<strong>in</strong>gabe e<strong>in</strong>lesen kann.<br />
W:=W<strong>in</strong>dow( ’title’="Text e<strong>in</strong>lesen",<br />
[ "Geben Sie etwas e<strong>in</strong>:",<br />
TextField[’text’](), #der Inhalt des Feldes bekommt den Namen ’text’<br />
[ Button("Schliessen", Shutdown()) , #Button, der das <strong>Maple</strong>t schliesst<br />
Button("Loeschen", SetOption(’text’= "")) #Button, der Text loescht<br />
]<br />
]<br />
):
Die <strong>in</strong> diesem W<strong>in</strong>dow verwendete Aktion SetOption ist sehr nützlich, um Werte von Variablen zu<br />
setzen.<br />
Aufgabe 2 Schreiben Sie e<strong>in</strong> <strong>Maple</strong>t, das zusätzlich den e<strong>in</strong>gegebenen Text <strong>in</strong> e<strong>in</strong>em anderen Text-<br />
Field ausgibt, falls e<strong>in</strong> Button ”Anzeigen ”gedrückt wird. Das neue Textfeld soll ganz unten angezeigt<br />
werden.<br />
H<strong>in</strong>weis: Zum Kopieren des Texts verwendet man<br />
Aufgabe 4 SetOption(’target’=’anzeige’,Argument(’text’)), wobei ’anzeige’, die Variable<br />
ist, die den Text des Feldes ”Anzeigen”enthält.<br />
Die Aktion Evaluate<br />
E<strong>in</strong>en <strong>Maple</strong>-Befehl kann man <strong>in</strong> e<strong>in</strong>em <strong>Maple</strong>t aufrufen mit<br />
Evaluate(’name’ = ’Befehl(Parameter)’)<br />
Dadurch wird der Variable ’name’ der Rückgabewert des Befehls zugewiesen.<br />
Aufgabe 3 Schreiben Sie e<strong>in</strong> <strong>Maple</strong>t zur Durchführung von Primzahltests, das e<strong>in</strong> Textfeld zur<br />
E<strong>in</strong>gabe e<strong>in</strong>er ganzen Zahl und e<strong>in</strong>es zur Ausgabe des Ergebnisses (true oder false) enthält. Buttons:<br />
- “Schliessen” : <strong>Maple</strong>t wird mit Shutdown() geschlossen.<br />
- “Loeschen” : E<strong>in</strong>gegebene Zahl wird gelöscht.<br />
- “Primzahltest”: Primzahltest wird durchgeführt und Ergebnis im Ausgabefeld angezeigt.<br />
H<strong>in</strong>weise: E<strong>in</strong>lesen kann man mit<br />
"Geben Sie e<strong>in</strong>e ganze Zahl e<strong>in</strong>:",TextField[’zahl’]()<br />
Den Primzahltest führt man aus mit<br />
Button("Primzahltest", Evaluate(’resultat’ = ’isprime(zahl)’))<br />
Aufgabe 4 Speichern Sie das <strong>Maple</strong>t aus Aufgabe 3, <strong>in</strong>dem Sie bei “Speichern unter” den Dateityp<br />
<strong>Maple</strong>t wählen. Rufen Sie das <strong>Maple</strong>t aus dem W<strong>in</strong>dows-Explorer durch Doppelklick auf und testen<br />
Sie es.<br />
3 Das Element Plotter<br />
Mit dem Plotter-Element kann man <strong>in</strong>nerhalb von <strong>Maple</strong>ts plotten. Syntax:<br />
Plotter[’name’]()<br />
Dadurch wird e<strong>in</strong> Feld zum Plotten erzeugt, das unter ’name’ angesprochen werden kann. E<strong>in</strong>en<br />
Plotbefehl ausführen kann man dann mit<br />
Evaluate(’name’=’plot(funktion,var=a..b)’);<br />
dabei ist var die verwendete Variable, [a,b] der Plotbereich und funktion ist e<strong>in</strong> Ausdruck <strong>in</strong> der<br />
Variablen var, der geplottet wird.<br />
Aufgabe 5 Schreiben Sie e<strong>in</strong> <strong>Maple</strong>t mit 4 E<strong>in</strong>gabefeldern für<br />
- e<strong>in</strong>en zu plottenden Ausdruck (<strong>in</strong> e<strong>in</strong>er Variablen),<br />
- die verwendete Variable,<br />
- l<strong>in</strong>ken Randpunkt des Plotbereichs,<br />
- rechten Randpunkt des Plotbereich.<br />
Fügen Sie e<strong>in</strong> Plotter-Element h<strong>in</strong>zu und e<strong>in</strong>en Button “Plot”, bei dessen Anwahl der Ausdruck auf<br />
dem ausgewählten Bereich geplottet wird.
Priv. Doz. Dr. Bernhard Schmidt 17.6.2004<br />
http://www.math.uni-augsburg.de/˜schmidtb<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Maple</strong>: 7. <strong>Arbeitsblatt</strong><br />
Differentialgleichungen<br />
E<strong>in</strong>e Paradeanwendung von <strong>Maple</strong> ist die Bearbeitung von Problemen aus der K<strong>in</strong>ematik mit Hilfe des<br />
Solvers dsolve für Differentialgleichungen und die Animation der erhaltenen Lösungen. Obwohl dieses<br />
Vorhaben ke<strong>in</strong>eswegs leicht zu verwirklichen ist, werden wir es hier behandeln, denn die Resultate s<strong>in</strong>d<br />
sehr ansprechend. Die Schritte von der Problemstellung bis zur Animation sehen folgendermassen aus.<br />
<strong>1.</strong> Aufstellen der Bewegungsgleichungen.<br />
2. Lösen der Bewegungsgleichungen mit Hilfe von dsolve.<br />
3. Animieren der Lösungen mit Hilfe von plot oder plot3d und plots[display] oder plots[animate].<br />
1 Der Befehl dsolve<br />
Für das Lösen von Systemen von gewöhnlichen Differentialgleichungen (DGLn) ist der Befehl dsolve<br />
zuständig. Syntax:<br />
dsolve(M,F,Optionen);<br />
Dabei ist M e<strong>in</strong>e Menge gewöhnlicher DGLn und (optional) Anfangsbed<strong>in</strong>gungen. Zum Beispiel stellt<br />
M:={diff(x(t),t$2)=-x(t), x(0)=1, D(x)(0)=0};<br />
die DGL x ′′ (t) = −x(t) mit Anfangsbed<strong>in</strong>gungen x(0) = 1 und x ′ (0) = 0 dar. Weiter ist F die<br />
Menge der Funktionen, nach denen das System aufgelöst werden soll, zum Beispiel F:= {x(t)}. Die<br />
wichtigste Option von dsolve ist numeric, die e<strong>in</strong>em bei nicht exakt lösbaren Systemen oft weiterhilft.<br />
Die Lösungen werden <strong>in</strong> der Form von Gleichungen ausgegeben, etwa L:=x(t)=tan(t). Mit rhs(L);<br />
erhält man dann die Lösung, d.h. die rechte Seite (right hand side) der Gleichung x(t)=tan(t).<br />
Beispiel:<br />
Befehl<br />
M:={diff(x(t),t$2)=-x(t), x(0)=1, D(x)(0)=0};<br />
L:=dsolve(M,x(t));<br />
plot(rhs(L),t=-10..10);<br />
Kommentar<br />
DGL mit Anfangsbed<strong>in</strong>gungen<br />
DGL wird gelöst<br />
Plotten der Lösung<br />
Aufgabe <strong>1.</strong>1 Lösen Sie mit dsolve die Differentialgleichung x ′′ (t) = −tx(t) mit den Anfangsbed<strong>in</strong>gungen<br />
x(0) = 0, x ′ (0) = <strong>1.</strong> Plotten Sie die Lösung. H<strong>in</strong>weise: Die <strong>Maple</strong>-Schreibweise für x ′′ (t) bzw.<br />
x ′ (0) ist diff(x(t),t$2) bzw. D(x)(0).<br />
2 E<strong>in</strong> bisschen Physik<br />
Bewegungsgleichungen kann man nach Schema F aufstellen, falls das zugrundeliegende Problem nicht<br />
zu kompliziert ist. Dieses Schema F heißt <strong>in</strong> der Physik Lagrangeformalismus. Wir betrachten e<strong>in</strong>e<br />
Punktmasse m <strong>in</strong> e<strong>in</strong>em System (z.B. Kreisl<strong>in</strong>ie, Kugeloberfläche, Ebene) <strong>in</strong> e<strong>in</strong>em Kraftfeld (z.B.<br />
konstantes Gravitationsfeld). Die Koord<strong>in</strong>aten der Punktmasse zur Zeit t seien (x(t), y(t), z(t)).<br />
<strong>1.</strong>Schritt<br />
Beschreibung des Systems durch geeignete Hilfskoord<strong>in</strong>aten θ(t) = (θ 1 (t), ..., θ f (t)), wobei f die Anzahl<br />
der Freiheitsgrade ist. Das bedeutet: Die möglichen Aufenthaltsorte der Punktmasse s<strong>in</strong>d<br />
(x(θ), y(θ), z(θ)), θ ∈ R f .
Nicht jedes System kann so beschrieben werden, wir setzen aber e<strong>in</strong>e solche Beschreibung voraus. Zum<br />
Beispiel:<br />
E<strong>in</strong>heitskreisl<strong>in</strong>ie: x(t) = cos θ(t), y(t) = s<strong>in</strong> θ(t), z(t) = 0 (e<strong>in</strong> Freiheitsgrad).<br />
Kugeloberfläche: x(t) = s<strong>in</strong> θ 2 (t) cos θ 1 (t), y(t) = s<strong>in</strong> θ 2 (t) s<strong>in</strong> θ 1 (t), z(t) = cos θ 2 (t) (zwei Freiheitsgrade).<br />
2. Schritt<br />
a) Berechnung der k<strong>in</strong>etischen Energie<br />
[ (<br />
T = m ) d 2 ( ) d 2 ( ) ]<br />
d<br />
2<br />
2 dt x(t) +<br />
dt y(t) +<br />
dt z(t)<br />
(m = Masse). Dabei müssen x, y, z durch die θ i (t) ausgedrückt werden dann mit Hilfe der Kettenregel<br />
differenziert werden. <strong>Maple</strong> wendet die Kettenregel automatisch an.<br />
b) Berechnung der potentiellen Energie V . Im konstanten Gravitationsfeld <strong>in</strong> negativer z-Richtung ist<br />
(m=Masse, g=Gravitationsbeschleunigung).<br />
c) Berechung der Lagrangefunktion L = T − V .<br />
3.Schritt<br />
Die Bewegungsgleichungen lauten<br />
d<br />
dt<br />
(1)<br />
V = mgz (2)<br />
( ) ∂L<br />
∂θ ˙ − ∂L = 0, i = 1, ..., f. (3)<br />
i<br />
∂θ i<br />
Dabei ist θ ˙ i = dθ i /dt. Jede Koord<strong>in</strong>ate θ i liefert also e<strong>in</strong>e DGL. Der Ausdruck ∂L<br />
∂θ ˙ bedeutet: Ersetze<br />
i<br />
θ˙<br />
i = dθ i /dt <strong>in</strong> L durch e<strong>in</strong>e Variable, etwa a, differenziere den entstehenden Ausdruck nach a, und<br />
ersetze danach a wieder durch dθ i /dt. Analog berechnet man ∂L<br />
∂θ i<br />
.<br />
3 Beispiel: Der schiefe Wurf<br />
E<strong>in</strong>e Punktmasse m = 1 habe zur Zeit 0 die Geschw<strong>in</strong>digkeit v = 20 <strong>in</strong> horizontaler Richtung,<br />
Geschw<strong>in</strong>digkeit 0 <strong>in</strong> vertikaler Richtung und die Höhe h = 10. Die Gravitationsbeschleunigung sei<br />
konstant 10. Ziel: Berechung der Bahnkurve, Animation.<br />
Koord<strong>in</strong>aten: x(t): Horizontale Position zur Zeit t, y(t): Höhe zur Zeit t.<br />
Hier ist also θ 1 = x und θ 2 = y.<br />
Anfangsbed<strong>in</strong>gungen: x(0) = 0, ẋ(0) = v, y(0) = h, ẏ(0) = 0.<br />
Aufstellen der Lagrangegleichungen mit <strong>Maple</strong><br />
Befehl<br />
Kommentar<br />
m:=1; v:=20; h:=10; g:=10;<br />
Masse, Ausgangsgeschw<strong>in</strong>digkeit,<br />
Höhe, Gravitationsbeschleunigung<br />
T:=1/2*m*(diff(x(t),t)ˆ2+diff(y(t),t)ˆ2); K<strong>in</strong>etische Energie nach (1)<br />
V:=m*g*y(t); Potentielle Energie nach (2)<br />
L:=T-V;<br />
Lagrangefunktion<br />
L1:=subs(diff(x(t),t)=a,<br />
Wichtiger Trick: Ausdrücke, nach<br />
diff(y(t),t)=b,x(t)=c,y(t)=d,L);<br />
abgeleitet werden soll, werden durch<br />
neue Variablen ersetzt<br />
R1:=diff(L1,a); R2:=diff(L1,b);<br />
Berechung von ∂L/∂ẋ, ∂L/∂ẏ,<br />
R3:=diff(L1,c); R4:=diff(L1,d);<br />
∂L/∂x, ∂L/∂y<br />
a:=diff(x(t),t); b:=diff(y(t),t);<br />
c:=x(t); d:=y(t);<br />
Rücksubstituierung<br />
G1:=diff(R1,t)-R3=0; Gleichung (3) für i = 1<br />
G2:=diff(R2,t)-R4=0; Gleichung (3) für i = 2
Lösen der Bewegungsgleichungen<br />
Wir wenden dsolve jetzt auf das oben für den schiefen Wurf aufgestellte Differentialgleichungssystem<br />
an.<br />
Befehl<br />
M:={G1,G2,x(0)=0,<br />
D(x)(0)=v,y(0)=h,D(y)(0)=0 };<br />
L:=dsolve(M,{x(t),y(t)});<br />
Kommentar<br />
System mit Anfangsbed<strong>in</strong>gungen<br />
Lösen des Problems<br />
Animation der Lösungen<br />
Für die Animation der Lösung zum schiefen Wurf werden wir die Befehle plot und plots[display]<br />
verwenden. Statt dessen könnte man auch mit animate arbeiten.<br />
Befehl<br />
f:=rhs(op(L)[1]); g:=rhs(op(L)[2]);<br />
for i from 0 to 50 do<br />
P[i]:=plot([subs(t=i/20,f)+cos(u)/5,<br />
subs(t=i/20,g)+s<strong>in</strong>(u)/5,u=0..2*Pi]); od:<br />
with(plots):<br />
display([seq(P[k],k=0..50)],<strong>in</strong>sequence=true);<br />
Kommentar<br />
Zugreifen auf die Lösung<br />
Erzeugen von 51 Momentaufnahmen. s<strong>in</strong><br />
und cos erzeugen kle<strong>in</strong>en Kreis zur Darstellung<br />
des Punktes<br />
Liefert Animation. Zum Starten auf Bild<br />
klicken und <strong>in</strong> der Menüleiste auf Rechtspfeil<br />
klicken.<br />
4 Pendel mit großen Ausschlägen<br />
E<strong>in</strong> masseloser Stab der Länge l=1 sei so an e<strong>in</strong>em Punkt aufgehängt, dass er reibungsfrei <strong>in</strong> e<strong>in</strong>er<br />
festen Ebene pendeln kann (E<strong>in</strong>heiten lassen wir hier weg). Am unteren Ende des Stabs sei e<strong>in</strong>e Punktmasse<br />
m = 1 befestigt. Dann liegt die Bahn der Punktmasse auf e<strong>in</strong>em Kreis. Für die Koord<strong>in</strong>aten<br />
(x(t), y(t), z(t)) der Punktmasse können wir also schreiben:<br />
x(t) = cos a(t), y(t) = s<strong>in</strong> a(t), z(t) = 0.<br />
(∗)<br />
Hier ist also θ 1 = a. Da die z-Koord<strong>in</strong>ate immer Null ist, kann sie <strong>in</strong> den folgenden Rechnungen<br />
weggelassen werden.<br />
Aufgabe 4.1<br />
a) Berechnen Sie mit <strong>Maple</strong> die Lagrangefunktion des Pendels (Schritt 2, letzte Seite). Die potentielle<br />
Energie sei V = y(t)g, wobei g = 10 die Erdbeschleunigung ist.<br />
b) Stellen Sie die Bewegungsgleichung G für das Pendel auf (Schritt 3, letzte Seite). Gehen Sie dabei<br />
analog zur Tabelle auf der letzten Seite vor. Vere<strong>in</strong>fachen Sie die Gleichung dann mit G1:=simplify(G);.<br />
c) Lösen Sie die Bewegungsgleichung G1 mit den Anfangsbed<strong>in</strong>gungen a(0)=0 und D(a)(0)=0 und<br />
der Option numeric als drittem Argument von dsolve.<br />
Als Lösung erhalten wir <strong>in</strong> Aufgabe 4.1 c) e<strong>in</strong>e Prozedur, die wir L nennen. Ruft man zum Beispiel<br />
L(2) auf, so erhält man <strong>in</strong> der zweiten Komponente der Ausgabe den Wert a(2).<br />
Aufgabe 4.2<br />
a) Def<strong>in</strong>ieren Sie mit Hilfe der Prozedur L von oben die Lösungsfunktion<br />
f:=t ->rhs(L(t)[2]); und plotten Sie f.<br />
b) Erzeugen Sie mit<br />
for i from 0 to 50 do P[i]:=plot( [ [0,0],[cos(f(i/10)),s<strong>in</strong>(f(i/10))] ], style=l<strong>in</strong>e): od:<br />
51 Momentaufnahmen der Pendelbewegung und animieren Sie diese mit<br />
plots[display]( [seq(P[k],k=0..50)], <strong>in</strong>sequence=true);
5 Punktmasse auf e<strong>in</strong>er Spirale<br />
Wir betrachten e<strong>in</strong>e Punktmasse m = 1, die sich reibungsfrei auf der Spirale<br />
x(t) = a(t) cos 5a(t), y(t) = a(t) s<strong>in</strong> 5a(t), z(t) = 0.<br />
bewegt. Wie zuvor kann die z-Koord<strong>in</strong>ate hier bei den folgenden Rechnungen weggelassen werden.<br />
Aufgabe 5.1<br />
a) Berechnen Sie mit <strong>Maple</strong> die Lagrangefunktion der Punktmasse auf der Spirale. Die potentielle<br />
Energie sei überall 0.<br />
b) Stellen Sie die Bewegungsgleichung G für die Punktmasse auf. Vere<strong>in</strong>fachen Sie die Gleichung dann<br />
mit G1:=simplify(G);.<br />
c) Lösen Sie die Bewegungsgleichung G1 mit den Anfangsbed<strong>in</strong>gungen a(0)=0 und D(a)(0)=10 mit<br />
Hilfe von dsolve ohne Option.<br />
Als Lösung erhalten wir <strong>in</strong> Aufgabe 5.1 c) e<strong>in</strong>en Ausdruck (Gleichung), den wir L nennen.<br />
Aufgabe 5.2<br />
a) Def<strong>in</strong>ieren Sie mit Hilfe der Lösung L von oben die Lösungsfunktion<br />
f:=x ->evalf(subs(t=x,rhs(L)));.<br />
b) Erzeugen Sie mit<br />
for i from 0 to 50 do<br />
P[i]:= plot([f(i/10)*cos(5*f(i/10))+cos(u)/10, f(i/10)*s<strong>in</strong>(5*f(i/10))+s<strong>in</strong>(u)/10,u=0..2*Pi]);<br />
od:<br />
51 Momentaufnahmen der Spiralbewegung und animieren Sie diese mit<br />
plots[display]( [seq(P[k],k=0..50)], <strong>in</strong>sequence=true);<br />
(∗∗)