DMUG-Archiv 2006

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: 3D Niveaulinien

Hallo zusammen,
danke für die Tipps, insbesondere der Shift mit dem Gradienten verbessert die Darstellung sehr.
Das Buch von M. Trott muß ich mir erst beschaffen. Schau mer mal.

Mit freundlichen Gruessen / Best Regards
Prof. Dr.-Ing. Reinhard Schlosser

Fachhochschule Deggendorf
Fachbereich Elektrotechnik und Medientechnik
Edlmairstrasse 6 + 8
94469 Deggendorf
Tel 0991-3615-515
Fax 0991-3615-599
reinhard.schlosser@XXXXXXX.de
http://www.fh-deggendorf.de



Udo und Susanne Krause schrieb:

Hallo zusammen,

ImplicitPlot[] kennt 2 Herangehensweisen, die eine basiert auf Solve[]
und ist daher für polynomiale Ausdrücke vorzuziehen, die andere
betrachtet den Ausdruck als Funktion in 3D (R^2 -> R). Die Methodenwahl
geschieht über die Angabe des Definitionsbereiches (für x allein oder
für x und y), genaueres führt die Hilfe aus. Verwendet man wie gestern
auch schon die zweite Methode und nutzt den Gradienten (dessen Existenz
hier vorausgesetzt wird), um die Niveaulinien etwas vor die Front zu
schieben,

In[1]:=
Needs["Graphics`ImplicitPlot`"];
Off[RuleDelayed::rhs]
Clear[schlosserLevelsHomeMade];
schlosserLevelsHomeMade[f_, x_, y_, xMin_, xMax_, yMin_, yMax_, z_List,
opts___] :=
(* expecting f as f[x, y] in {xMin, xMax} x {yMin, yMax}; want to plot
levels at values from z in the list *)
Module[{lines, grad, g3D, shift = 10^(-3)},
      If[FreeQ[f, x] || FreeQ[f, y],
        Print["Function f independent from x,y."];
        Return[$Failed]
      ];
      grad[x_, y_] = shift {D[f, x], D[f, y], 0};
      g3D = Plot3D[f, {x, xMin, xMax}, {y, yMin, yMax}, opts,
        Mesh -> False, DisplayFunction -> Identity];
      lines = {};
      (* ugly, i.e. procedural *)
      For[o = 1, o <= Length[z], o++,
lines = Append[lines, Part[First[Graphics[ImplicitPlot[f == z[[o]],
               {x, xMin, xMax}, {y, yMin, yMax},
DisplayFunction -> Identity, opts]]], All, 3] /. {p_?NumberQ,
q_?NumberQ} -> {p, q, z[[o]]} - grad[p, q]
        ]
      ];
      Show[{g3D, Graphics3D[lines]}, DisplayFunction -> $DisplayFunction]
] /;  Length[z] > 0;
On[RuleDelayed::rhs]

dann ist das Ergebnis gar nicht so schlecht zum Experimentieren.

In[10]:=
schlosserLevelsHomeMade[(x^2 + 3 y^2) Exp[1 - x^2 - y^2], x, y, -Pi, Pi,
-Pi, Pi, Range[0.1, 3, 0.1], PlotPoints -> 123]

je kleiner der Gradient, umsomehr verdecken die stückweise ebenen
Polygone wieder die Niveaulinien und die Katze beisst sich in den
Schwanz. Muss sie aber nicht: Man bekommt es korrekt und direkt hin,
wenn man die Polygone von Plot3D an den z-Niveaus zerlegt und auf
ImplicitPlot[] und gradient shifts verzichtet. Dies behandelt M. Trott
im  Mma GuideBook for Graphics, Contour und Density Plots, Aufgabe 13, p
1207, die Lösung ist p 1270 ff, besonders die Funktion ContouredPlot auf
p 1274 mit dem Beispiel auf p 1277 sollte Sie fesseln können.

Gruss
Udo.


Stefan Welke wrote:

Die wesentliche Einschränkung bei Verwendung von "ImplicitPlot" ist, dass diese Funktion nur für algebraische Funktionen wirklich gut arbeitet. Mit dem von Ihnen gewünschten Beispiel klappt es nur mäßig.




------------------------------------------------------------------------



Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html