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

Punkte plotten anstelle von Nullen und Einsen

 

anfaenger85
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2012, 17:49     Titel: Punkte plotten anstelle von Nullen und Einsen
  Antworten mit Zitat      
Hallo,

ich quäle mich seit einiger Tagen mit dem Erstellen einer Grafik, die einen Punkt plotten soll, wenn der entsprechende Wert einer n*n Matrix 0 ist. Für jeden der n X-Werte auf der X-Achse gibt es jeweils n Y-Werte auf der Y-Achse.

Ich benutze den Funktion plotmat [Copyright (c) Ian T Nabney (1996-9)] um die einzelnen Werte aus der Matrix in den X-Y Raum zu plotten, allerdings werden im Moment die Werte 0 und 1 angezeigt. Ich bräuchte jedoch Punkte wenn der Wert 0 ist und keinen Punkt wenn der Wert 1 ist (siehe Zielgrafik).

Kann mit jemand weiterhelfen? Confused
Vielen Dank!
FL

Code:
%Hier ist mein Programm
close all;

var g b t pi c y r k inv q mc n rw d r_k;
varexo eps_g;
parameters beta, rho, theta, alpha, epsilon, delta, varphi, eta, lambda, phi_pi, phi_g, phi_b, gamma_g, rho_g, mu, lambda_p, gamma_c, sigma, sigma_tilde, theta_n, theta_t, gamma_i;

beta        = 0.99;
rho         = 1/beta-1;
theta       = 0.75;
alpha       = 1/3;
epsilon     = 6;
delta       = 0.025;
varphi      = 0.2;
eta         = 1;
lambda      = 0.5;
phi_pi       = 1.5;
phi_g       = 0.1;
phi_b       = 0.3;
gamma_g     = 0.2;
rho_g       = 0.9;
sigma       = 1;


// parameters calculated by the program:
mu       = epsilon/(epsilon-1);
lambda_p    = (1-beta*theta)*(1-theta)/theta;
gamma_c     = (1-gamma_g)-(delta*alpha)/((rho+delta)*mu);
sigma_tilde = (gamma_c*mu*varphi+(1-alpha)*(1-lambda*(1+varphi)))/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_n     = lambda*(1-alpha)*(1+varphi)*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_t     = lambda*mu*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
gamma_i     = 1-gamma_c-gamma_g;


model (linear);

g(0)    = rho_g*g(-1)+ eps_g;
b(0)    = (1+rho)*(b(-1)+g(0)-t(0));
t(0)    = phi_b*b(-1) + phi_g*g(0);
pi(0)   = beta*pi(+1) + lambda_p*mc(0);
c(0)    = c(+1) - (1/sigma_tilde)*(r(0) - pi(+1)) - theta_n*(n(+1)-n(0)) + theta_t*(t(+1)-t(0));
y(0)    = gamma_c*c(0) + gamma_i*inv(0) + g(0);
r(0)    = phi_pi*pi(0);
k(0)    = delta*inv(0)+(1-delta)*k(-1);
inv(0)  = k(-1) + eta*q(0);
q(0)    = beta*q(+1) + (1-beta*(1-delta))*(mc(+1) + y(+1) - k(0)) - (r(0) - pi(+1));
mc(0)   = rw(0) - (y(0)-n(0));
n(0)    = (1/(1-alpha))*y(0) - (alpha/(1-alpha))*k(-1);
rw(0)   = c(0) + varphi*n(0);
d(0)    = g(0) - t(0);
r_k(0)   = c(0)-k(0)+(1+varphi)*n(0);
end;


initval;
g =0;
b =0;
t =0;
y =0;
pi=0;
c=0;
r=rho;
k=0;
inv=0;
q=0;
mc=0;
n=0;
rw=0;
d=0;
end;

shocks;
var eps_g = sigma^2;
end;

N = 20;
thetas = linspace(0.0001,0.9999,N);
lambdas = linspace(0.0001,0.9999,N);
stabmat = zeros(N,N);

