web-dev-qa-db-fra.com

Plusieurs parcelles en une seule figure

J'ai le code suivant et je veux combiner des tracés d'espace de phase en une seule figure.

J'ai codé les fonctions, mais je ne sais pas comment MATLAB peut les mettre en une seule figure. Comme vous le voyez, ce sont les variables r, a, b et d qui changent. Comment les combiner?

Je voudrais également tracer le champ vectoriel de ces tracés d'espace de phase à l'aide de la commande quiver , mais cela ne fonctionne tout simplement pas.

%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];
20
user1135423

Eh bien, il existe plusieurs façons d'afficher plusieurs séries de données dans la même figure.

Je vais utiliser un petit exemple de jeu de données, avec les couleurs correspondantes:

%% 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

Tout d'abord, lorsque vous voulez que tout soit sur le même axe, vous aurez besoin de la fonction 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

Vous voyez que cela est vrai dans de nombreux cas, cependant, cela peut devenir lourd lorsque la plage dynamique des deux quantités diffère beaucoup (par exemple, les valeurs u sont inférieures à 1, tandis que les valeurs v sont beaucoup plus grandes).

Deuxièmement, lorsque vous avez beaucoup de données ou des quantités différentes, il est également possible d'utiliser subplot pour avoir des axes différents. J'ai également utilisé la fonction linkaxes pour relier les axes dans la direction x. Lorsque vous zoomez sur l'un d'eux dans MATLAB, l'autre affiche la même plage x, ce qui permet une inspection plus facile des ensembles de données plus volumineux.

%% 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

Les sous-parcelles gaspillent un peu d'espace, mais elles permettent de garder certaines données ensemble sans surpeupler une parcelle.

Enfin, comme exemple d'une méthode plus complexe pour tracer différentes quantités sur la même figure en utilisant la fonction plotyy (ou mieux encore: la yyaxis fonction depuis 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

Cela semble certainement bondé, mais cela peut être utile lorsque vous avez une grande différence dans la plage dynamique des signaux.

Bien sûr, rien ne vous empêche d'utiliser une combinaison de ces techniques ensemble: hold on avec plotyy et subplot.

modifier:

Pour quiver , j'utilise rarement cette commande, mais de toute façon, vous avez de la chance d'avoir écrit du code il y a quelque temps pour faciliter les tracés de champs vectoriels. Vous pouvez utiliser les mêmes techniques que celles expliquées ci-dessus. Mon code est loin d'être rigoureux, mais voici:

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');

Lorsque appelé comme:

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'); 

cela donne: Quiver plot

Si vous voulez plus de conseils, j'ai trouvé ce lien dans ma source très utile (bien que mal formaté).

Aussi, vous voudrez peut-être jeter un œil à l'aide de MATLAB, c'est vraiment génial. Tapez simplement help quiver ou doc quiver dans MATLAB ou utilisez les liens que j'ai fournis ci-dessus (ceux-ci devraient donner le même contenu que doc).

29
Egon

Si vous voulez que tous les tracés sur la même figure, appelez la commande figure une seule fois. Utilisez la commande hold on après le premier appel à la commande plot afin que les appels successifs à plot ne remplacent pas les tracés précédents.

3
Kavka