2012-01-07 3 views
19

मेरे पास निम्न कोड है और मैं चरण स्थान भूखंडों को एक ही आकृति में जोड़ना चाहता हूं।एक आकृति में एकाधिक भूखंड

मैंने कार्यों को कोड किया है, लेकिन मुझे नहीं पता कि MATLAB को उन्हें एक आकृति में कैसे रखा जाए। जैसा कि आप देखते हैं, यह चर r, a, b, और d बदलता है। मैं उन्हें कैसे जोड़ूं?

मैं quiver कमांड का उपयोग करके इन चरण अंतरिक्ष भूखंडों के वेक्टर फ़ील्ड को भी प्लॉट करना चाहता हूं, लेकिन यह काम नहीं करता है।

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

उत्तर

28

ठीक है, कुछ ही तरीके हैं कि एक ही आंकड़े में एकाधिक डेटा श्रृंखला कैसे प्रदर्शित की जा सकती है।

मैं एक साथ इसी रंग के साथ, एक छोटे से उदाहरण डेटा सेट का उपयोग करेगा:

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

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

सबसे पहले, जब आप एक ही धुरी पर सब कुछ चाहते हैं, आप hold समारोह की आवश्यकता होगी

Method 1

आप देखते हैं कि यह कई मामलों में सही है, हालांकि, यह दोनों बोआ की गतिशील सीमा के दौरान बोझिल हो सकता है ntities बहुत अलग है (उदा। u मान 1 से छोटे हैं, जबकि v मान बहुत अधिक हैं)।

दूसरा, जब आपके पास बहुत अधिक डेटा या अलग मात्रा होती है, तो अलग-अलग अक्ष होने के लिए subplot का उपयोग करना भी संभव है। मैंने x दिशा में अक्ष को जोड़ने के लिए फ़ंक्शन linkaxes का भी उपयोग किया। जब आप MATLAB में उनमें से किसी एक पर ज़ूम इन करते हैं, तो दूसरा एक ही एक्स रेंज प्रदर्शित करेगा, जो बड़े डेटा सेटों के आसान निरीक्षण के लिए अनुमति देता है।

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

subplots कुछ जगह बर्बाद करते हैं, लेकिन वे एक साजिश overpopulating के बिना एक साथ कुछ डेटा रखने के लिए अनुमति देते हैं।

अंत में, एक उदाहरण के एक अधिक जटिल विधि वही आंकड़ा plotyy समारोह का उपयोग करने पर अलग अलग मात्रा में प्लॉट करने के लिए के लिए के रूप में (या बेहतर अभी तक: R2016a के बाद से yyaxis समारोह)

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

यह निश्चित रूप से भीड़ दिखता है, लेकिन जब आप संकेतों की गतिशील सीमा में एक बड़ा अंतर रखते हैं तो यह आसान हो सकता है।

बेशक, इन तकनीकों के संयोजन का उपयोग करने से आपको कुछ भी बाधा नहीं देता है: hold onplotyy और subplot के साथ।

संपादित करें:

quiver के लिए, मैं शायद ही कभी उस आदेश का उपयोग करें, लेकिन किसी भी तरह, तुम भाग्यशाली मैं सदिश क्षेत्र भूखंडों की सुविधा के लिए एक समय पहले कुछ कोड लिखा है। जैसा कि ऊपर बताया गया है आप उसी तकनीक का उपयोग कर सकते हैं। मेरे कोड कठोर से दूर है, लेकिन यहाँ जाता है:

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

इस पैदावार: Quiver plot

आप किसी भी अधिक मार्गदर्शन चाहते हैं, मैं that link in my source बहुत उपयोगी पाया

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

जब के रूप में बुलाया (यद्यपि बुरी तरह स्वरूपित)।

इसके अलावा, आप MATLAB सहायता पर एक नज़र डालना चाहते हैं, यह वाकई बहुत अच्छा है। बस MATLAB में help quiver या doc quiver टाइप करें या ऊपर दिए गए लिंक का उपयोग करें (इन्हें doc के समान सामग्री देना चाहिए)।

+0

फिर से नमस्कार .. आपकी मदद के लिए बहुत बहुत धन्यवाद। अब मैं एक आंकड़े में सभी आंकड़ों को साजिश करने में कामयाब रहा हूं (मेरी आकृति पर नज़र डालें - यह अच्छा लग रहा है :)) क्या आप क्विवर कमांड का उपयोग करके दायर किए गए वेक्टर प्लॉट करने में भी मेरी मदद कर सकते हैं? ... user1135423

3

यदि आप एक ही आंकड़े पर सभी भूखंड चाहते हैं, तो केवल एक बार आकृति कमांड को कॉल करें। प्लॉट कमांड पर पहली कॉल के बाद कमांड पर रखें ताकि प्लॉट के लिए लगातार कॉल पिछले प्लॉट को ओवरराइट न करें।