DMUG-Archiv 2006

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

Re[2]: 3D Niveaulinien

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.


JPEG image

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

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