2012-01-07 23 views
19

Ho il seguente codice e voglio combinare i grafici dello spazio di fase in una singola figura.Più grafici in una figura

Ho codificato le funzioni, ma non so come rendere MATLAB in una sola cifra. Come vedete, sono le variabili r, a, b e d che cambia. Come li combino?

Vorrei anche tracciare il campo vettoriale di questi diagrammi di spazio di fase utilizzando il comando quiver, ma semplicemente non funziona.

%function lotkavolterra 
% Plots time series and phase space diagrams. 
clear all; close all; 
t0 = 0; 
tf = 20; 
N0 = 20; 
P0 = 5; 

% Original plot 
r = 2; 
a = 1; 
b = 0.2; 
d = 1.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 

% Phase space plot 

figure 
quiver(N,P); 
axis([0 50 0 10]) 
%axis tight 


% Change variables 
r = 2; 
a = 1.5; 
b = 0.1; 
d = 1.5; 

%time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 


% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% Change variables 
r = 2; 
a = 1; 
b = 0.2; 
d = 0.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 


% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% Change variables 
r = 0.5; 
a = 1; 
b = 0.2; 
d = 1.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 

% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% FUNCTION being called from external .m file 

%function dx = lv_eq(t,x,r,a,b,d) 
%N = x(1); 
%P = x(2); 
%dN = r*N-a*P*N; 
%dP = b*a*P*N-d*P; 
%dx = [dN;dP]; 

risposta

28

Bene, ci sono alcuni modi in cui è possibile visualizzare più serie di dati nella stessa figura.

userò un piccolo set di dati di esempio, insieme con i colori corrispondenti:

%% Data 
t = 0:100; 
f1 = 0.3; 
f2 = 0.07; 
u1 = sin(f1*t); cu1 = 'r'; %red 
u2 = cos(f2*t); cu2 = 'b'; %blue 
v1 = 5*u1.^2;  cv1 = 'm'; %magenta 
v2 = 5*u2.^2;  cv2 = 'c'; %cyan 

Prima di tutto, quando si vogliono tutto sullo stesso asse, è necessario la funzione hold:

%% Method 1 (hold on) 
figure; 
plot(t, u1, 'Color', cu1, 'DisplayName', 'u1'); hold on; 
plot(t, u2, 'Color', cu2, 'DisplayName', 'u2'); 
plot(t, v1, 'Color', cv1, 'DisplayName', 'v1'); 
plot(t, v2, 'Color', cv2, 'DisplayName', 'v2'); hold off; 
xlabel('Time t [s]'); 
ylabel('u [some unit] and v [some unit^2]'); 
legend('show'); 

Method 1

Si vede che questo è giusto in molti casi, tuttavia, può diventare ingombrante quando la gamma dinamica di entrambi le cose differiscono molto (ad es. i valori di u sono inferiori a 1, mentre i valori di v sono molto più grandi).

In secondo luogo, quando si dispone di molti dati o di quantità diverse, è anche possibile utilizzare subplot per avere assi diversi. Ho anche utilizzato la funzione linkaxes per collegare gli assi nella direzione x. Quando si ingrandisce uno di questi in MATLAB, l'altro visualizzerà lo stesso intervallo x, che consente di ispezionare più facilmente i set di dati più grandi.

%% Method 2 (subplots) 
figure; 
h(1) = subplot(2,1,1); % upper plot 
plot(t, u1, 'Color', cu1, 'DisplayName', 'u1'); hold on; 
plot(t, u2, 'Color', cu2, 'DisplayName', 'u2'); hold off; 

xlabel('Time t [s]'); 
ylabel('u [some unit]'); 
legend(gca,'show'); 

h(2) = subplot(2,1,2); % lower plot 
plot(t, v1, 'Color', cv1, 'DisplayName', 'v1'); hold on; 
plot(t, v2, 'Color', cv2, 'DisplayName', 'v2'); hold off; 

xlabel('Time t [s]'); 
ylabel('v [some unit^2]'); 
legend('show'); 

linkaxes(h,'x'); % link the axes in x direction (just for convenience) 

Method 2

Sottotrame fanno sprecare un pò di spazio, ma permettono di tenere insieme alcuni dati senza overpopulating una trama.

Infine, come esempio di un metodo più complesso per tracciare diversi quantitativi nella stessa figura utilizzando la funzione plotyy (o meglio: la funzione yyaxis dal R2016a)

%% Method 3 (plotyy) 
figure; 
[ax, h1, h2] = plotyy(t,u1,t,v1); 
set(h1, 'Color', cu1, 'DisplayName', 'u1'); 
set(h2, 'Color', cv1, 'DisplayName', 'v1'); 
hold(ax(1),'on'); 
hold(ax(2),'on'); 
plot(ax(1), t, u2, 'Color', cu2, 'DisplayName', 'u2'); 
plot(ax(2), t, v2, 'Color', cv2, 'DisplayName', 'v2'); 

xlabel('Time t [s]'); 
ylabel(ax(1),'u [some unit]'); 
ylabel(ax(2),'v [some unit^2]'); 

legend('show'); 

Method 3

Questo certamente sembra affollato, ma può tornare utile quando si ha una grande differenza nella gamma dinamica dei segnali.

Naturalmente, nulla ti impedisce di utilizzare una combinazione di queste tecniche insieme: hold on insieme a plotyy e subplot.

edit:

Per quiver, io uso raramente quel comando, ma in ogni caso, si è fortunati Ho scritto un codice un po 'indietro per facilitare trame campo vettoriale. Puoi usare le stesse tecniche come spiegato sopra. Il mio codice è tutt'altro che rigorosa, ma qui va:

function [u,v] = plotode(func,x,t,style) 
% [u,v] = PLOTODE(func,x,t,[style]) 
% plots the slope lines ODE defined in func(x,t) 
% for the vectors x and t 
% An optional plot style can be given (default is '.b') 

if nargin < 4 
    style = '.b'; 
end; 
% http://ncampbellmth212s09.wordpress.com/2009/02/09/first-block/ 
[t,x] = meshgrid(t,x); 

v = func(x,t); 
u = ones(size(v)); 
dw = sqrt(v.^2 + u.^2); 

quiver(t,x,u./dw,v./dw,0.5,style); 
xlabel('t'); ylabel('x'); 

quando viene chiamato come:

logistic = @(x,t)(x.* (1-x)); % xdot = f(x,t) 
t0 = linspace(0,10,20); 
x0 = linspace(0,2,11); 

plotode(@logistic,x0,t0,'r'); 

questa rendimenti: Quiver plot

Se si desidera più una guida, ho trovato that link in my source molto utile (anche se formattato male).

Inoltre, potresti dare un'occhiata all'aiuto di MATLAB, è davvero grandioso. Basta digitare help quiver o doc quiver in MATLAB o usare i collegamenti che ho fornito sopra (questi dovrebbero dare lo stesso contenuto di doc).

+0

Ciao di nuovo .. Grazie mille per il vostro aiuto. Ora sono riuscito a tracciare tutte le figure in una sola figura (guarda la mia figura - sembra carina :)) Potresti aiutarmi anche a tracciare il vettore archiviato usando il comando faretra? ... user1135423

3

Se si desidera che tutti i grafici siano sulla stessa figura, chiamare il comando di figura una sola volta. Utilizzare il comando su dopo la prima chiamata al comando plot in modo che le successive chiamate al grafico non sovrascrivano i grafici precedenti.

Problemi correlati