Verfasst am: 09.08.2012, 22:04
Titel: Fläche und Ebene in einem Plot (Tangentialebene)
Hallo,
ich habe eine Fläche r=r(u,v) in Parameterdarstellung gegeben und mit Matlab die Tangentialebene berechnet. Müsste mathematisch richtig sein.
Die Tangentialebene habe ich für einen bestimmten Punkt P=P(u,v) berechnet und dann möchte ich sowohl die Fläche, den Punkt als auch die Tangentialebene in einem Plot darstellen.
Leider bekomme ich nicht alles zusammen in einen Plot bzw. es sieht komisch aus und wird nicht richtig dargestellt. Die Fläche und die Ebene einzeln kann ich plotten, beides zusammen sieht sehr komisch aus: die Ebene wird nur als Strich dargestellt und die Fläche ist "gestaucht" und nur noch in der Farbe Rot. Plottet man sie einzeln, ist sie bunt und nicht gestaucht.
Die Tangentialebene wird aufgestellt durch die Parametergleichung:
E=(Aufpunkt P)+r*tu+s*tv, wobei "tu" und "tv" die Tangentenvektoren sind. "r" und "s" sind skalare. Die Ebene wird also durch die beiden Vektoren tu und tv aufgespannt im Punkt P.
% Partielle Ableitungen nach "u"
tu_x=diff(x,u);
tu_y=diff(y,u);
tu_z=diff(z,u);
% Partielle Ableitungen nach "v"
tv_x=diff(x,v);
tv_y=diff(y,v);
tv_z=diff(z,v);
% Eingabe von Werten für a,b und u,v
a=1;
b=1;
u=pi;
v=pi;
% Berechnung des Punktes, in dem die Tangentialeben liegt
P=[subs(x); subs(y); subs(z)];
% Berechnung der Tangentenvektoren
tu=[subs(tu_x); subs(tu_y); subs(tu_z)]
tv=[subs(tv_x); subs(tv_y); subs(tv_z)]
% Plot der Ebene (Parameterform)
r=0:0.5:10;
s=0:0.5:10;
[R,S]=meshgrid(r,s);
c=P(1,1)+R*tu(1,1)+S*tv(1,1);
d=P(2,1)+R*tu(2,1)+S*tv(2,1);
e=P(3,1)+R*tu(3,1)+S*tv(3,1);
surf(c,d,e) hold on
Vielleicht weiß jemand, wir ich alles schön darstellen kann?
Die Tangentialebene müsste sich im Punkt P an die Fläche anschmiegen (tangential berühren).
ZUsatzfrage: Wieso wird mein Punkt Q (entspricht P) im plot dreimal dargestellt? Es ist ja nur ein Punkt.
Vielen Dank für die Antworten!
Das mit dem Punkt werde ich gleich mal ausprobieren.
Weißt du wieso die Darstellung der Ebene in der Parameterform nicht funktioniert?
Ich habe es nicht geschafft die Tangentialebene in einem Rutsch in Koordinatenform darzustellen.
Die allgemeine Gleichung der Tangentialebene ist:
(tu x tv) * (r - r_0)=0 (alles Vektoren)
wobei man für den Vektor "r" einfach die Buchstaben x,y und z setzt und das ganze dann nach z auflöst. "r" ist der Punkt auf der Ebene, den man berechnen kann für u,v . Dann hat man die Ebene in der Form z=.....
Wobei man nicht immer ein z hat, je nachdem welche Werte man für u,v einsetzt (hatte es mal nachgerechnet).
Weißt du zufällig, wie ich die Koordinatenform der Ebene hier erhalten und darstellen kann?
ich hatte es probiert mit einem Code wie ungefähr diesem:
Ganz kurz der Tipp: Hessesche Normalform (tu x tv) * (r - r_0)=0 nach z (3. Koordinate) auflösen.
Im Folgenden alles Spaltenvektoren:
n= (tu x tv) => -n(3)*z=n(1)*x + n(2)*y - n'*r_0 und dann noch durch -n(3) teilen. Nun x und y eingesetzt und x,y,z an surf übergeben.
Bist du sicher, dass deine Umformung n*(r - r_0) = n*r - n*r_0 (alles Vektoren) erlaubt ist? FInde dazu keine Multiplikationsregel für Vektoren
edit:
man kann die Gleichung ja auch anders ausmultiplizieren und nach z auflösen.
Allerdings läuft das ganze auf eine Fallunterscheidung hinaus. Denn wenn n(3) Null ist, gibt es ein Problem bei der Division durch n(3).
Das heißt, wenn n(3) null ist, müsste man z.B. nach x auflösen und dann durch eine andere Komponente dividieren, sofern diese nicht Null ist. Ist diese Komponente auch Null, müsste man die Gleichung nach y auflösen und wieder durch eine andere Komponente von n dividieren.
Mathematisch ist es doch korrekt eine Ebene in den Formen z=...., x=..... oder y=.... darzustellen oder?
Für das Skalarprodukt gilt das Distributivgesetz. Du benötigst keine Fallunterscheidung. Du kannst x,y,-n(3)*z an surf übergeben. Der Fall n(3)=0 führt dann (automatisch) zu einer xy-Ebene.
sorry, aber ich habe von Matlab noch nicht so viel Ahnung.
Habe ich das mit dem surfbefehl richtig umgesetzt?
Code:
% Berechnung des Punktes, in dem die Tangentialeben liegt
P=[subs(x); subs(y); subs(z)];
% Berechnung des Normalenvektors
normv=cross(tu,tv);
r=0:0.01:1; % Enspricht dem bisherigen x in diesem Tread
s=0:0.01:1; % Entspricht dem bisherigen y in diesem Tread [R,S]=meshgrid(r,s);
(-1)*normv(3,1)*W=normv(1,1)*R+normv(2,1)*S-dot(normv,P) surf((-1)*normv(3,1)*W) hold on
Allerdings scheint hier nicht alles richtig zu sein, die Ebene wird falsch dargestellt.
Hier mal ein Ausschnitt aus dem Plott mit der eigentlichen Fläche(gelb), der Tangentialebene (grün) und den beiden Vektoren tu und tv (jeweils blau):
Man erkennt, dass die Ebene nicht durch die beiden Vektoren aufgespannt wird, sie liegt senkrecht zu einem der Vektoren. Somit liegt sie auch nicht tagential an der gelben Fläche an.
Wodran kann das liegen?
Hier der gesamte Code. Die beiden Vektoren tu und tv wurden auf die Länge 1 normiert und geplottet.
% Partielle Ableitungen nach "u"
tu_x=diff(x,u);
tu_y=diff(y,u);
tu_z=diff(z,u);
% Partielle Ableitungen nach "v"
tv_x=diff(x,v);
tv_y=diff(y,v);
tv_z=diff(z,v);
% Eingabe von Werten für a,b und u,v
a=1;
b=1;
u=0;
v=0;
% Berechnung des Punktes, in dem die Tangentialebene liegt
r_0=[subs(x)subs(y)subs(z)]';
% Berechnung der Tangentenvektoren
tu=[subs(tu_x)subs(tu_y)subs(tu_z)]';
tv=[subs(tv_x)subs(tv_y)subs(tv_z)]';
% Berechnung des Normalenvektors
normv=cross(tu,tv);
% Intervalle der Ebene, I1 und I2
xE=linspace(-2,2,20);
yE=linspace(-2,2,20);
% Kartesiches Produkt der Intervalle I1 und I2 [KxE, KyE]=meshgrid(xE,yE);
% Darstellung der Ebene
zT=normv(1)*KxE + normv(2)*KyE- normv'*r_0;
Ebene=surf(KxE, KyE, -normv(3)*zT);
set(Ebene,'FaceLighting','phong','FaceColor',[010],...
'AmbientStrength',1.0,'edgecolor','none','FaceAlpha',1.0) hold on
% Darstellund der Fläche
m=-pi:0.1:pi;
n=-pi:0.1:pi;
[M,N]=meshgrid(m,n);
g=exp(b*M).*cos(M)+exp(a*M).*cos(N).*cos(M);
h=exp(b*M).*sin(M)+exp(a*M).*cos(N).*sin(M);
i=exp(a*M).*sin(N);
Flaeche=surf(g,h,i);
set(Flaeche,'FaceLighting','phong','FaceColor',[110],...
'AmbientStrength',1.0,'edgecolor','none','FaceAlpha',0.5) hold on
% Normieren des Vektors tu
tu_betrag=sqrt(dot(tu,tu));
tu_normiert=(1/tu_betrag)*tu
% Darstellen des Vektors tu
Vektor_tu=quiver3(r_0(1),r_0(2),r_0(3),tu_normiert(1),tu_normiert(2),tu_normiert(3));
set(Vektor_tu,'color',[001],'Linewidth',2.5) hold on
% Normieren des Vektors tv
tv_betrag=sqrt(dot(tv,tv));
tv_normiert=(1/tv_betrag)*tv;
% Darstellen des Vektors tv
Vektor_tv=quiver3(r_0(1),r_0(2),r_0(3),tv_normiert(1),tv_normiert(2),tv_normiert(3));
set(Vektor_tv,'color',[001],'Linewidth',2.5) hold on
Die von dir aufgestellte Ebenengleichung sollte richtig sein, wenn ich die Hessegleichung anders/ausführlich ausmultipliziere, bekomme ich ebenfalls keine Tangentialebene.
Noch was zum Fall n(3)=0. Dies wird bei Funktionen der Form f(x,y)=z nicht eintreten, denn das hieße eine unendlich große Steigung (Betrag des Gradienten).
Solltest du Objekte verwenden, die nicht über Funktionen dargestellt werden können, beispielsweise eine Kugel, musst du tatsächlich über die Parameterform der Ebene gehen. Sollte das der Fall sein, melde dich nochmal.
Wenn ich das jetzt in meinem Code einfüge, erhalte ich ein leeres Koordinatensystem und keine Ebene.
Denn für die frei gewählten Werte u=0 und v=0 ist der Normalenvektor normv=[-2 2 0], und somit normv(3)=0. Auch für andere Werte von u und v (z.B. u=pi, v=pi)erhalte ich manchmal eine negative komponente normv(3). Er zeichnet für den Zweiten Fall zwar eine Ebene, aber meine "muschelförmige" FLäche staucht er total komisch zusammen.
u und v sind jeweils im Intervall [-pi;pi] definiert.
Wähle ich z.B. u=-pi/2 und v=pi/2 (normv(3)!=0) dann liegt die Ebene zwar in der von tu und tv aufgespannten Ebene, allerdings stehen tu und tv nicht senkrecht aufeinander.
Sollten sie das nicht eigentlich?
hier das Bild:
Da dies ja gar nicht so schlecht aussieht, würde ich jetzt doch eine Fallunterscheidung ausprobieren. So dass die Ebene wahlweise als z=f(x,y), y=f(x,z) oder x=f(y,z) dargestellt wird, in Abhängigkeit davon, ob normv(1), normv(2) und normv(3) Null sind.
Spricht etwas dagegen?
Noch was zum Fall n(3)=0. Dies wird bei Funktionen der Form f(x,y)=z nicht eintreten, denn das hieße eine unendlich große Steigung (Betrag des Gradienten).
Solltest du Objekte verwenden, die nicht über Funktionen dargestellt werden können, beispielsweise eine Kugel, musst du tatsächlich über die Parameterform der Ebene gehen. Sollte das der Fall sein, melde dich nochmal.
Wie du auf dem Bild erkennen kannst, habe ich eine "muschelförmige" Bildfläche, für die ich ja die Tangentialebene berechnen möchte. In der Aufgabenstellung habe ich die Fläche in Parameterform gegeben (siehe Code, Anfang).
Daher habe ich vermutlich einen kugelähnlichen Fall?
Ich frage mich, wieso ich die Ebene nicht in der Parameterdarstellung darstellen kann (siehe allerersten Post)
Wenn man für u oder v pi,-pi oder 0 einsetzt, bekommt man bei normv(3) eine Null anscheinend.
Und dann ist der plot fehlerhaft.
Kann das am Befehl surf liegen?
Bei surf wird doch ein Gitternetz für die x,y-Ebene erstellt. Und dann kann man die z-Koordinate in Abhängigkeit von x und y plotten.
Ich versuche ja bei meinen beiden letzten Fällen die x- bzw y-Koordinate in Abhängigkeit der jeweils anderen zu plotten.
Ich meine mal gelesen zu haben, dass Matlab nur die z-Koordinate in Abhängigkeit der anderen potten kann.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.