(*^ ::[ Information = "This is a Mathematica Notebook file. It contains ASCII text, and can be transferred by email, ftp, or other text-file transfer utility. It should be read or edited using a copy of Mathematica or MathReader. If you received this as email, use your mail application or copy/paste to save everything from the line containing (*^ down to the line containing ^*) into a plain text file. On some systems you may have to give the file a name ending with ".ma" to allow Mathematica to recognize it as a Notebook. The line below identifies what version of Mathematica created this file, but it can be opened using any other version as well."; FrontEndVersion = "Macintosh Mathematica Notebook Front End Version 2.2"; MacintoshStandardFontEncoding; fontset = title, nohscroll, center, bold, L0, 24, "Arial"; fontset = subtitle, nohscroll, center, bold, L0, 18, "Arial"; fontset = subsubtitle, nohscroll, center, bold, L0, 14, "Arial"; fontset = section, grayBox, bold, L0, 14, "Arial"; fontset = subsection, blackBox, bold, L0, 12, "Arial"; fontset = subsubsection, whiteBox, bold, L0, 10, "Arial"; fontset = text, L0, 12, "Arial"; fontset = smalltext, L0, 10, "Arial"; fontset = input, nowordwrap, bold, L0, 10, "Courier New"; fontset = output, nowordwrap, italic, L0, 10, "Courier New"; fontset = message, nowordwrap, R32768, L0, 10, "Courier New"; fontset = print, nowordwrap, L0, 10, "Courier New"; fontset = info, nowordwrap, L0, 10, "Courier New"; fontset = postscript, nowordwrap, L0, 8, "Courier New"; fontset = name, nohscroll, italic, B32768, L0, 10, "Arial"; fontset = header, nohscroll, right, bold, italic, L0, 14, "Arial"; fontset = leftheader, nowordwrap, nohscroll, L0, 12, "Arial"; fontset = footer, nohscroll, right, bold, L0, 14, "Arial"; fontset = leftfooter, nowordwrap, nohscroll, L0, 12, "Arial"; fontset = help, nohscroll, L0, 10, "Arial"; fontset = clipboard, nohscroll, L0, 12, "Arial"; fontset = completions, nowordwrap, nohscroll, L0, 12, "Arial"; fontset = special1, nowordwrap, nohscroll, L0, 12, "Arial"; fontset = special2, nowordwrap, nohscroll, center, bold, L0, 11, "Arial"; fontset = special3, nowordwrap, nohscroll, right, L0, 12, "Arial"; fontset = special4, nowordwrap, nohscroll, L0, 12, "Arial"; fontset = special5, nowordwrap, nohscroll, L0, 12, "Arial"; currentKernel; ] :[font = text; inactive] TestLive.MA :[font = subsubtitle; inactive] Computer-Graphik :[font = subtitle; inactive] Vorlesung und MATHEMATICA Workshop WS 95/96 :[font = subsubtitle; inactive] Prof. Dr. Robert Kragler FH Ravensburg-Weingarten Fachbereich Physikalische Technik :[font = title; inactive] Echtzeit-Visualisierung :[font = subtitle; inactive] mit Live (Vers. 1.5) :[font = subsubsection; inactive; startGroup] Initialisierung :[font = input; startGroup] (* Aktuelles Verzeichnis festlegen, ggf. abändern *) If[$OperatingSystem == "Windows", actDirectory = "/M/Winmath/Live/Notebks"] SetDirectory[actDirectory]; (* Standard-Schrift für Graphiken festlegen *) $DefaultFont={"Helvetica-Bold",8}; (* Seitenbreite festlegen ohne Zeilenumbruch *) SetOptions["stdout",PageWidth->120]; :[font = output; output; inactive; endGroup; endGroup] "/M/Winmath/Live/Notebks" ;[o] /M/Winmath/Live/Notebks :[font = section; inactive; startGroup] Einsatzmöglichkeiten von Live :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Das Programm "Live" von Milo Hedge stellt für Mathematica eine Visualisierungs-Umgebung bereit, die darauf zugeschnitten ist, Mathematica um Echtzeit-Darstellungen zu erweitern. Nunmehr kann man auf einem leistungsstarken PC zusammen mit dem Programm "Live" 3D-Graphiken in Echtzeit manipulieren, was zuvor nur auf teuren Workstations, ausgestattet mit spezieller Hard- und Software, möglich war. "Live" benutzt revolutionäre Software-Algorithmen zur Darstellung von 3D-Graphik, um so eine mathematisch fundierte Virtuelle Realität auf dem PC zu ermöglichen. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] "Live" erweitert die in Mathematica implementierten Graphik-Darstellungen um neue Fähigkeiten. Statt mühsam textuelle Kommandos einzugeben, um damit den Augenpunkt ViewPoint -> {x,y,z}, die Geometrie oder andere graphische Optionen anzupassen, und sodann auf ein erneutes Rendering der Oberflächen zu warten, kann man derartige Parameter mit "Live" in Echtzeit optimieren. Es lassen sich Umwandlungen auf Drahtgitter-Modelle oder Punktwolken augenblicklich vornehmen, auch kann unmittel- bar die Farbe der Oberfläche und eine Fülle weiterer Optionen für die Darstellung geändert werden. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] "Live" offeriert Oberflächen-Eigenschaften wie diffuse und spiegelnde Reflexivität, welche in Echtzeit angepaßt werden, und ermöglicht es, für die Oberfläche zwischen flachen und glatten Schattierungs- Modellen zu wählen. Eine der beeindruckendsten Eigenschaften von "Live" ist seine Fähigkeit, sowohl statische wie animierte Texturen zu liefern. Mathematica selbst kann für die Erzeugung von Texturen herangezogen werden, die dann innerhalb von "Live" auf beliebige 3D-Objekte abgebildet werden können. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] "Live" kann mit Mathematica auf verschiedene Weise zusammenspielen. o Es kann entweder im Zusammenhang mit Dateien im 3-Script-Format benutzt werden, die aus Mathematica exportiert wurden, oder o es kann sich eine Prozeß-Prozeß-Kopplung zunutze machen, indem das MathLink-Protokoll zwischen "Live" und Mathematica benutzt wird. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] 3D-Objekte, welche in "Live" verwendet werden, können mit Standard-Mathematica Graphik-Kom- mandos wie "Plot3D", "ParamentricPlot3D" und dem allgemeinerem "Graphics3D" erzeugt werden. Texturen lassen sich in einem Mathematica-Notebook unter Benutzung von der Funktion "DensityPlot" erzeugen. :[font = subsubsection; inactive; pageBreak; startGroup] Windows/Mouse-Operationen :[font = smalltext; inactive; endGroup] 1.) Löschen eines Objektes : Klicken der linken Maus-Taste, während der Maus-Zeiger sich auf dem Objekt befindet, Drücken der Tasten Shift und CTRL. 2.) Schwenken und Zoomen der Kamera : Drücken der rechten Maus-Taste. Horizontale Bewegung der Maus schwenkt die Kamera um die Szene herum. Vertikale Bewegung zoomt die Kamera in und aus der Szene. 3.) Kippen der Kamera : Drücken der rechten Maus-Taste und der SHIFT-Taste. Vertikale Bewegung der Maus kippt die Kamera über und unter die Szene. 4.) Schwenken und Kippen des Lichts : Drücken der rechten Maus-Taste und der CTRL-Taste. Horizontale Bewegung der Maus schwenkt die Lichtquelle um die Szene herum. Vertikale Beweung kippt das Licht in Bezug auf die Szene. 5.) Rotieren eine Objekts : Drücken der linken Maus-Taste mit dem Zeiger auf dem Objekt. 6.) Ziehen eines Objekts : Drücken der linken Maus-Taste und der SHIFT-Taste mit dem Zeiger auf dem Objekt. 7.) Ziehen eines Objekts auf die Kamera zu bzw. weg : Drücken der linken Maus-Taste und der CTRL-Taste mit dem Zeiger auf dem Objekt. :[font = subsubsection; inactive; startGroup] Menü-Kommandos :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Die Klapp-Menüs sind wie folgt : :[font = info; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] File:Open - Lesen einer Datei File:Save - Sichern einer Live-Datei File:Quit - Beenden der Anwendung Animation:Rotate Object - Rotieren des Objekts um Y-Achse Animation:Tilt Objekt - Rotieren des Objekts um X-Achse Animation:Rotate Camera - Rotieren der Kamera um Y Animation:Tilt Camera - Rotieren der Kamera um X Animation: Rotate Light - Rotieren der Beleuchtung um Y Animation: Tilt Light - Rotieren der Beleuchtung um X Geometry:Point Cloud - Wahl der Punktwolken-Darstellung Geometry:Wire Frame - Wahl der Drahtgitter-Darstellung Geometry:Solid - Wahl der Volumen-Darstellung Shading:Flat - Wahl einer flachen Schattierung Shading:Smooth - Wahl einer geglätteten Schattierung Color:Gray - Setze Farbe auf Grau Color:Red - Setze Farbe auf Rot etc. Color:Zippy - Setze Farbe auf Fleckenteppich Color:Ambient - Setze Oberflächeneigenschaft auf ambient Color:Diffuse - Setze Oberflächeneigenschaft auf diffus Color:Specular - Setze Oberflächeneigenschaft auf glänzend Textures:Open - Lade eine Textur für gewähltes Objekt Textures:Animate - Schalte die Animation der Texturen an/aus Textures:No texture - Entferne Textur vom aktuellen Objekt :[font = smalltext; inactive; endGroup] Mit dem File:Open-Menü lassen sich weitere Objekte zur Szene hinzufügen, die sodann unab- hängig voneinander manipuliert werden können. Es sei darauf hingewiesen, daß die Durchdring- ungen der Flächen automatisch gehandhabt werden. :[font = section; inactive; startGroup] Benutzung von Live mittels Dateien :[font = smalltext; inactive] "Live" läßt sich mit Dateien in verschiedener Weise benutzen : Am wichtigsten ist die Schnittstelle zu Mathematica mit der 3-Script-Datei. Nach Laden des Pakets ThreeScript.M durch Needs["Graphics`ThreeScript`"] kann man eine Darstellung von 3D-Graphiken in ein gewöhnliches Textfile ( *.TS ) schreiben. Dieses läßt sich direkt in Live einlesen. Ein weitere File-Typ ist das Textur-File ( *.RAS ), mit dem sich Texturen auf Graphiken abbilden lassen. :[font = subsection; inactive; pageBreak; startGroup] Erzeugung und Benutzung von 3-Script-Dateien ( *.ts ) :[font = input] Needs["Graphics`ThreeScript`"]; $ContextPath :[font = subsubsection; inactive; startGroup] Erzeugung einer Gaußschen Glocke :[font = input; preserveAspect; endGroup] bell = Plot3D[ Exp[-(x^2 + y^2)], {x,-2,2}, {y,-2,2}, PlotPoints -> 25, ColorFunction -> Hue, BoxRatios -> {1,1,1.3} ]; ThreeScript["bell.ts", bell] :[font = subsubsection; inactive; startGroup] Erzeugung von zwei Kugelflächen mit ParametricPlot3D :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] twoSpheres = ParametricPlot3D[{ {Sin[v] Cos[u], Sin[v] Sin[u], Cos[v], Hue[u/(2Pi)]}, {Sin[v] Cos[4u/3]/2, Sin[v] Sin[4u/3]/2, Cos[v]/2, Hue[0]} }, {u,0,3Pi/2}, {v,0,Pi}, Lighting->False ]; ThreeScript["spheres.ts", twoSpheres] :[font = smalltext; inactive; pageBreak] In das aktuelle Verzeichnis wurden zwei 3-Script-Files mit der jeweiligen Geometrie-Information geschrieben. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Directory[ ] actFile = FileNames["*.TS"] FileByteCount /@ ToString /@ actFile :[font = smalltext; inactive; endGroup] Nun läßt sich das Programm "Live" starten; über den Menüpunkt File:Open können die beiden 3-Script-Files "BELL.TS" und "SPHERES.TS" geladen werden. :[font = subsection; inactive; startGroup] Hinzufügen von Textur-Files ( *.ras ) :[font = smalltext; inactive; startGroup] Nachfolgende Beispiele beschäftigen sich mit der Erzeugung von Texturen. Dazu muß ein Binär-File erzeugt werden, wofür die Mathematica-Funktion "FromCharacterCode[...]" herangezogen wird. :[font = input; startGroup] ?FromCharacterCode :[font = print; output; inactive; endGroup] FromCharacterCode[n] gives a string consisting of the character with integer code n. FromCharacterCode[{n1, n2, ...}] gives a string consisting of the sequence of characters with codes ni. ;[o] FromCharacterCode[n] gives a string consisting of the character with integer code n. FromCharacterCode[{n1, n2, ...}] gives a string consisting of the sequence of characters with codes ni. :[font = smalltext; inactive; endGroup] (Weitere Einsichten über Binär-Files erhält man durch Untersuchung des Mathematica-Package "Utilities`BinaryFiles`".) Für die Erzeugung einfacher Texturen ist dies jedoch nicht erforderlich; die folgenden Beispiele dienen als Rezept : :[font = subsubsection; inactive; startGroup] Erzeugung einer Farbpalette mit Hue[x] :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] Zunächst müssen einige allgemeine Header-Informationen erzeugt werden, die in Form von acht 32 Bit-Integerzahlen abgelegt werden. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] In Mathematica kann man eine Liste von 32 Hexadezimal-Zahlen angeben. Jede Gruppe von 4 Zahlen repräsentiert eine 32 Bit-Integerzahl. Diese wichtigen Eintragungen nehmen Bezug auf die Anzahl n0 der Bilder in der Textur. Schlitz 3 (die Einträge 9-12 in der Liste) sollte 128 x n0 sein, während Schlitz 5 128 x 128 x n0 ergeben sollte. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] Im ersten Beispiel gibt es 128 = 80h oder16^^80 im letzten der 4 Byte Schlitze, und 16384= 64*256 oder 16^^40 im dritten der 4 Byte Schlitze in den Schlitzen 17-20 :[font = input; preserveAspect; startGroup] headerdata = {16^^59, 16^^a6, 16^^6a, 16^^95, 0, 0, 0, 16^^80, 0, 0, 0, 16^^80, 0, 0, 0, 16^^8, 0, 0, 16^^40, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0}; :[font = input; endGroup] Partition[headerdata,8]//ColumnForm :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Length[headerdata] :[font = smalltext; inactive] Als nächster Schritt wird eine Farbkarte erzeugt. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] huefunc[x_] := 255 Which[ x<1,x, x<3,1, x<4,4-x, True,0 ]; rgb[x_] := Floor[{ huefunc[Mod[x+2,6]], huefunc[x], huefunc[Mod[x-2,6]] }]; colormap = Flatten[Transpose[ Table[rgb[x], {x,0,6,6/255.0}] ]]; :[font = input] hp = Plot[huefunc[x], {x,0,6}, DisplayFunction->Identity]; SetOptions["stdout",PageWidth->70]; Table[ rgb[x], {x,0,6,.5}] :[font = smalltext; inactive; startGroup] Um sich zu überzeugen, wie diese Farbkarte aussieht, benutzt man die folgende Darstellung :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] RenderMap[x_List] := Module[{matrix}, matrix = Transpose[Partition[x,256]]/256; matrix = Partition[ Map[ Apply[RGBColor,#]&, matrix], 16]; Show[ Graphics[ RasterArray[matrix] ], AspectRatio -> 1]; ] :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] RenderMap[colormap] :[font = smalltext; inactive; endGroup] Als nächstes werden Daten erzeugt, die mittels der Farbpalette "colormap" in eine Farb- Darstellung umgesetzt werden. Man benutzt hierfür ein Feld von 128 x 128 Zufallswerten. (Die Feldgröße ist in der Version 1.5 von "Live" auf den Wert 128 x 128 festgelegt) :[font = subsubsection; inactive; preserveAspect; startGroup] Random Colormap :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] randomdata = Table[2*Ceiling[100*Random[]], {128}, {128}]//Flatten; :[font = smalltext; inactive] Weiter wird nun eine Funktion "RenderImage[...]" definiert, mit deren Hilfe das Feld mit den Zufalls- werten visualisiert werden kann. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] RenderImage[ image_, colormap_, opts___ ] := Module[ {bettermap,raster}, bettermap = Transpose[ Partition[colormap,256] ]/256; bettermap = Map[ Apply[ RGBColor,#]&, bettermap ]; raster = Partition[ bettermap[[image]], 128]; Show[ Graphics[ RasterArray[raster] ], opts ]; ] :[font = input; pageBreak; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Dimensions[randomdata] :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] RenderImage[ randomdata, colormap, AspectRatio -> Automatic ] :[font = smalltext; inactive] Sodann werden die Daten in ein File "random.ras" geschrieben, welches als Textur benutzt werden kann. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] outline = OpenWrite["random.ras"]; WriteString[outline, FromCharacterCode[headerdata] ]; WriteString[outline, FromCharacterCode[colormap] ]; WriteString[outline, FromCharacterCode[randomdata] ]; Close[outline] :[font = smalltext; inactive; endGroup; endGroup] Das File "random.ras" kann von "Live" eröffnet und für eine Textur benutzt werden. :[font = subsubsection; inactive; preserveAspect; startGroup] Fraktale Textur mit zyklischer Farbpalette :[font = smalltext; inactive] Als Textur wird im folgenden die Mandelbrot-Menge herangezogen. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] MandelbrotMap = Compile[{zr,zi,cr,ci}, Module[{cnt, nzr, temp, nzi}, nzr = zr; nzi = zi; For[ cnt = 0, (nzr^2 + nzi^2 < 10000) && (cnt < 100), cnt++, temp = nzr^2 - nzi^2 + cr; nzi = 2*nzr*nzi + ci; nzr = temp ]; cnt ] ]; :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] FractalM[ z0r_, z0i_, {{ReMin_,ReMax_}, {ImMin_,ImMax_}}, steps_ ] := Table[ MandelbrotMap[z0r, z0i, x, y], {y, ImMin, ImMax, (ImMax - ImMin)/steps}, {x, ReMin, ReMax, (ReMax - ReMin)/steps} ] :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] fractaldata = FractalM[ 0.0, 0.0, {{-3.0,1.0},{-1.0,1.0}}, 127]; picdata = 2*Flatten[ fractaldata ]; :[font = input; pageBreak; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] RenderImage[ picdata, colormap, AspectRatio -> .6]; :[font = smalltext; inactive] Für eine animierte Farbpalette von 17 Bildern, bei der die fraktale Textur auf die Oberfläche abgebildet wird und einen Farbzyklus durchläuft, müssen die Header-Daten entsprechend angepaßt werden. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] headerdata = {16^^59, 16^^a6, 16^^6a, 16^^95, 0, 0, 0, 16^^80, 0, 0, 8, 16^^80, 0, 0, 0, 16^^8, 0, 16^^4, 16^^40, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0}; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Partition[headerdata,8]//ColumnForm :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup; endGroup] outline = OpenWrite["glowfrac.ras"]; WriteString[outline, FromCharacterCode[headerdata]]; WriteString[outline, FromCharacterCode[colormap]]; WriteString[outline, FromCharacterCode[picdata]]; For[ i = 16, i < 260, i += 16, WriteString[outline, FromCharacterCode[ Mod[picdata+i,256] ]]; ] Close[outline] :[font = section; inactive; startGroup] Kopplung von Mathematica und Live über MathLink :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] "Live" unterstützt das MathLink-Protokoll in der Vers. 1.5 auch für die Mathematica/Windows-Version. Bislang wurde "Live" nur benutzt, um 3-Script-Files zu laden und den Oberflächen eine Textur zu überlagern. Das 3-Script-Protokoll fängt jedoch NICHT alle Informationen einer Graphik ein. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] "Live" benutzt auch den MathLink-Kommunikationsstandard für eine direkte Kommunikation mit Mathematica. Unter Benutzung von Mathematica werden 3D-Graphiken von Mathematica DIREKT an "Live" durchgereicht. Über MathLink wird dabei mehr Information in kürzerer Zeit an "Live" geschickt. Auch wird der Umfang der Objekte, die über MathLink an "Live" durchgereicht werden, im Rahmen der Weiterentwicklung von "Live" ständig erweitert. Künftige Versionen von "Live" werden MathLink benutzen, um eine komplette 2-Wege-Kommunikation mit dem Mathematica- Kern zu ermöglichen und damit eine alternative Benutzeroberfläche (FrontEnd) bereitzustellen. "Live" benötigt 4 MB RAM zusätzlich zu den Speicher-Anforderungen von Mathematica und des Mathematica-Kernes. :[font = subsubsection; inactive; startGroup] Starten von Live mit MathLink :[font = smalltext; inactive] Die Benutzung der MathLink-Schnittstelle ist sehr einfach, da die erforderlichen "Haken" bereits in "Live" implementiert sind. Erforderlich ist es jedoch, Mathematica den vollständigen Pfad der "Live"- Applikation mitzuteilen. Dieser Pfad wird der globalen Variablen $LivePath zugewiesen. Bei der vorliegenden Installation ist dies :[font = input; pageBreak; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] parDir = ParentDirectory[ ] :[font = output; output; inactive; endGroup] "C:\\M\\WINMATH\\LIVE" ;[o] C:\M\WINMATH\LIVE :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] $LivePath = parDir <> "\Live_fpu.exe" :[font = output; output; inactive; endGroup] "C:\\M\\WINMATH\\LIVE\\Live_fpu.exe" ;[o] C:\M\WINMATH\LIVE\Live_fpu.exe :[font = smalltext; inactive; startGroup] Damit kann die "Live"-Applikation automatisch aus Mathematica heraus geöffnet werden. Dem Link wird dabei der Name "live" zugewiesen. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] live = LinkOpen[$LivePath, LinkMode -> Launch]; :[font = smalltext; inactive] Das Programm "Live" wird hiermit gestartet, bleibt jedoch im Hintergrund. Da die Programme "Live" und Mathematica verschiedene Konzepte über Farbpaletten haben, können seltsame Farbeffekte vorkommen, wenn Graphiken über MathLink durchgereicht werden. :[font = smalltext; inactive; startGroup] Nun kann eine Graphik z.B. mit "Plot3D" oder auch mit "ParametricPlot3D" von Mathematica erzeugt werden. Mit dem Kommando "LinkWrite[...]" wird das Graphik-Objekt über MathLink durchgereicht, wobei die Variable "live" die Kopplung bezeichnet. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] LinkWrite[live, bell] LinkWrite[live, twoSpheres ] :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Sobald der Plot im "Live"-Fenster erscheint, wird dieses in den Vordergrund gebracht. Die Farb- palette ist gegenüber Mathematica verfälscht. Weitere Geometrie-Files können nachgeladen werden. Die Objekte sind unabhängig voneinander und können separat manipuliert werden. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] Die Verbindung kann von Mathematica durch das folgende Kommando geschlossen werden : :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] LinkClose[live] :[font = smalltext; inactive; endGroup] "Live" bleibt jedoch weiterhin geöffnet, sodaß z.B. die Datei-Schnittstelle, wie zuvor beschrieben, weiter benutzt werden kann. Will man "Live" über MathLink zu einem späteren Zeitpunkt erneut benutzen, so muß zunächst "Live" geschlossen werden, bevor es erneut aus Mathematica heraus gestartet werden kann. :[font = subsubsection; inactive; startGroup] Alternativ direkt über DisplayFunction :[font = smalltext; inactive] Es existiert noch eine weitere einfachere Möglichkeit einer direkten Einbindung von "Live" in Mathematica vorzunehmen, wenn man die Option "DisplayFunction" zusammen mit einer ge- eigneten reinen Funktion " LinkWrite[live, #] & " heranzieht. Dann genügt es, eine Mathematica- Sitzung mit den folgenden "Live"-spezifischen Kommandos zu starten : :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] $LivePath = "c:\M\WinMath\Live\Live_fpu.exe" ; live = LinkOpen[$LivePath, LinkMode -> Launch]; :[font = smalltext; inactive] Die reine Funktion "LiveWrt" wird der Option "DisplayFunction" zugewiesen. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] LiveWrt = LinkWrite[live, #]& ; :[font = smalltext; inactive] Um nun eine Funktion direkt im "Live"-Fenster darzustellen, genügt die Umleitung der Graphik- Ausgabe durch die Option "DisplayFunction -> LiveWrt". :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Die Initialisierung von "Live" läßt sich zusammenfassen in "LiveOpn", womit sich anschließende "Live"-Applikationen kompakter schreiben lassen. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] LiveOpn := ( $LivePath = "c:\M\WinMath\Live\Live_fpu.exe" ; live = LinkOpen[$LivePath, LinkMode -> Launch]; LiveWrt = LinkWrite[live, #]& ; ) LiveCls := LinkClose[live] :[font = subsubsection; inactive; startGroup] Visualisierung einer algebraischen Fläche 4. Ordnung :[font = smalltext; inactive] Im folgenden Beispiel wird eine algebraische Fläche 4. Ordnung, welche insbesondere eine Regelfläche ist, :[font = special2; inactive] F(x,y,z) = y² (x² + y² - a²) - x²z² + 2axyz = 0 :[font = smalltext; inactive] mit "Live" visualisiert. Obgleich eine parametrisierte Form in Polarkoordinaten für diese sog. Krames-Fläche bekannt ist, nämlich {x,y,z} = { r cos(t), r sin(t), (a - r) tan(t) }, wird die Berechnung anhand der impliziten Form F(x,y,z) = 0 mit der Prozedur " ContourPlot3D" durch- geführt. :[font = input; pageBreak; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Needs["Graphics`ContourPlot3D`"] f[x_,y_,z_] := y^2 (x^2+y^2-a^2) - x^2 z^2 + 2 a x y z; a = 1; :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup; endGroup] LiveOpn ContourPlot3D[ f[x, y, z], {x,-5,5},{y,-5,5},{z,-5,5}, Contours -> {0.}, PlotPoints->{5,5}, Axes->True, Ticks->Automatic, DisplayFunction -> LiveWrt ]; LiveCls :[font = subsection; inactive; startGroup] Einlesen von Daten-Files :[font = smalltext; inactive] Es ist sehr einfach, Daten-Files in Mathematica einzulesen und die Daten mit "Live" zu visualisieren. In der nachfolgenden Diskussion werden verschiedene File-Typen untersucht und zwar (i) ASCII-Files, wobei Gleitkomma-Zahlen satzweise mit Leerzeichen/Tabulatoren/Kommata als Separator abgelegt sind, und (ii) Binär-Files. :[font = subsubsection; inactive; startGroup] Daten-Files mit Leerzeichen als Separator :[font = smalltext; inactive] Das Daten-File "dataOne.txt" im (aktuellen) Unterverzeichnis C:\M\WinMath\Live\NoteBks ent- hält insgesamt 16 Gleitkomma-Zahlen, welche in Form einer 4x4 Tabelle abgelegt sind. :[font = input; startGroup] !!DataOne.txt :[font = print; output; inactive; endGroup] 1 1.023 2 3 1.5 1.6 2.1 3.1 2 2.5 2.5 4 2.1234 2.5678 2.7 4.000001 ;[o] 1 1.023 2 3 1.5 1.6 2.1 3.1 2 2.5 2.5 4 2.1234 2.5678 2.7 4.000001 :[font = smalltext; inactive] Die einfachste Art, diese Daten durch Mathematica einzulesen, erfolgt über das Kommando "ReadList", wobei der Datentyp "Real" ist. :[font = input] data1 = ReadList["DataOne.txt", Real] :[font = smalltext; inactive] Bei dieser Vorgehensweise geht die Struktur der Daten verloren. Mit "Partition[ data1, 4]" läßt sich eine Reorganisation der Daten erreichen. Einfacher ist es jedoch, von Mathematica die Struktur des Files herausfinden zu lassen unter der Annahme, daß jede Zeile einem neuen Datensatz (Record) entspricht. :[font = input] data2 = ReadList["DataOne.txt", Real, RecordLists -> True ] :[font = smalltext; inactive] Dies ist dann richtig, wenn jede Datenzeile einer eigenen Subliste entspricht. Wenn jedoch der Datensatz länger als eine Zeile ist, muß z.B. unter Zuhilfenahme des Kommandos "Table" die geeignete Listenstruktur aufgezwungen werden. Es läßt sich damit aber auch eine andere Organi- sation der Daten, z.B. die Zusammenfassung der Daten zu Wertepaaren, erreichen. :[font = input] data3 = ReadList["dataone.txt", Table[Real, {2}] ] :[font = smalltext; inactive; startGroup] Die Daten werden sodann an "ListPlot3D" übergeben und mit "Live" dargestellt. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup] LiveOpn ListPlot3D[ data2, DisplayFunction -> LiveWrt ] LiveCls :[font = subsubsection; inactive; pageBreak; startGroup] Daten-Files mit Kommas als Separator :[font = smalltext; inactive] In manchen Programmen, wie z.B. in Spreadsheets, werden einzelne Daten durch Tabulatoren als Feldseparatoren getrennt. Dieses Format bereitet für "ReadList" selbst keine Probleme, da Tabulatoren von "ReadList" wie ein oder mehrere Leerzeichen behandelt werden. Wenn jedoch die Werte durch Kommas getrennt sind, sind besondere Vorkehrungen erforderlich. :[font = input; startGroup] !!Comma.csv :[font = print; output; inactive; endGroup] 1.2E2, 3.4E2, 433 67.45466E1, 0.003456E5, 12353E-2 123, 456, 789 ;[o] 1.2E2, 3.4E2, 433 67.45466E1, 0.003456E5, 12353E-2 123, 456, 789 :[font = smalltext; inactive] Um dieses File zu lesen, muß man Mathematica mitteilen, daß die einzelnen Datensätze ent- weder durch Kommas oder durch einen Zeilenvorschub " \n " getrennt sind. :[font = input] data4 = Partition[ Flatten[ ReadList["Comma.csv", Real, RecordLists -> True, RecordSeparators -> {"\n", ","}] ],3] :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Mit "Flatten" werden die trivialen Listen der Länge 1 entfernt und durch "Partition[data, 3]" die Daten als Zahlentripel angeordnet. :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] Die Daten werden wiederum an "ListPlot3D" übergeben und in "Live" dargestellt. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup] LiveOpn ListPlot3D[ data4, DisplayFunction -> LiveWrt ] LiveClse :[font = subsubsection; inactive; startGroup] Binäre Daten-Files :[font = smalltext; inactive] Mit Mathematica lassen sich anstelle von ASCII-Files auch Binär-Files benutzen. Die erforder- lichen Werkzeuge stehen im Package "Utilities`BinaryFiles`" zur Verfügung. :[font = input] Needs["Utilities`BinaryFiles`"] :[font = smalltext; inactive] Damit steht eine Variante von "ReadList" zur Verfügung, die zum Lesen binärer Daten benutzt werden kann. :[font = input; startGroup] ?ReadListBinary :[font = print; output; inactive; endGroup] ReadListBinary["filename",type] reads a list of the binary types from the file, until the end of the file is reached. ReadListBinary["filename",type,{n}] reads n elements of the named type. Type can be a list of binary types, or more complex structures (as in ReadBinary.) ReadListBinary[stream, type] reads from the current point in an open stream to the end of the stream. ;[o] ReadListBinary["filename",type] reads a list of the binary types from the file, until the end of the file is reached. ReadListBinary["filename",type,{n}] reads n elements of the named type. Type can be a list of binary types, or more complex structures (as in ReadBinary.) ReadListBinary[stream, type] reads from the current point in an open stream to the end of the stream. :[font = smalltext; inactive] Das folgende Binär-File "Data.bin" enthält Zahlentripel, wobei die jeweils ersten und dritten Zahlen 2-Byte Integerzahlen sind, welche in die Mathematica-Kategorie "Int16" fallen, während die mittlere Zahl eine 8-Byte Realzahl ist, die von Mathematica als "Double" kategorisiert wird. :[font = input] data5 = ReadListBinary["Data.bin", {Int16,Double,Int16} ] :[font = smalltext; inactive; startGroup] Nachdem dieser ziemlich bizarre Datensatz abgehandelt wurde, lassen sich die Daten entweder mit "ScatterPlot3D" oder durch das graphische Primitiv "Graphics3D[pointList]" darstellen und an "Live" durchreichen. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup; endGroup] LiveOpn Show[ Graphics3D[ Map[Point, data5] ], DisplayFunction -> LiveWrt ] LiveCls :[font = subsection; inactive; startGroup] Export von Live Graphiken :[font = smalltext; inactive; endGroup] Obgleich "Live" in erster Linie als Visualisierungs-Werkzeug für den Bildschirm entworfen wurde, ist es jedoch einfach, Graphiken aus "Live" zu exportieren, indem man die vom jeweiligen Windows- System bereitstehenden Bildeinfang-Techniken nutzt. Unter MS-Windows, bei aktiven "Live"-Fenster, benutzt man die Tastensequenz Alt-PrintScreen (bzw. Alt-SAbf), um das "Live"-Fenster in die Zwischenablage von Windows zu bringen. Der Inhalt der Zwischenablage läßt sich sodann in jedes Graphik-Programm, welches das Clipboard-Format unterstützt, kleben. In ein Mathematica-Notebook läßt sich mit der Menü-Option Edit:Paste der Inhalt der Zwischenablage einfügen. (Ein Problem ist noch die richtige Wahl der Graustufen !) :[font = section; inactive; pageBreak; startGroup] Live Graphik-Workshop :[font = smalltext; inactive] Die folgenden Beispiele aus dem Notebook "WorkShop.MA" sollen dazu dienen, das Programm "Live" zu testen. Die Beispiele beinhalten zwei Minimalflächen, Knoten sowie eine "pathologische" Funktion. :[font = subsection; inactive; preserveAspect; startGroup] Minimal-Flächen :[font = smalltext; inactive] Minimalflächen sind, Seifenhäutchen vergleichbar, Flächen mit der kleinsten Fläche unter all jenen, die vorgegebenen Randbedingungen genügen (so wie die Berandung einer Seifenblase von der Form des Drahtrahmens abhängt, der in die Seifenlauge eingetaucht wird). Lokal lassen sich alle derartigen Flächen durch eine Funktion f(w) einer komplexen Variablen w = u + iv parametrisieren. Die Koordinaten der Minimalfläche hängen dann parametrisch ab von den Variablen u und v. :[font = subsubsection; inactive; startGroup] Kartesische Koordinaten-Darstellung :[font = special2; inactive] x(u,v) = Re[(w²-1) f ''(w) -2wf '(w) + 2f(w)] y(u,v) = Re[i{(w²+1) f ''(w) -2wf '(w) + 2f(w)}] z(u,v) = Re[ 2w f ''(w) -2wf '(w)] :[font = smalltext; inactive] Mit Mathematica läßt sich sodann geradewegs die Gleichung für die parametrisierte Minimal- fläche ausarbeiten. Das folgende Modul definiert eine Funktion " MiniCartPlot[f, {a,b}, {c,d}, n] " in kartesischen Koordinaten, wobei f(w) eine komplexwertige Funktion von w ist. {a,b} bzw. {c,d} geben die Definitionsbereiche von u und v an. Der optionale Parameter n gibt die Anzahl der Plotpunkte an. :[font = input; preserveAspect; endGroup] MiniCartPlot[f_, {a_,b_}, {c_,d_}, n_:15, opts___ ] := Module[{x, y, z, u, v, compPoint, paraCompPoint, realPoint}, x[w_] := (w^2 - 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f; y[w_] := I ((w^2 + 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f); z[w_] := 2 w D[f, {w, 2}] - 2D[f, w]; compPoint = {x[w], y[w], z[w]}//Evaluate; paraCompPoint = compPoint /. w -> u + I v; realPoint[u_, v_] = Expand[ComplexExpand[Re[paraCompPoint]]]; ParametricPlot3D[ realPoint[u,v]//Evaluate, {u,a,b},{v,c,d}, PlotPoints -> n, Axes -> False, DisplayFunction -> LiveWrt, opts ]; ] :[font = subsubsection; inactive; startGroup] Enneper-Fläche :[font = smalltext; inactive] Wählt man f(w) = w ³ , so resultiert die Enneper-Fläche, deren kartesische Koordinaten lauten: :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] f = w^3 ; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] x[w_] := (w^2 - 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f; y[w_] := I ((w^2 + 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f); z[w_] := 2 w D[f, {w, 2}] - 2D[f, w]; paraCompPoint = Evaluate[{x[w], y[w], z[w]}] /. w -> (u + I v); realPoint[u_, v_] = Expand[ ComplexExpand[ Re[ paraCompPoint ] ]]; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] realPoint[u,v] :[font = smalltext; inactive] Die MathLink-Verbindung wird aufgebaut und die 3D-Graphik von "ParametricPlot3D" direkt an "Live" weitergereicht. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] LiveOpn Enneper = MiniCartPlot[ w^3, {-4,4}, {-4,4}, 25] LiveCls :[font = subsubsection; inactive; pageBreak; startGroup] Polarkoordinaten-Darstellung :[font = smalltext; inactive; preserveAspect] Manchmal ist es zweckmäßiger, anstelle kartesischer Koordinaten {x(u,v), y(u,v), z(u,v) } Polarkoordinaten zu benutzen, wie im folgenden Beispiel :[font = input; preserveAspect; endGroup] MiniPolarPlot[f_, {a_, b_}, {c_, d_}, n_:15, opts___ ] := Module[{x, y, z, u, v, compPoint, paraCompPoint, realPoint}, x[w_] := (w^2 - 1) D[f, {w, 2}] - 2 w D[f, w] + 2f; y[w_] := I ((w^2 + 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f); z[w_] := 2 w D[f, {w, 2}] - 2D[f, w]; compPoint = {x[w], y[w],z[w]}//Evaluate; paraCompPoint = compPoint /. w -> Exp[u + I v]; realPoint[u_, v_] = Expand[ComplexExpand[Re[paraCompPoint]]]; ParametricPlot3D[ realPoint[u, v]//Evaluate, {u,a,b},{v,c,d}, PlotPoints -> n, Axes -> False, DisplayFunction -> LiveWrt, opts ] ] :[font = subsubsection; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] Katenoid-Fläche :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Wählt man f(w) = w log(w) , so resultiert die Katenoid-Fläche mit den Polar-Koordinaten :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; startGroup] f = w Log[w] ; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] x[w_] := (w^2 - 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f; y[w_] := I ((w^2 + 1) D[f, {w, 2}] - 2 w D[f, w] + 2 f); z[w_] := 2 w D[f, {w, 2}] - 2D[f, w]; paraCompPoint = Evaluate[{x[w], y[w], z[w]}] /. w -> Exp[u + I v]; realPoint[u_, v_] = Expand[ ComplexExpand[ Re[ paraCompPoint ] ]]; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] realPoint[u,v] :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Die MathLink-Verbindung wird aufgebaut und die Graphik von "ParametricPlot3D" direkt an "Live" weitergereicht. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup; endGroup] LiveOpn Catenoid = MiniPolarPlot[ w*Log[w], {-2,2}, {0,2Pi}, 25] LiveCls :[font = subsection; inactive; preserveAspect; startGroup] Knoten :[font = smalltext; inactive] Die Erzeugung verschiedener Typen von Knoten ist im Mathematica-Notebuch "Knots.ma" aus- führlich beschrieben. Unter Zuhilfenahme der dort definierten Funktion "tube[...]" wird ein (2,5)-Knoten erzeugt. :[font = subsubsection; inactive; preserveAspect; startGroup] Definition von tube[...] :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Off[General::spell1] tube::usage = "tube[function, {t, tmin, tmax, tnum}, circnum, radius, options] generates a tube with given radius about the curve defined by the given function of t. The mesh of the tube has circum vertices in the meridian direction and tnum vertices in the longitudinal direction."; Unitize[a_] := N[a / Sqrt[a.a]] Angle[A_List, B_List] := ArcCos[Unitize[A] . Unitize[B]] :[font = input; pageBreak; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] Cross[v1_?VectorQ, v2_?VectorQ] := Module[ {m = Minors[{v1,v2},2][[1]]}, {m[[3]], -m[[2]], m[[1]]} ] /; Length[v1]==Length[v2]==3 MakePolygons[vl_List] := Block[{l = vl, l1 = Map[RotateLeft, vl], numesh}, numesh = {l, RotateLeft[l], RotateLeft[l1], l1}; numesh = Map[Drop[#, -1]&, numesh, {1}]; numesh = Map[Drop[#, -1]&, numesh, {2}]; Polygon /@ Transpose[ Map[Flatten[#, 1]&, numesh] ] ] tube[function_, {t_, tmin_, tmax_, tnum_}, cnum_, radius_, options___] := Block[ {tpoints, npoints, gvec = N[(1/Sqrt[3]) {1.0, 1.0, 1.0}], vpoints, xpoints, error, scpoints, mesh}, tpoints = Table[N[function], {t,tmin,tmax,(tmax-tmin)/tnum}]; If[ closed, tpoints[[-1]] = tpoints[[1]]]; npoints = Map[Unitize, Table[Evaluate[D[function, t]], {t,tmin,tmax,(tmax - tmin)/tnum}]//N ]; If[closed, npoints[[-1]] = npoints[[1]]]; vpoints = Map[Unitize, Map[(gvec -= (gvec . #) #)&, npoints]]; xpoints = Map[Unitize, Map[Apply[Cross, #]&, Transpose[{npoints, vpoints}] ]]; error = Angle[vpoints[[1]], vpoints[[-1]]]; Do[ {vpoints[[i]], xpoints[[i]]} = N[ ( {{#1,#2},{-#2,#1}} . {vpoints[[i]], xpoints[[i]]} )& [Cos[error(i-1)/tnum], Sin[error(i-1)/tnum]] ], {i,1,tnum+1} ]; If[ closed, vpoints[[-1]] = vpoints[[1]]; xpoints[[-1]] = xpoints[[1]] ]; scpoints = Table[ N[{Cos[t], Sin[t]} radius], {t,0,2Pi,2Pi/cnum}]; mesh = Table[ tpoints[[i]] + scpoints[[j]] . {vpoints[[i]],xpoints[[i]]}, {j,1,cnum+1}, {i,1,tnum+1} ]; shape = MakePolygons[mesh] //Graphics3D ] Options[tube] = {closed->True}; On[General::spell1] :[font = smalltext; inactive; preserveAspect] Ein (p,q)-Knoten, der sich p-mal um den Meridian und q-mal der Länge nach um einen Torus windet, wird definiert durch :[font = input; preserveAspect] plotknot[p_, q_, col_:.5] := Show[ tube[ { Cos[t] (1+.5 Cos[(q/p) t]), Sin[t] (1+.5 Cos[(q/p) t]), .5 Sin[(q/p) t] }, {t,0,2Pi p,50}, 8, .1], ViewPoint -> {0, 0, 1}, Boxed -> False, LightSources -> {{{0,0,1}, RGB[col,1-col,col/2]}}, DisplayFunction -> LiveWrt ]; :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] LiveOpn myKnot = plotknot[2, 5] LiveCls :[font = subsection; inactive; pageBreak; startGroup] "Pathologische" Funktionen :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] In der Analysis interessiert man sich oftmals für pathFunktionen, die versagen, gewissen Bedingungen wie die der Stetigkeit und Differenzierbarkeit in isolierten Punkten zu genügen. :[font = subsubsection; inactive; startGroup] In (0,0) diskontinuierliche Funktion :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Im folgenden Beispiel wird das Plücker-Konoid, eine im Ursprung diskontinuierliche Funktion :[font = special2; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] 2xy/(x²+y²) sonst z(x,y) = { 0 in (0,0) :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] geplottet. Die Funktion ist definiert als z(0,0) = 0 , ansonsten durch 2xy/(x²+y²). Es empfiehlt sich, für die Darstellung Polarkoordinaten zu verwenden, um eine hinreichend glatte Oberfläche zu erzeugen. Für den Plot selbst wird die folgende Form von z(r,t) mit einem Schwelle von r < .00001 gewählt. Der erzeugte parametrische Plot wird an "Live" durchgereicht. :[font = input; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768; endGroup] LiveOpn z[r_, t_] := Which[ r <= .00001, 0, True, Sin[2t] ]; ParametricPlot3D[ {r Cos[t], r Sin[t], z[r,t]}, {r,0,Sqrt[2]}, {t,0,2Pi}, PlotPoints -> {25,40}, BoxRatios -> {1,1,1}, DisplayFunction -> LiveWrt ] LiveCls :[font = subsubsection; inactive; preserveAspect; startGroup] In (0,0) nicht-differenzierbare Funktion :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] Die folgende Funktion :[font = special2; inactive] x³ /(x²+y²) sonst f(x,y) = { 0 in (0,0) :[font = smalltext; inactive; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] hat die Eigenschaft, daß sie im Ursprung nicht differenziebar ist, doch existieren die jeweiligen partiellen Ableitungen dort. Ferner ist f(x,y) differenzierbar entlang jeder Linie durch den Ursprung ist. :[font = input; preserveAspect; backColorRed = 32768; backColorGreen = 32768; backColorBlue = 32768] LiveOpn W[r_, t_] := Which[ r <= .0001, 0, True, r Cos[t]^3 ]; ParametricPlot3D[ {r Cos[t], r Sin[t], W[r,t]}, {r,0,3},{t,0,2Pi}, PlotPoints -> {30,40}, DisplayFunction -> LiveWrt ]; LiveCls :[font = smalltext; inactive; endGroup; endGroup; endGroup] Schickt man das Ergebnis an "Live", so wird durch eine geeignete Ausrichtung der Orientierung der Fläche offensichtlich, daß die Fläche KEINE Tangential-Ebene im Ursprung besitzt, trotz der Tatsache, daß die Fläche linear entlang jeder Linie durch den Ursprung zu sein scheint. ^*)