ich möchte mit surf(x,y,z)- Befehl die Variablen x y und z
im dreidimensionalen Raum darstellen und die Flächen zwischen den Punkten farblich ausfüllen.
Mein Quellcode:
Ich habe für z eine 1x1- Matrix initialisiert. Trotzdem erhalte ich
die Fehlermeldung:
"??? Error using ==> surf at 78
Z must be a matrix, not a scalar or vector. "
Was mache ich verkehrt? Vielen Dank für eure Hilfe!
der Code ist in dieser Form bedenklich, vor allem weil
1. ein linspace mit 1 Stützstelle ist nicht sinnvoll, insbesondere wird da nichts durchlaufen
2. die for-Schleife nicht von i abhängt. Da anscheinend auch keine Ergebnisse der vorherigen Iteration verwendet werden, wird also nur dasselbe wiederholt gemacht.
3. die if-Abfrage dürfte in dieser Form wirkungslos sein
Wenn x, y, z Vektoren sind, muss man zunächst griddata verwenden, um das in die für surf benötigte Form umzuwandeln, siehe
theta(1)=atan2(y,x)*180/pi;
D=(x*x+y*y+(z-d)*(z-d)-(a2*a2)-(a3*a3))/(2*a2*a3);
theta(3)=acos(D)*180/pi;
%Berechnung von Psi3 in der elbow-down Position
if theta(3)>=35
theta(3) = atan2((-sqrt(1-(D*D))),D)*180/pi;
end
theta(2)=atan2(z-d,sqrt(y*y+x*x))*180/pi-atan2(a3*sin(theta(3)*pi/180),a2+a3*cos(theta(3)*pi/180))*180/pi;
%Überprüfung mittels Vorwärtstransformation
x= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*cos(theta(1)/180*pi);
y= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*sin(theta(1)/180*pi);
z= a2*sin(theta(2)/180*pi)+a3*sin((theta(2)+theta(3))/180*pi)+d;
xc=-50:1:50;
[Xc,Yc]=meshgrid(xc,xc);
n=n+1;
[Xi,Yi,Zi]=griddata(x,y,z,Xc,Yc);
end end
theta(1)=atan2(y,x)*180/pi;
D=(x*x+y*y+(z-d)*(z-d)-(a2*a2)-(a3*a3))/(2*a2*a3);
theta(3)=acos(D)*180/pi;
%Berechnung von Psi3 in der elbow-down Position
if theta(3)>=35
theta(3) = atan2((-sqrt(1-(D*D))),D)*180/pi;
end
theta(2)=atan2(z-d,sqrt(y*y+x*x))*180/pi-atan2(a3*sin(theta(3)*pi/180),a2+a3*cos(theta(3)*pi/180))*180/pi;
%Überprüfung mittels Vorwärtstransformation
x(n)= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*cos(theta(1)/180*pi);
y(n)= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*sin(theta(1)/180*pi);
z(n)= a2*sin(theta(2)/180*pi)+a3*sin((theta(2)+theta(3))/180*pi)+d;
xc=-50:1:50;
[Xc,Yc]=meshgrid(xc,xc);
n=n+1 end end [Xi,Yi,Zi]=griddata(x,y,z,Xc,Yc);
Nun wirft der Compiler die Fehlermeldung:
"Warning: Duplicate x-y data points detected: using average of the z values.
> In griddata at 104
In kugelplot at 37
??? Error using ==> griddata at 117
Not enough unique sample points specified.
Error in ==> kugelplot at 37
[Xi,Yi,Zi]=griddata(x,y,z,Xc,Yc);"
Ich weis damit nichts anzufangen. Was mache ich verkehrt? Besten Dank!
schau dir das ganze doch mal in Workspace und Debugger an:
Mit der Zuweisung von x,y,z am Anfang der for-Schleife überschreibst du die vorher gespeicherten Werte.
Grüße,
Harald
MatlabTyp
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.01.2014, 00:34
Titel:
Hallo Harald,
vielen Dank für deine Hilfe! Die Darstellung des Lösungsraumes mit griddata und surf hat funktioniert. Die Winkel d1&d2 und d3&d4 waren jedoch vertauscht. Nachdem ich dies geändert habe, wird in den Iterationen vereinzelt ein komplexer Winkel berechnet, welchen griddata nicht verarbeiten kann. Ich habe versucht die komplexen Winkel in einer if-bedingungsabfrage wie folgt abzufangen:
was genau soll die if-Abfrage denn bezwecken?
Bist du dir insbesondere darüber bewusst, wie < und > auf komplexen Zahlen funktionieren?
Wenn die komplexen Zahlen nur durch Rundungsfehler z.B. bei acos zustandekommen, bietet es sich an, einfach den Realteil des Winkels zu nehmen und damit weiterzurechnen.
Das meshgrid kannst du auch aus der Schleife herausnehmen.
Sinnvoller wäre es zudem, von vorneherein auf dem Gitter Matrixdaten zu berechnen, die du später brauchst.
Grüße,
Harald
MatlabTyp
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.01.2014, 20:02
Titel:
Hallo Harald,
vielen Dank für deine schnelle Antwort. Mit der if-Abfrage wollte ich zu Beginn die berechneten imaginären Winkel nicht in die Gleichungen für die Vorwärtstransformation einbeziehen, da griddata keine imaginären x,y und z-Werte verarbeiten kann. Nun ist mir der Gedanke gekommen, dass imaginäre Winkel sehr wahrscheinlich genauso zum Lösungsraum gehören, sodass man in dem Fall den Betrag der imaginären Winkel berechnen müsste, um diese in den Gleichungen für die Vorwärtstransformation zu verwenden. Teilst du prnizipiell meine Meinung mit mir? Wie berechnet man in Matlab den Betrag einer imaginären Zahl? Besten Dank!
Mit der if-Abfrage wollte ich zu Beginn die berechneten imaginären Winkel nicht in die Gleichungen für die Vorwärtstransformation einbeziehen, da griddata keine imaginären x,y und z-Werte verarbeiten kann.
Was sollen dann aber Abfragen wie theta(1) < 0?
Vor allem sind theta(1) < 0 und theta(1) >= 0 ja i.d.R. ergänzend zueinander.
Zitat:
Nun ist mir der Gedanke gekommen, dass imaginäre Winkel sehr wahrscheinlich genauso zum Lösungsraum gehören, sodass man in dem Fall den Betrag der imaginären Winkel berechnen müsste, um diese in den Gleichungen für die Vorwärtstransformation zu verwenden.
Ich weiß offen gesagt nicht, was du hier überhaupt rechnest, kann dazu also nichts sagen.
Zitat:
Wie berechnet man in Matlab den Betrag einer imaginären Zahl?
Mit abs
Grüße,
Harald
MatlabTyp
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.01.2014, 20:43
Titel:
Hallo Harald,
ich habe die Darstellung des Lösungsraumes der trigonometrischen Gleichungen mit dem Befehl plot3(...) umgesetzt. Mein Quellcode:
for d1=-90:1:90 for d2=-60:1:60
x=r1*cos(d1*pi/180)*cos(d2*pi/180);
y=r1*cos(d1*pi/180)*sin(d2*pi/180);
z=r1*sin(d1*pi/180);
theta(1)=atan2(y,x)*180/pi;
D=(x*x+y*y+(z-d)*(z-d)-(a2*a2)-(a3*a3))/(2*a2*a3);
theta(3)=acos(D)*180/pi;
%Berechnung von Psi3 in der elbow-down Position
if theta(3)>=35
theta(3) = atan2((-sqrt(1-(D*D))),D)*180/pi;
end
theta(2)=atan2(z-d,sqrt(y*y+x*x))*180/pi-atan2(a3*sin(theta(3)*pi/180),a2+a3*cos(theta(3)*pi/180))*180/pi;
xarr(n)= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*cos(theta(1)/180*pi);
yarr(n)= (a2*cos(theta(2)/180*pi)+a3*cos((theta(2)+theta(3))/180*pi))*sin(theta(1)/180*pi);
zarr(n)= a2*sin(theta(2)/180*pi)+a3*sin((theta(2)+theta(3))/180*pi)+d;
plot3(xarr(n),yarr(n),zarr(n));
n=n+1;
end end
Der Plot wird deutlich schneller erzeugt und lässt sich besser rotieren, wenn du alle Datenpunkte auf einmal plottest, also nach der for-Schleife
Zitat:
plot3 (xarr,yarr,zarr, '.');
Da die Daten jetzt keine komplexe Zahlen mehr enthalten, kannst du natürlich auch eine Oberfläche draus machen, so wie du es zuvor versucht hast.
Grüße,
Harald
MatlabTyp
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.01.2014, 00:09
Titel:
Hallo Harald,
vielen Dank für deine schnelle Antwort. Deinen Vorschlag habe ich umgesetzt.
Ich möchte mehrere solcher 3d-Plot's in einem Bild unterbringen. Wie kann ich die Farbe jedes 3d-Plot bestimmen?
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.