1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"><html><head>
<meta http-equiv="Content-Type" content="text/html;CHARSET=iso-8859-1">
<meta name="VPSiteProject" content="file:///E|/euler/docs/euler.vpp">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0"><title>Euler, Deutsche Einfhrung</title>
<link rel="stylesheet" type="text/css" href="images/euler.css"></head>
<body bgcolor="#ffffff" text="#000000" alink="#d6d6c0" link="#993300" vlink="#663300">
<h1>Deutsche Einfhrung</h1>
<h2><a name="Grundstzliches"></a>Grundstzliches</h2>
<p>Euler ist ein numerisches Laboratorium. Numerisch deswegen, weil Euler keine symbolischen Termumformungen vornimmt,
wie z.B. Maple. Die Strken des Programms liegen daher in der viel hheren Geschwindigkeit und in der
einfachen Handhabung von groen Datenmengen.</p>
<p>Am strksten verwandt ist Euler mit MatLab und seinen Nachahmern, wie SciLab. Als 1988 die erste Version
von Euler entstand, steckte allerdings auch MatLab noch in den Kinderschuhen. Daher hat Euler zwar den gleichen
Ansatz wie MatLab, ist aber nicht voll kompatibel. Ich habe in vielen Fllen die Syntax genommen, die ich
fr besser und einfacher hielt.</p>
<p>Im Prinzip ist Euler eine <em>Matrixsprache</em>. Es existieren sehr mchtige Funktionen, um Matrizen und
Vektoren zu verwalten und modifizieren. Natrlich kann man das fr lineare Algebra und Geometrie benutzen.
Der Haupteinsatz liegt jedoch in der Erstellung von Daten- und Funktionstabellen.</p>
<p>Bevor wir aber dazu kommen, wollen wir kurz die <em>Befehlszeile</em> von Euler vorstellen. In der Befehlszeile
knnen Sie Kommandos eingeben, die Euler berechnen oder ausfhren soll. Die Zeile dient auerdem
zur Eingabe von Funktionen, sofern diese nicht aus externen Dateien gelesen werden. Geben Sie zunchst ein</p>
<pre>>(5*4+3/2)/4^2
1.34375 </pre>
<p>Geben Sie diesen Befehl in der Kommandozeile ein und drcken Sie anschlieend die Eingabetaste. Falls
Sie einen Fehler gemacht haben, so knnen Sie mit Cursor-Hoch in diese Zeile zurckwechseln und den Fehler
korrigieren. Euler berechnet das Ergebnis sofort. Deswegen nennt man solche Systeme <em>interaktiv</em>. Natrlich
werden die blichen Rechenregeln (die Operatorprioritt) beachtet. Beispielsweise wird 4^2 (steht fr
4 hoch 2) vor der Division berechnet. Euler kennt auch die blichen mathematischen Funktionen. Auerdem
kennt es komplexe Zahlen.</p>
<pre>>longformat; sin(1+1i)
1.298457581416+0.6349639147847i </pre>
<p>Hier wurde auerdem noch auf ein lngeres Ausgabeformat umgeschaltet. Das Semikolon hinter dem longformat-Befehl
verhindert die Ausgabe des Befehlsergebnisses. Man schaltet brigens mit shortformat zurck.</p>
<pre>>longestformat; 1/3
0.33333333333333331 </pre>
<p>Dieses Format ist so lang, dass die interne Rundung deutlich wird. Auf Wunsch gibt Euler auch Brche aus.</p>
<pre>>fracformat; 1+1/2+1/3+1/4+1/5
137/60 </pre>
<p>Intern wird jedoch immer mit double-Zahlen gerechnet.</p>
<p>Wie man Vektoren eingibt, wird weiter unten im Abschnitt ber lineare <a href="#Lineare">Algebra</a> besprochen.
Wir erzeugen hier als Beispiel fr die Verwendung von Euler anstelle eine Programmiersprache eine Reihe von
Zufallszahlen.</p>
<pre>>z=random(1,1000);</pre>
<p>Falls Sie das Semikolon vergessen haben, werden die 1000 Zahlen ausgegeben. Dies knnen Sie mit der Escape-Taste
abbrechen.</p>
<p>Mit dem obigen Befehl wird eine 1x1000-Matrix (also einen Zeilenvektor) mit gleichverteilten Zufallszahlen zwischen
0 und 1 erzeugt. Dieser Vektor wird als Variable z festgehalten. Es ist nun einfach, mit diesen Zahlen zu hantieren.
Z.B. berechnet man den Mittelwert mit</p>
<pre>>shortformat; m=sum(z)/length(z)
0.509271</pre>
<p>Statt length(z) kann natrlich auch einfach 1000 eingesetzt werden, oder cols(z), was die Anzahl der Spalten
von z ergibt. sum(z) berechnet die Zeilensumme von Matrizen, in diesem Fall also einfach die Summe der 1000 Zahlen.</p>
<p>Damit ist es nun nicht schwer, die Stichprobenstreuung zu berechnen.</p>
<pre>>sqrt(sum((z-m)^2)/(length(z)-1))
0.285003</pre>
<p>Euler enthlt auch eine Programmiersprache, mit der sich neue Funktionen schreiben lassen. Diese Funktionen
befinden sich in externen Dateien, die geladen werden mssen. Daher lt sich derselbe Effekt wie
oben auch mit den folgenden Befehlen erreichen.</p>
<pre>>load statist
Statistical Functions
>mean(z)
0.509271
>dev(z)
0.285003 </pre>
<p>Um etwas Komplizierteres vorzufhren, zhlen wir, wie oft eine Zufallszahl grer ist als
die beiden benachbarten. Die beiden Randelemente sollen nicht mitgezhlt werden. Das geht so</p>
<pre>>sum(z[2:999]>z[1:998] && z[2:999]>z[3:1000])
323 </pre>
<p>Wie funktioniert das? Der Vektor 2:999 ist einfach der Vektor der Zahlen 2,3,4,...,999. Setzt man diesen Vektor
als Index fr z ein, so werden alle Elemente mit diesen Indizes aus z ausgewhlt und in einen neuen Vektor
eingetragen. Anschlieen werden zwei solche Vektoren miteinander verglichen. Dies ergibt 1 an allen Stellen,
an denen der Vergleich zutrifft und 0 sonst. Dann werden noch die beiden Vergleichsresultate gliedweise mit <em>und</em>
verknpft. Die Summe der vorhanden Einser zhlt genau das, was wir wollen.</p>
<p>Dieses Beispiel demonstriert recht gut, was man mit Euler anfangen kann. Es ersetzt in vielen Fllen eine
Programmiersprache. Dabei stehen zudem noch mchtige Funktionen in einfacher Weise zur Verfgung, fr
die man sonst eine Bibliothek bruchte. Euler ist quasi ein interaktives Laboratorium der Numerik.</p>
<h2><a name="Einfache"></a>Einfache Plots</h2>
<p>Da Funktionen auf Vektoren gleidweise wirken, knnte man einen einfachen 2D-Plot folgendermaen erzeugen</p>
<pre>>t=-5:0.01:5; xplot(t,sin(2*t)*t);</pre>
<p>Dies erzeugt einen Plot der Funktion sin(2*t)*t zwischen -5 und 5, weil t ein Vektor ist, der die Werte -5,...,5
enthlt mit einer Schrittweite von 0.01. Das Ganze sieht dann so aus</p>
<p align="center"><img src="images/Plot2D.gif" align="bottom" border="0" width="394" height="319"></p>
<p>Als Parameter fr xplot werden zwei Vektoren erwartet mit x- und y-Koordinaten der Punkte. Die Punkte werden
durch Linien verbunden. Daher kann man auch andere Kurven in der Ebene plotten, z.B. erhlt man den Einheitskreis
durch</p>
<pre>>t=linspace(0,2*pi,1000); xplot(cos(t),sin(t));</pre>
<p>Allerdings muss man das Ausgabefenster in die richtigen Proportionen bringen, sonst ist der Kreis eine Ellipse.
Die Ausgabe wird dabei angepasst. Der Vektor t wird hier nicht mit Hilfe der Schrittweite wie oben erzeugt, sondern
mit der Funktion linspace, die die beiden Grenzen und die Anzahl der Teilintervalle erwartet.</p>
<p>Hier ein Beispiel fr eine hbsche Figur.</p>
<pre>>clg; hold; plot(sin(4*t),cos(5*t)); hold;</pre>
<p>Der Trick mit dem hold sorgt dafr, dass kein Rahmen gezeichnet wird. Im Prinzip dient dies dazu, Plots
mit anderen zu bermalen. Das Kommando clg lscht die alte Grafik.</p>
<p align="center"><img src="images/Liss.gif" align="bottom" border="0" width="250" height="225"></p>
<p>Einfacher als dies alles ist die Verwendung von Funktionen in Strings. Die obige Funktion lt sich
wesentlich einfacher mittels</p>
<pre>>fplot("sin(2*x)*x",-5,5);</pre>
<p>plotten. Der String kann dabei entweder eine Funktion in der Variablen x enthalten oder den Namen einer selbstprogrammierten
Funktion.</p>
<p>Solche selbstdefinierten Funktionen lassen sich entweder direkt in der Kommandozeile eingeben, oder von externen
Dateien laden. Wir geben eine Funktion ein, die durch eine Fallunterscheidung definiert ist. Sie soll x^2 rechts
von 0 und -x^3 links von 0 sein.</p>
<pre>>function f(x)
$if x>0; return x^2;
$else return -x^3;
$endif;
$endfunction</pre>
<p>Dies definiert die verlangte Funktion. Die Eingabe erfolgt interaktiv, wobei durch die nderung des Cursors
signalisiert wird, dass Euler sich im Eingabemodus befindet. Die verwendete Programmiersprache sollte ziemlich
einleuchtend sein. Man beachte, dass x keinen Datentyp hat. Die Funktion funktioniert daher fr alle Datentypen,
die Euler verwenden kann und die in der Funktion Sinn machen, insbesondere fr reelle und komplexe Zahlen.
Fr Intervalle, die 0 enthalten arbeitet die Funktion brigens ebenfalls nicht korrekt.</p>
<p>Fr Vektoren von Zahlen arbeitet die Funktion ebenfalls nicht richtig. Daher gibt es die mglichkeit
eine gegebene Funktion auf alle Elemente eines Vektors anzuwenden.</p>
<pre>>function fvec(x)
$return map("f",x);
$endfunction</pre>
<p>Nun kann die Funktion auch geplottet werden.</p>
<pre>>fplot("fvec",-1,1);</pre>
<p>Mit einem Trick geht das ganze auch in einer Zeile.</p>
<pre>>fplot("(x>=0)*x^2+(x<0)*(-x^3)",-1,1);</pre>
<p>Natrlich kann man auch einzelne Punkte zeichnen, oder Balken. Als Beispiel erzeugen wir ein Bild der Binomialverteilung
und legen die entsprechende Normalverteilung darber.</p>
<pre>>n=20; b=bin(n,0:n)/2^n;
>setplot(-0.5,n+0.5,0,0.2); xplotbar((0:n)-0.5,0,1,b);
>color(10); style("m[]"); hold on; mark(0:n,b); hold off;
>color(4); linewidth(2); t=linspace(0,n,300); m=10; s=sqrt(20/4);
>hold on; plot(t,1/(sqrt(2*pi)*s)*exp(-(t-m)^2/(2*s^2))); hold off;</pre>
<p>Hier werden verschiedene Stile und Farben gesetzt. Diese knnen alle mit reset() zurckgesetzt werden.
Barplots sehen etwas kompliziert aus, weil sie die x-y-Koordinaten der Balken, sowie deren Weiten und Hhen
als Parameter erwarten. Einfacher ist ein mark-Plot, den wir als zweites ber die Zeichnung legen. Beachten
Sie, dass alle Plots gem den in setplot eingestellten Grenzen skaliert werden.</p>
<p align="center"><img src="images/Binomial.gif" align="bottom" border="0" width="443" height="362"></p>
<h2><a name="Kurvendiskussion"></a>Kurvendiskussion</h2>
<p>Kurvendiskussionen kann man mit Funktionstabellen durchfhren, genau wie die Grundfunktionen des Plottens.
Es existieren aber genau wie dort Funktionen, die direkt mit Ausdrcken oder benutzerprogrammierten Funktionen
arbeiten. Als Beispiel betrachten wir die Funktion sin(t)/t.</p>
<p align="center"><img src="images/Sinc.gif" align="bottom" border="0" width="353" height="269"></p>
<p>Zuerst verschaffen wir uns einen berblick durch Plotten.</p>
<pre>>f="sin(x)/x";
>fplot(f,epsilon,4*pi);</pre>
<p>Dieses Mal haben wir darauf verzichtet, eine Fallunterscheidung zu machen, und speichern die Funktion einfach
als Ausdruck in einem String. Deswegen werden wir im Punkt 0 immer eine Fehlermeldung erhalten. Um das zu vermeiden,
plotten wir von einem kleinen positiven Wert epsilon aus. Dieser Wert wird auch dazu verwendet, Zahlen auf ungefhre
Gleichheit zu testen (a~=b).</p>
<p>Nun berechnen wir die erste Nullstelle, die natrlich Pi ist.</p>
<p>>longformat; secant(f,3,4)<br>
3.14159265359</p>
<p>Von Interesse ist vielleicht auch das Integral, die wir sowohl mit Gau als auch mit Romberg berechnen,
und die Ableitung.</p>
<pre>>romberg(f,epsilon,pi)
1.85193705198
>gauss(f,epsilon,pi)
1.85193705198
>dif(f,pi)
-0.3183098551892</pre>
<p>Wo ist nun das Minimum zwischen 2 und 6?</p>
<pre>>m=fmin(f,2,6)
4.493409448108
>dif(f,m)
-2.457683194734e-08 </pre>
<p>Wir wollen zum Abschlu das Integral von f von 0 bis t als Funktion definieren. Dazu verwenden wir eine
Funktiondefinition. Die Gauintegration funktioniert schon korrekt mit Vektoren, so dass auch unsere Funktion
mit Vektoren arbeiten wird.</p>
<pre>>function g(t)
$return gauss("sin(x)/x",0,t);
$endfunction
>fplot("g",epsilon,3*pi);</pre>
<p align="center"><img src="images/SincI.gif" align="bottom" border="0" width="351" height="274"></p>
<h2><a name="Plots"></a>Plots von Funktionen mit zwei Variablen</h2>
<p>Neben den im vorigen Kapitel erwhnten Plots, die praktisch eindimensional sind, kann man auch Funktionen
von zwei Variablen zeichnen. Die einfachste Art und Weise ist ein mesh-Plot, der die Funktion in drei Dimensionen
zeigt.</p>
<p align="center"><img src="images/Mesh.gif" align="bottom" border="0" width="352" height="281"></p>
<p>Dieser Plot wird mit</p>
<pre>>x=-1:0.1:1; y=x'; mesh(x^2+y^2);</pre>
<p>erzeugt. Dabei laufen beide Variablen von -1 bis 1. x ist dabei ein Zeilenvektor und y ein Spaltenvektor. Werden
solche Vektoren verknpft (hier durch +), so entsteht eine Matrix aus Werten die alle mglichen Kombinationen
enthlt, hier also die Elemente x[i]^2+y[j]^2 fr alle i und j. Diese Matrix wird bei der obigen Zeichnung
als Niveauhhe benutzt.</p>
<p>Wie im vorigen Paragraphen kann man auch mit</p>
<pre>>f3dplot("x^2+y^2",-1,1,-1,1);</pre>
<p>die Funktion gezeichnet werden.</p>
<p align="center"><img src="images/Plot3D.gif" align="bottom" border="0" width="307" height="241"></p>
<p>Interessant sind auch Hhenlinien einer Funktion, die sich mit</p>
<pre>>fcontour("x^2+x*y^3",50);</pre>
<p>erzeugen lassen.</p>
<p align="center"><img src="images/Contour.gif" align="bottom" border="0" width="351" height="294"></p>
<p>Dabei wird 50 als zustzlicher Parameter bergeben, der fr die Feinheit des Plots sorgt. Es
sind weitere zustzliche Parameter (der x- und y-Bereich, und die Anzahl der Hhenlinien) mglich,
ber die man mit</p>
<pre>>help fcontour</pre>
<p>Auskunft erhlt. Einen guten berblick ber eine Funktion verschaffte ein kombinierter Dichte
und Hhenlinien-Plot mit</p>
<p>>color(5); fcd("x^2+x*y^3);</p>
<p align="center"><img src="images/fcd.gif" align="bottom" border="0" width="348" height="285"></p>
<p>Die Abbildung leidet etwas unter der Reduktion auf 256 Farben.</p>
<h2><a name="3"></a>3 Variablen</h2>
<p>Euler kann auf sowohl einfache Weise, als auch auf flexiblere Weise Plots von dreidimensionalen Oberflchen
erzeugen. ber die Variationsbreite der mglichen Plots gibt die Demo Auskunft, die man mit</p>
<pre>>load demo</pre>
<p>(oder dem Men) startet. Wir zeigen hier deswegen nur ein Beispiel.</p>
<p align="center"><img src="images/Halfpipe.gif" align="bottom" border="0" width="393" height="236"></p>
<p>Um dieses Bild zu erzeugen, muss man offenbar eine Karte der Oberflche anfertigen. Dies geschieht mit
Hilfe der folgenden Befehle</p>
<pre>>x=linspace(0,pi,80); y=linspace(-pi,pi,40)';
>X=cos(x)*(1+0.5*cos(y)); Y=sin(x)*(1+0.5*cos(y)); Z=0.5*sin(y);
>framedsolid(X,Y,Z,3);</pre>
<p>Der zustzliche Parameter 3 ist ein Streckungsfaktor, der dafr sorgt, dass alles schn im Bild
ist. Der Blickwinkel kann mit Hilfe von view eingestellt werden.</p>
<pre>>view(7,1.5,-1,-0.5); framedsolid(X,Y,Z,3);</pre>
<p align="center"><img src="images/HalfPipe1.gif" align="bottom" border="0" width="371" height="288"></p>
<h2><a name="Lineare"></a>Lineare Algebra</h2>
<p>Es existieren die blichen Funktionen der linearen Algebra, einschlielich mehrere Funktionen zur
Berechnung von Eigenwerten, und zur Lsung von Optimierungsproblemen. Damit es nicht zu leicht wird, verwenden
wir gleich eine schlecht konditionierte Matrix.</p>
<pre>>a=0.34567; d=0.87654; c=round(sqrt(a*d),5);
>A=[a,c;c,d]
0.34567 0.55045
0.55045 0.87654 </pre>
<p>Diese Matrix wurde so erzeugt, dass die Determinante sehr klein ist. Die Eingabe einer Matrix erfolgt zeilenweise,
wobei die Spalten durch Kommas und die Zeilen durch Semikolon getrennt werden.</p>
<pre>>det(A)
-1.6207e-06 </pre>
<p>In der Tat ist die Determinante klein. Wie lsen nun ein knstliches Gleichungssystem, dessen Lsung
der Vektor (1,1) sein muss.</p>
<pre>>b=A.[1;1]
0.89612
1.42699
>A\b
1
1</pre>
<p>Der Punkt steht fr die Matrizenmultiplikation und der Schrgstrich A\b fr die Lsung von
Ax=b. Es treten hier keinerlei numerische Probleme auf. Verndert man aber A ein klein wenig, so ensteht eine
komplett andere Lsung.</p>
<pre>>[a,c;c,d+0.00001]\b
3.99809
-0.882734 </pre>
<p>Dies spricht fr eine schlechte Kondition der Matrix. Wir berechnen die Eigenwerte und den Quotient aus
dem Betrag des grten und des kleinsten Eigenwertes.</p>
<pre>>l=eigenvalues(A), max(abs(l))/min(abs(l))
-1.32604e-06+0i 1.22221+0i
921701 </pre>
<p>Man kann auch alle Eigenwerte und Eigenvektoren auf einmal berechnen. Die Eigenvektoren werden dabei normiert,
so dass wir sofort eine Diagonaldarstellung bekommen.</p>
<pre>>{l,v}=eigen(A); v
-0.846862+0i 0.531812+0i
0.531812+0i 0.846862+0i
>D=diag([2,2],0,l)
-1.32604e-06+0i 0+0i
0+0i 1.22221+0i
>v'.D.v
0.34567+0i 0.55045+0i
0.55045+0i 0.87654+0i</pre>
<p>Wir wollen nun annehmen, dass A auf 5 Stellen genau sei, wie das aufgrund der Zahlenwerte zu vermuten ist. In
Euler knnen wir dazu die Intervallrechnung verwenden.</p>
<pre>>B=A+~-0.000005,0.000005~
Column 1 to 1:
~0.345665,0.345675~
~0.550445,0.550455~
Column 2 to 2:
~0.550445,0.550455~
~0.876535,0.876545~
>B\b
Determinant may be 0</pre>
<p>Wie man sieht, lt sich das Gleichungssystem nicht mehr lsen. Nimmt man eine Genauigkeit von
6 Stellen an, so wird ein Lsungsintervall berechnet. Die Funktion ilgs tut dies in etwas optimalerer Form,
so dass die Intervalleinschlieung kleiner wird. Am genauesten Wre der Schnitt zwischen beiden Lsungsintervallen.</p>
<pre>>(A+~-0.0000005,0.0000005~)\b
~-7.057,2.32962~
~0.17,6.1~
>ilgs((A+~-0.0000005,0.0000005~),b)
~-2.10793,4.10793~
~-0.951715,2.95171~ </pre>
<p>Weitere Beispiele dieser Art finden sich in der Demo.</p>
<h2><a name="Weitere"></a>Weitere Hilfe</h2>
<p>In dieser Einfhrung konnten wir lediglich einen kleinen Einblick in Euler geben. Als weitere Experimente
sollte man die mitgelieferten Notebooks laden und ausfhren. Interessant ist hier die deutsche Einfhrung
in Form eines Notebooks. Unter Windows werden Notebooks mit der Kommandozeile geladen. In Unix verwendet man das
notebook Kommando.</p>
<p>Eine Demo wird mittels</p>
<pre>>load demo</pre>
<p>gestartet, oder in Windows ber das Men. Alternativ gibt es eine selbstablaufende Demo.</p>
<pre>>load autodemo</pre>
<p>Beide werden, wie alle Euler-Kommandos mit der Excape-Taste abgebrochen. Sie knnen ruhig auch andere Euler-Files
laden, die mitgeliefert wurden, ebenso wie die anderen Notebooks.</p>
<p>Die Dokumentation von Euler befindet sich in HTML-Form im Unterverzeichnis doc. Bei der Installation der Windows-Version
erhalten Sie Links darauf im Startmen. Falls Sie unter Linux mit RPM installiert haben, so finden Sie die
Hilfe an der blichen Stelle.</p>
<p>Auerdem steht eine Online-Hilfe zur Verfgung, die sie mit dem Kommando</p>
<pre>>help fplot</pre>
<p>aufrufen knnen. Es wird entweder ein eingebauter Befehl erklrt, oder die Hilfezeilen einer Programmdefinition
ausgedruckt.</p>
<p>Die Hilfe im Help-Men von Windows erklrt lediglich die Besonderheiten der Windows-Oberflche.</p>
<p>Abschlieend bleibt mir noch, Ihnen viel Erfolg mit Euler zu wnschen.</p>
<address><a href="mailto:grothm@ku-eichstaett.de">Dr. R. Grothmann</a>
</address></body></html>
|