Tengo el siguiente código y quiero combinar el espacio de fase de las parcelas en una sola figura.

Me han codificado las funciones, pero no sé cómo hacer MATLAB ponerlos en una sola figura. Como se puede ver, son las variables r, a, b, y d que cambia. ¿Cómo combinarlos?

También me gustaría trazar el vector de campo de estos fase de espacio de las parcelas con el carcaj comando, pero simplemente no funciona.

%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];
InformationsquelleAutor user1135423 | 2012-01-07

2 Comentarios

  1. 29

    Bien, hay un par de maneras de cómo varias series de datos se pueden mostrar en la misma figura.

    Voy a utilizar un ejemplo pequeño conjunto de datos, junto con los colores correspondientes:

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

    Primero de todo, cuando usted quiere que todo en el mismo eje, será necesario que el mantenga pulsado función:

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

    Varias parcelas en una sola figura

    Puede ver que esto es cierto en muchos casos, sin embargo, puede resultar incómodo cuando el rango dinámico de ambas cantidades difieren mucho (por ejemplo, la u valores son menores que 1, mientras que el v valores son mucho mayores).

    En segundo lugar, cuando usted tiene un montón de datos o cantidades diferentes, también es posible utilizar subtrama tener diferentes ejes. También he usado la función linkaxes para vincular los ejes en la dirección x. Al acercarse a cualquiera de ellos en MATLAB, el otro va a mostrar la misma serie x, que permite una fácil inspección de los conjuntos de datos más grandes.

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

    Varias parcelas en una sola figura

    Subparcelas hacer perder un poco de espacio, pero que permiten mantener algunos datos juntos sin overpopulating una parcela.

    Finalmente, como un ejemplo más complejo método para trazar diferentes cantidades en la misma figura el uso de la plotyy función (o mejor aún: el yyaxis función desde 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'); 

    Varias parcelas en una sola figura

    Este sin duda se ve lleno de gente, pero puede venir en práctico cuando usted tiene una gran diferencia en el rango dinámico de las señales.

    Por supuesto, nada impide el uso de una combinación de estas técnicas: hold on junto con plotyy y subplot.

    edición:

    Para carcaj, yo rara vez uso el comando, pero de todos modos, estás de suerte que escribí el código de un tiempo para facilitar el vector de las parcelas de campo. Usted puede utilizar las mismas técnicas, como se explicó anteriormente. Mi código está lejos de ser riguroso, pero aquí 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');

    Cuando se llama como:

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

    este rendimientos:
    Varias parcelas en una sola figura

    Si quieres obtener más información, he encontrado ese enlace en mi fuente de muy útil (aunque mal formateados).

    También, es posible que desee echar un vistazo a la ayuda de MATLAB, es realmente muy bueno. Justo el tipo de help quiver o doc quiver en MATLAB o utilice los enlaces que he proporcionado anteriormente (estos deben dar el mismo contenido que doc).

    • Hola de nuevo .. muchas Gracias por su ayuda. Ahora he conseguido parcela de todas las figuras en una sola figura (ver mi figura – se ve bien 🙂 ) me Podrían ayudar también a la trama del vector presentado utilizando la aljaba de comando? … <img src=»myupload.ns/v/1mSfH-Vcm.PNG«
  2. 3

    Si quieres todas las parcelas en la misma figura, llame a la figura comando sólo una vez. El uso de la mantenga en comando después de la primera llamada a la trama de comando, por lo que las sucesivas llamadas a la parcela no sobrescribir el anterior parcelas.

Dejar respuesta

Please enter your comment!
Please enter your name here