for i = 1:N
    for j = 1:N
        theta = thetas(i);
        lambda = lambdas(j);

mu       = epsilon/(epsilon-1);
lambda_p    = (1-beta*theta)*(1-theta)/theta;
gamma_c     = (1-gamma_g)-(delta*alpha)/((rho+delta)*mu);
sigma_tilde = (gamma_c*mu*varphi+(1-alpha)*(1-lambda*(1+varphi)))/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_n     = lambda*(1-alpha)*(1+varphi)*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_t     = lambda*mu*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
gamma_i     = 1-gamma_c-gamma_g;

        steady;
        check;
       
        if sum(abs(oo_.dr.eigval)>1) > 6            
            stabmat(i,j) = 1;
            i
        end;
    end;
end;



% abs(oo_.dr.eigval)


%PLOTMAT Display a matrix.
%
%   Description
%   PLOTMAT(MATRIX, TEXTCOLOUR, GRIDCOLOUR, FONTSIZE) displays the matrix
%   MATRIX on the current figure.  The TEXTCOLOUR and GRIDCOLOUR
%   arguments control the colours of the numbers and grid labels
%   respectively and should follow the usual Matlab specification. The
%   parameter FONTSIZE should be an integer.
%
%   See also
%   CONFFIG, DEMMLP2
%

%   Copyright (c) Ian T Nabney (1996-9)



[N,N]=size(stabmat);
for i=1:N,
  for j=1:N,
   numberString=num2str(stabmat(i,j));
   text(i,j,numberString, ...
     'HorizontalAlignment','center', ...
     'Color', 'k', ...
     'FontWeight','bold', ...
     'FontSize', 12);
  end;
end;

set(gca,'Box','on', ...
  'Visible','on', ...
  'axis([0 1 0 1])', ...
  'xGrid','on', ...
  'xTickLabel',[], ...
  'xTick',0:N, ...
  'yGrid','on', ...
  'yTickLabel',[], ...
  'yTick',0:N, ...
  'DataAspectRatio',[1, 1, 1], ...
  'GridLineStyle',':', ...
  'LineWidth',3, ...
  'XColor','k', ...
  'YColor','k');

function plotmat(stabmat)

 


zielbild.jpg
 Beschreibung:

Download
 Dateiname:  zielbild.jpg
 Dateigröße:  27.71 KB
 Heruntergeladen:  546 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.06.2012, 17:55     Titel:
  Antworten mit Zitat      
sowas?
Code:
mat=rand(10,10)>0.5;
[row,col,v]=find(mat==0);
plot(row,col,'o')
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2012, 17:55     Titel:
  Antworten mit Zitat      
filtere Deine Daten vor, find liefert dir die passenden Indizes von Nicht-Null-Elementen
Private Nachricht senden Benutzer-Profile anzeigen
 
anfaenger85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 08:52     Titel:
  Antworten mit Zitat      
Vielen herzlichen Dank für eure Tipps, es hat geklappt! Laughing
Hier ist der Code, den ich benutzt habe:
Code:

[m,n]=find(stabmat==1);
plot(m,n,'ko',...
   'MarkerSize',10,...
   'MarkerEdgeColor','k',...
   'MarkerFaceColor','k')
 


Zwei kleinere Fragen dann noch:

(1) Gibt es die Möglichkeit, die Achsenskalierung von 1 - N auf 0 - 1 im 0.1-Schritt umzustellen. Der Befehl:
Code:

zeigt mir nur den einen Punkt (1,1) an!?

(2) die Angaben
Code:

         'MarkerSize',10,...
   'MarkerEdgeColor','k',...
   'MarkerFaceColor','k'
 

im plot() funktionieren nicht. Weiß vielleicht jemand woran es liegt?
Gruß,
FL
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2012, 09:25     Titel:
  Antworten mit Zitat      
Hallo anfaenger85,

