3D-Plot einer Funktion, MATLAB < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 13:52 Do 21.05.2009 | Autor: | pelzig |
Hallo,
Ich habe eine Matlab-Funktion f(x,y), die mir einfach reelle Zahlen ausspucht, und möchte die z.B. auf [mm] $[0,1]^2$ [/mm] plotten. Wie geht das?
Ich probier jetzt schon ne ganze Weile, in den Standartbeispielen steht immer ich soll das mit meshgrid, griddata, surf usw. machen. Ich mache [x,y]=meshgrid(0:0.1:1,0:0.1:1), das Problem ist, wie bekomme ich jetzt das zugehörige z, sodass surf(x,y,z) das gewünschte ergebnis liefert? Dafür gibt es doch sicher ne einfache Lösung.
Gruß, Robert
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:44 Do 21.05.2009 | Autor: | Frasier |
Hallo Robert,
ja, das ist ganz einfach. Die Hilfe zu meshgrid enthält dazu auch ein Beispiel.
Für [mm] f(x)=\sqrt{xy} [/mm] geht es so:
1: |
| 2: | [x,y]=meshgrid(0:0.1:1);
| 3: | z=sqrt(x.*y);
| 4: | surf(x,y,z); |
Der Punkt vor dem * sorgt für eine element-by-element Multiplikation. Ohne den . würdest du die Matrixmultiplikation durchführen.
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:23 Do 21.05.2009 | Autor: | Frasier |
Habe ich dich vielleicht falsch verstanden?
Wie genau sieht deine Funktion aus?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:52 Fr 22.05.2009 | Autor: | pelzig |
> Habe ich dich vielleicht falsch verstanden?
> Wie genau sieht deine Funktion aus?
Ja genau das ist das Problem, die Funktion ist halt keine elementare Funktion, sondern einfach eine mehr oder weniger wirre Funktion [mm] $f:\IR^2\to\IR$ [/mm] - zu einem Punkt [mm] $(x,y)\in\IR$ [/mm] bekomme ich den Funktionswert durch f(x,y), d.h. ich habe eine Matlab-Funktion geschrieben:
1: | function z = f(x,y)
| 2: | [mach irgendwas]
| 3: | z = ...
| 4: | end
|
Und diese will ich halt auf gewissen Gebieten von [mm] $\IR^2$ [/mm] plotten.
Gruß, Robert
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:59 Fr 22.05.2009 | Autor: | Frasier |
Hallo Robert,
was steht denn konkret in der Funktion f? Was passiert in [mach irgendwas]?
Hast du da ein kleines Beispiel?
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:37 Fr 22.05.2009 | Autor: | pelzig |
Tu doch einfach so, als sei über f sonst nichts weiter bekannt...
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:48 Fr 22.05.2009 | Autor: | Frasier |
So lange deine Funktion für jeden Punkt (x/y) ein z berechnet sehe ich das Problem nicht (dank meshgrid).
Die Darstellung einer bereichsweise definierten Funktion erhälst du z.B. so.
1: | function pelzig
| 2: | [x,y]=meshgrid(-1:0.05:1);
| 3: | z=fun(x,y);
| 4: | mesh(x,y,z);
| 5: |
| 6: | function z=fun(x,y)
| 7: | z=(x.^2+y.^2).*(x<0&y<0);
| 8: | z=z+sqrt(x.*y).*(x>0&y>0);
| 9: | z=z+(y.*cos(x)).*(x>0&y<0);
| 10: | z(x<0&y>0)=nan; |
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:02 Fr 22.05.2009 | Autor: | pelzig |
> So lange deine Funktion für jeden Punkt (x/y) ein z
> berechnet sehe ich das Problem nicht (dank meshgrid).
1: | function pelzig
| 2: | [x,y]=meshgrid(-1:0.05:1);
| 3: | z=fun(x,y); | An dieser Stelle gibt es einfach einen Fehler, denn x,y sind Matrizen, die Funktion fun kann aber nur mit Zahlen umgehen.
Es wäre ziemlich aufwändig meine Funktion(en) so anzupassen, dass sie auch diese Matrizen als Eingabedaten nehmen.
Gruß, Robert
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:39 Fr 22.05.2009 | Autor: | Frasier |
Hallo,
dann kannst du Schleifen nehmen, um die Matrix z schrittweise zusammenzubauen.
1: | function pelzig
| 2: | x=-1:0.2:2;
| 3: | y=-1:0.05:1;
| 4: | z=zeros(numel(y),numel(x));
| 5: | for yy=1:numel(y)
| 6: | for xx=1:numel(x)
| 7: | z(yy,xx)=fun(x(xx),y(yy));
| 8: | end
| 9: | end
| 10: | mesh(x,y,z);
| 11: |
| 12: | function z=fun(x,y)
| 13: | z=x^2+y^2; |
Hilft dir das?
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:47 Fr 22.05.2009 | Autor: | pelzig |
Ja so hatte ich es jetzt auch gemacht. Nur irgendwie finde ich das ziemlich hässlich. Ich dachte es gibt dafür vielleicht schon irgend eine funktion, die alles macht, wo ich nur noch mein f als function handle reinstecken muss oder so.
Gruß, Robert
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:36 Fr 22.05.2009 | Autor: | Frasier |
Hallo,
am effizientesten wäre es wohl, wenn du die Funktion so umschreibst, dass sie mit den von meshgrid erzeugten Matrizen umgehen kann.
Eventuell gibt es auch die Möglichkeit, wenigstens eine der Schleifen zu eliminieren oder bsxfun zu benutzen. Dazu müsste man aber die Funktion kennen.
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:10 Fr 22.05.2009 | Autor: | pelzig |
Das mit bsxfun klingt irgendwie vielversprechend, aber leider versteh ich noch nicht so ganz was die Funktion macht...
Okay hier ist eine der Funktionen, um die es geht:
1: | function y = P2_Base(T,k,xt,yt)
| 2: | % Berechnet den Wert der k-ten nodalen P_2-Funktion bezueglich des Dreiecks T
| 3: | % an der Stelle (x,y).
| 4: | if(isInTriangle(T,xt,yt))
| 5: | r=T2TRef(T,[xt;yt]);
| 6: | x=r(1); y=r(2);
| 7: | switch k
| 8: | case 1
| 9: | y=1+x*(2*x+4*y-3)+y*(2*y-3);
| 10: | case 2
| 11: | y=x*(2*x-1);
| 12: | case 3
| 13: | y=y*(2*y-1);
| 14: | end
| 15: | else
| 16: | y=0;
| 17: | end
| 18: | end |
Zur Erklärung. Wir machen gerade FEM, und diese Funktion implementiert zu einem gegebenen Dreieck [mm] $T\subset\IR^2$ [/mm] mit den Eckpunkten [mm] x_1, x_2, x_3 [/mm] das eindeutig bestimmte Polynom [mm] p_k [/mm] mit Totalgrad kleinergleich 2 mit der Eigenschaft [mm] p_k(x_i)=\delta_{ik} [/mm] für $i=1,...,6$, wobei [mm] $x_4,x_5,x_6$ [/mm] die Mittelpunkte der Seiten von T sind. In dem Programm ist T die Matrix mit den Eckpunkten des Dreiecks als Spaltenvektoren, und (xt,yt) ist die Stelle an der wir [mm] p_k [/mm] auswerten wollen. In Zeile 7-14 ist [mm] p_k(xt,yt) [/mm] für das "Referenzdreieck" TRef [mm] \{(0,0),(1,0),(0,1)\} [/mm] implementiert, und ich führe den allgemeinen Fall durch eine affine Transformation von T auf TRef zurück (Zeile 5).
Gruß, Robert
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:15 Mo 25.05.2009 | Autor: | Frasier |
Hm, da sehe ich auf die Schnelle jetzt leider keine Vereinfachungsmöglichkeit.
lg
F.
|
|
|
|