WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Surf Befehl

 

MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2013, 18:26     Titel: Surf Befehl
  Antworten mit Zitat      
Hey Leute,

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:

Code:
x=0.2;
y=0.2
z=[2];
surf(x,y,z);




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!


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2013, 19:30     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung besagt es ja: z darf kein Skalar sein.
Wie soll auch durch einen Punkt eine Oberfläche gelegt werden?

Wenn du nur einen einzigen Punkt dreidimensional darstellen möchtest, kannst du plot3 verwenden:
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2013, 20:23     Titel:
  Antworten mit Zitat      
Okay. Wie müsste ich den surf-Befehl anwenden, wenn die Variablen x, y und z mittels linspace einen bestimmten Zahlenbereich durchlaufen?

Code:
%

for i=1:100    
    [d1,d2]=meshgrid(linspace(0,pi/2,1),linspace(-pi/6,pi/6,1));  
    x=r1*sin(d1).*cos(d2);
    y=r1*sin(d1).*sin(d2);
    z=r1*cos(d1);    
   
    D=(x*x+y*y+(z-d)*(z-d)-(a2*a2)-(a3*a3))/(2*a2*a3);
    theta(3)=acos(D)*180/pi;  
    theta(2)=atan2(z-d,sqrt(y*y+x*x))*180/pi-
    atan2(a3*sin(theta(3)*pi180),a2+a3*cos(theta(3)*pi/180))*180/pi;    

    %Überprüfung mittels Vorwärtstransformation    
    if (theta(1)<0 || theta(1)>=0 || theta(2)<0 || theta(2)>=0 ||    
    theta(3)<0 || theta(3)>=0)
     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;
    end
    plot3(x,y,z,'b');
   
end
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2013, 21:44     Titel:
  Antworten mit Zitat      
Hallo,

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
Code:


Ansonsten bitte erst mal den Code in Ordnung bringen, s.o.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.01.2014, 23:32     Titel:
  Antworten mit Zitat      
Hey,

ich habe meinen Quellcode wie folgt umgeschrieben:

Code:
%
hold on;
rotate3d on;
theta=[1 2 3];
r1=31;
a2=45;
a3=35;
d=-4;
n=1;
d1=0;
d2=0;


for d1=0:90
    for d2=-30:30      
        x=r1*sin(d1*pi/180)*cos(d2*pi/180);
        y=r1*sin(d1*pi/180)*sin(d2*pi/180);
        z=r1*cos(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;
       
        %Ü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
 


Nun erhalte ich die Fehlermeldung:
"??? Error using ==> griddata at 84
Not enough unique sample points specified.

Error in ==> kugelplot at 37
[Xi,Yi,Zi]=griddata(x,y,z,Xc,Yc);"

Was mache ich verkehrt? Vielen Dank für eure Hilfe!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.01.2014, 23:59     Titel:
  Antworten mit Zitat      
Hallo,

x, y, z sind weiterhin Skalare.
Du musst x, y, z erst für alle Daten berechnen und dann (außerhalb der Schleife) griddata verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2014, 12:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich erstelle in meinem Quellcode jetzt die Vektoren x,y und z der Länge n:

Code:
%
for d1=0:90
    for d2=-30:30      
        x=r1*sin(d1*pi/180)*cos(d2*pi/180);
        y=r1*sin(d1*pi/180)*sin(d2*pi/180);
        z=r1*cos(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;
       
        %Ü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!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.01.2014, 12:42     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2014, 00:34     Titel:
  Antworten mit Zitat      
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:

Code:
%
hold on;
rotate3d on;
theta=[1 2 3];
r1=31;
a2=45;
a3=35;
d=-4;
n=1;
d1=0;
d2=0;


for d1=0:90
    for d2=-30:30      
        x=r1*sin(d2*pi/180)*cos(d1*pi/180);
        y=r1*sin(d2*pi/180)*sin(d1*pi/180);
        z=r1*cos(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        
        if theta(3)<0 || theta(3)>=0
            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
        end            
        %Überprüfung mittels Vorwärtstransformation
        if (theta(1)<0 && imag(theta(1))==0) || (theta(1)>=0 && imag(theta(1))==0) || (theta(2)<0 && imag(theta(2))==0) || (theta(2)>=0 && imag(theta(2))==0) || (theta(3)<0 && imag(theta(3))==0) || (theta(3)>=0 && imag(theta(3))==0)            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;  
        end
        xc=-50:1:50;
        [Xc,Yc]=meshgrid(xc,xc);
        n=n+1;        
    end
end
[Xi,Yi,Zi]=griddata(xarr,yarr,zarr,Xc,Yc);
surf(Xi,Yi,Zi);
 


Trotzdem liefert mir der Compiler die Fehlermeldung:
"??? Error using ==> griddata at 65
Input data cannot be complex.

Error in ==> kugelplot at 77
[Xi,Yi,Zi]=griddata(x1arr,y1arr,z1arr,Xc,Yc);"
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2014, 12:17     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2014, 20:02     Titel:
  Antworten mit Zitat      
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!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2014, 22:20     Titel:
  Antworten mit Zitat      
Hallo,
Zitat:

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
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 20:43     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe die Darstellung des Lösungsraumes der trigonometrischen Gleichungen mit dem Befehl plot3(...) umgesetzt. Mein Quellcode:

Code:
%
hold on;
rotate3d on;
theta=[1 2 3];
r1=31;
a2=45;
a3=35;
d=-4;
n=1;
d1=0;
d2=0;


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
 


Wie skaliere ich die Koordinatenachsen im 3d-Plot einheiutlich? Besten Dank!


Viele Grüße,
MatlabTyp
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.01.2014, 21:00     Titel:
  Antworten mit Zitat      
Hallo,

ich würde
Code:

verwenden.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabTyp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2014, 00:09     Titel:
  Antworten mit Zitat      
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?
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.