Was genau bedeutet die "Achselnskalierung"? Wenn man die XTicks nciht manuell ändert, ist die Skalierung und die Limits der X-Achse ja konform zu den Daten. Wenn man aber per AXIS einen bestimmten Ausschnitt aus dem Diagramm wählt, der nicht alle Daten umfasst, schneidet man natürlich Daten ab.
Das praktischste wäre es also, die X-Werte der Daten gleich wie gewünscht zu setzen. Dann funktioniert auch das Zoomen perfekt.

Wann immer man im Forum "funktionieren nicht" schreibt, ist eine genaue Erklärung des Fehler nötig. Ansonsten erfordert eine Antwort zu viel Raterei, wo das Problem liegen könnte.
Dies betrifft übrigens nicht nur das goMatlab Forum, sondern auch andere Foren, und alle wissenschaftlichen Diskussionen, um um genau zu sein, alle anderen Diskussionen auch.
Bitte poste also noch die Details, z.B. die Fehlermeldung oder die Beschreibung des Unterschieds zwischen dem erhaltenen und dem gewünschten Ergebnis.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
anfaenger85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 10:22     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die Rückmeldung.
Das Problem ist, dass die x und y Werte im (tatsächlichen) Modell zwischen 0 und 1 liegen. Das sind die thetas und lambdas. In der Berechnung der Stabilitätsregion des Modells (siehe Code), benutze ich N Werte von theta und lambda zwischen 0 und 1. Die beiden Loops (i und j) gehen von 1 bis N, da es ja N Werte gibt für theta und lambda. Die Endmatrix "stabmat" (N*N) besteht aus nullen und einsen.
Code:

N = 20;
thetas = linspace(0.0001,0.9999,N);
lambdas = linspace(0.0001,0.9999,N);
stabmat = zeros(N,N);

for i = 1:N
    for j = 1:N
        theta = thetas(i);
        lambda = lambdas(j);

mu       = epsilon/(epsilon-1);
lambda_p    = (1-beta*theta)*(1-theta)/theta;
gamma_c     = (1-gamma_g)-(delta*alpha)/((rho+delta)*mu);
sigma_tilde = (gamma_c*mu*varphi+(1-alpha)*(1-lambda*(1+varphi)))/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_n     = lambda*(1-alpha)*(1+varphi)*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
theta_t     = lambda*mu*varphi/((1-lambda)*(mu*varphi*gamma_c+(1-alpha)));
gamma_i     = 1-gamma_c-gamma_g;

        steady;
        check;
       
        if sum(abs(oo_.dr.eigval)>1) > 6            
            stabmat(i,j) = 1;
            i
        end;
    end;
end;


Die jetzige Plot-Funktion beschriftet nun die beiden Achsen mit 1, 2, 3, 4, ... , N. Allerdings würde ich gerne die lambda und theta Werte (0 bis 1) abgebildet sehen.
Code:
[m,n]=find(stabmat==1);
plot(m,n,'ko')


Bei meinem ersten Eintrag oben wurden auch die tatsächlichen Werte der thetas und lambdas in die Achsen eingetragen. Das Problem war nur, dass in der Grafik selbst die Werte "0" und "1" an den jewiligen Punktorten angegeben wurden.
Gruß,
FL
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2012, 17:10     Titel:
  Antworten mit Zitat      
Hallo anfaenger85,

Ich verstehe das Problem immer noch nicht.
Die eigentlichen Daten gehen von 0.0001 bis 0.9999, aber Du benutzt stattdessen die Indices, welche von 1 bis N gehen. Aber du möchtest eigentliche die Werte der Daten selbst verwenden, oder? Dann wäre es doch naheliegend, die Daten selbst zu verwenden.
Code:

thetas = linspace(0.0001,0.9999,N);
lambdas = linspace(0.0001,0.9999,N);
...
[m,n]=find(stabmat==1);
plot(thethas(m), lambdas(n), 'ko')

Hilft das?

Gruß, Jan
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.