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

3D Plot mit mehreren Matrizen

 

Nihi
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 29.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2015, 19:18     Titel: 3D Plot mit mehreren Matrizen
  Antworten mit Zitat      
Hallo liebe Community!

Wie so viele hier habe ich auch meine Schwierigkeiten mit dem Plotten Wink
Die Grundlagen des Plottens kenne ich, an den Feinheiten haperts aber noch.

Also folgendes Problem habe ich. Ich habe drei Matrizen, die jeweils mehrere Spalten und sehr viele Zeilen haben. Dabei ist der Großteil aller Werte leer (NaN), sodass in jeder Zeile immer nur ein Wert steht.
Das ganze sieht also etwa so aus:

MX1 = \begin{vmatrix} NaN & 1 & NaN \\ 1 & NaN & NaN \\ NaN & 100 & NaN \end{vmatrix}

MX2 = \begin{vmatrix} NaN & 2 & NaN \\ 10 & NaN & NaN \\ NaN & 3 & NaN \end{vmatrix}

MX3 = \begin{vmatrix} NaN & 4 & NaN \\ 7 & NaN & NaN \\ NaN & 27 & NaN \end{vmatrix}

Es soll jetzt so geplottet werden, dass jeweils die Spalten j der Matrizen die Koordinaten für die Punkte geben, also Spalte 1 von MX1 wird gegen Spalte 1 von MX2 und Spalte 1 von MX3 geplottet. Das gleiche für Spalte 2, 3, ... m. Da in jeder Zeile nur ein Wert steht, wird folglich für jede Zeile auch nur 1 Punkt generiert. Die Matrizen haben identische Dimensionen. Für jede Spalte soll eine andere Farbe verwendet werden, damit man im Plot nachher sehen kann aus welcher Spalte j der Punkt generiert wurde. Es wird also ein Pseudo-4D-Plot erstellt (Koordinaten aus XM1, XM2, XM3 und Farbkodierung für die Spalte). Für jede Spalte soll zudem ein farblich korrekter Legendeneintrag erzeugt werden.

Einen Beispielplot habe ich angehängt. Leider ist der Code der diesen Plot erzeugt hat, auf mein Problem nicht übertragbar (zu komplex).

Folgende Ansätze habe ich bereits verfolgt:
plot3(MX1, MX2, MX3) %erzeugt prinzipiell den richtigen Plot, verbindet aber alle Punkte über Linien; kann man hier vielleicht auch mit Punkten plotten?
scatter() %plottet nur Vektoren. Leider müsste ich hierzu meine Matrizen zerlegen, was ich eigentlich nicht möchte.
subplot könnte verwendet werden, um die Spalten alle einzeln zu plotten... es soll aber eigentlich alles in einen Plot.

Ich weiß, dass Matlab diverse surface-Plots darstellen kann, kenne mich hier aber gar nicht aus und weiß auch nicht, ob diese Funktionen den doch sehr speziellen Input, den ich habe, schlucken.


Hier jetzt der Code zum Problem: Achtung Laufzeit etwa 1 Minute (wegen ODE45), auf langsamen Rechnern länger. Input Parameter, falls es jemand bei sich laufen lassen will: t0 = 0, t = 20, x0=[0 0 0]', r= [10 6.5 -10]'; A = [-0.013 -0.05 -0.1; -0.01 -0.01 -0.09; 0.11 0.1 0.0], B= [0 0 0; 0.1 0 0; 0 0 0]

Code:
function [ ] = A1T3Copt( t0, t, x0, r, A, B )
%Ermittlung der Ruhelagen
syms x1 x2 x3;
[s1, s2, s3] = solve([x1 0 0; 0 x2 0; 0 0 x3] * (r + A * [x1 x2 x3]') + B * [x1 x2 x3]');
s1d = double(s1);
s2d = double(s2);
s3d = double(s3);
RL = [s1d s2d s3d];
AnzahlRL = length(RL(:,1))+ 1;  %+1 um später Spalte einzuführen, in die geschrieben werden kann, wenn keine RL erreicht wird (simulierter Zeitraum zu kurz)

MX1 = NaN(1000,AnzahlRL);
MX2 = NaN(1000,AnzahlRL);
MX3 = NaN(1000,AnzahlRL);
Zeilenvariable = 0;
for OLV = [1:1000:10000]
   
    x0(1) = OLV;
        for ILV = [1:1000:10000]
           
            x0(2) = ILV;
            for ALV = [1:1000:10000]
                Zeilenvariable = Zeilenvariable +1;
                x0(3) = ALV;
                [Zeit, X] = ode45(@eLV_ODE, [t0 t], x0, [], r, A, B);
                Zeitpunkte = length(Zeit);
                %Kategorisierung der Ruhelagen
                for Spaltenvariable = [1: AnzahlRL]
                    if (Spaltenvariable == AnzahlRL)    %Es wurde keine RL erreicht, schreibe in letzte Spalte (keine RL Spalte)
                        MX1(Zeilenvariable,Spaltenvariable) = OLV;
                        MX2(Zeilenvariable,Spaltenvariable) = ILV;
                        MX3(Zeilenvariable,Spaltenvariable) = ALV;
                        break;
                    end
                    if ( (abs( (X(Zeitpunkte,1) - RL(Spaltenvariable,1)) ) < 1) && (abs( (X(Zeitpunkte,2) - RL(Spaltenvariable,2)) ) < 1) && (abs( (X(Zeitpunkte,3) - RL(Spaltenvariable,3)) ) < 1)) %Annahme, dass bei Werten kleiner 1 die GGWL erreicht wird
                        MX1(Zeilenvariable,Spaltenvariable) = OLV;
                        MX2(Zeilenvariable,Spaltenvariable) = ILV;
                        MX3(Zeilenvariable,Spaltenvariable) = ALV;
                        break;
                    end
                   
                end
            end
        end
end
plot3(MX1,MX2,MX3)
%legend(')
title('Gleichgewichtslagen');
xlabel('Startwert für x1');
ylabel('Startwert für x2');
zlabel('Startwert für x3');
hold off;


end

 


Außerdem die aufgerufene Funktion:
Code:
function [ dxdt ] = eLV_ODE( t, x, r, A, B )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
dxdt = diag(x) * (r + A * x)+ B*x;

end

 


Beispiel.png
 Beschreibung:

Download
 Dateiname:  Beispiel.png
 Dateigröße:  41.47 KB
 Heruntergeladen:  442 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

bei plot3 kannst du als zusätzliches Argument die Linienart angeben. 'o' würde kreisförmige Marker erzeugen, '.' Punkte.

Falls die Statistics Toolbox verfügbar ist, würde ich gscatter empfehlen.

Ach ja, es bietet sich natürlich an, die Matrix dann dünn besetzt (sparse) abzuspeichern :)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.