2017-01-12 4 views
0

Ich arbeite an etwas ähnlich dem folgenden Beispiel: Ich möchte <x(t)> das ist der Durchschnitt einer Funktion x(t) über die Anzahl der Simulationen berechnen. Um dies zu tun, erzeuge ich den folgenden Code:berechnen den Durchschnitt über die Simulation für verschiedene Parameter Werte

sim=50;% number of simulations 
t=linspace(0,1);% time interval 

a_range=[1,2,3];% different values for the parameter a 
b_range=[0,0.5,1];% different values for the parameter b 
z=zeros(1,sim); 
theta=zeros(1,sim); 

for nplot=1:3 
    a=a_range(nplot); 
    b=b_range(nplot); 
    average_x=zeros(nplot,sim); 
    for i=1:sim 
     z(i)=rand(1);% random number for every simulation 
     theta(i)=pi*rand(1);% random number for every simulation  
    x=z(i)*t.^2+a*sin(theta(i))+b.*tan(theta(i));% the function 

    end 
    average_x(nplot,sim)=mean(x);% average over the number of simulations 
end 

fname=['xsin.mat']; 
save(fname) 

Es ist ein Vektor 1 von 100 und x ein Vektor 1 von 100 und average_x ist 1 von 50. Was ich suche ist ein schreiben Skript, um die Datei zu laden und den Durchschnitt für verschiedene Parameter a und b gegen die Zeit aufzuzeichnen. Deshalb möchte ich einen Code schreiben, drei Figuren zu erzeugen, so dass in Abbildung 1 Ich werde die durchschnittliche

plot(t,average_x) 

für a = 1 und b = 0 plotten.

Dann in Abbildung 2 werde ich den Durchschnitt wieder zeichnen, aber für a = 2 und b = 0,5 und so weiter. Das Problem ist die Dimension der Zeit t und der Durchschnitt sind nicht gleich. Wie kann ich dieses Problem beheben und drei verschiedene Zahlen generieren?

+0

Sie möchten 50 Werte gegen 100 Werte darstellen. Dies ist unmöglich, ohne 50 Werte anstelle von 100 zu wählen ** oder ** die 50 Werte auf 100 zu interpolieren. – EBH

Antwort

2

Wenn ich Ihre Absicht richtig bekam, ist es das, was Sie suchen:

sim = 50;% number of simulations 
t = linspace(0,1);% time interval 

a_range = [1,2,3];% different values for the parameter a 
b_range = [0,0.5,1];% different values for the parameter b 

% NO NEED TO GENERATE THE RANDOM NUMBERS ONE BY ONE: 
theta = pi*rand(sim,1);% random number for every simulation 
z = rand(sim,1); % random number for every simulation 

% YOU SOULD INITIALIZE ALL YOUR VARIABLES OUTSIDE THE LOOPS: 
x = zeros(sim,numel(t)); 
average_x = zeros(3,numel(t));% the mean accross simulations 
% for average accros time use: 
% average_x = zeros(3,sim); 

for nplot=1:3 
    a = a_range(nplot); 
    b = b_range(nplot); 
    for i=1:sim 
     x(i,:) = z(i)*t.^2+a*sin(theta(i))+b.*tan(theta(i));% the function 
    end 
    average_x(nplot,:) = mean(x); % average over the number of simulations 
    % average_x(nplot,:) = mean(x,2); % average accross time 
end 
% save the relevant variables: 
save('results.mat','average_x','t') 

In einer anderen Datei können Sie schreiben:

load('results.mat') 
for k = 1:size(average_x,1) 
    figure(k) 
    plot(t,average_x(k,:)) 
    title(['Parameter set ' num2str(k)]) 
    xlabel('Time') 
    ylabel('mean x') 
end 

Dies ist die Handlung in einer Figur (wenn Sie möchten dann durchschnittlich über Simulationen):

mean sim


BTW, wenn Sie Ihren Code kompakter und schneller machen möchten, können Sie ihn vektorisieren, hauptsächlich unter Verwendung bsxfun. Hier ist eine Demonstration mit Ihrem Code:

% assuming all parameters are defined as above: 
zt = bsxfun(@times,z,t.^2); % first part of the function 'z(i)*t.^2' 
% second part of the function 'a*sin(theta(i)) + b.*tan(theta(i))': 
ab = bsxfun(@times,a_range,sin(theta)) + bsxfun(@times,b_range,tan(theta)); 
% convert the second part to the right dimensions and size: 
ab = repmat(reshape(ab,[],1,3),1,numel(t),1); 
x = bsxfun(@plus,zt,ab); % the function 
average_x = squeeze(mean(x)); % take the mean by simulation 
plot(t,average_x) % plot it all at once, as in the figure above 
xlabel('Time') 
ylabel('mean x') 
+0

Vielen Dank für Ihren Beitrag. Wenn ich richtig bin, ist Fig. 1 das Diagramm des Durchschnitts über die Simulation gegen die Zeit, d. H. Die x-Achse ist die Zeit. Also sollte es plot (t, average_x) sein. Ich werde verwirrt, wenn ich zur For-Schleife komme. Wenn es Ihnen nichts ausmacht, mich zu korrigieren, wenn ich falsch liege: x (i, :) bedeutet für jede Simulation, berechnen Sie die Funktion und speichern Sie den Wert in Zeile i. Sie beenden also die Schleife mit x 50 mal 100. Dann bedeutet Average_x (nplot, :), dass für jeden nplot und über alle Spalten das Mittel (x) berechnet und es zu average_x (nplot, :) zugewiesen wird. Wie kann ich feststellen, dass der Mittelwert (x) den Mittelwert über die Simulationen berechnet? – David

+0

Ich suche nach etwas wie Abbildung 1, aber sollte nicht eine Zufälligkeit in der Kurve sein, weil die Funktion und so der Mittelwert in Bezug auf die Zufallsvariablen 'z' und 'theta' definiert sind. Oder ist es wahr, dass das Mittel der Zufallsfunktion eine glatte Kurve wäre? Auch hier ist der Code, den Sie geschrieben haben, was ich suche und ich warte darauf, wie ich die Datei speichern und dann den Durchschnitt in drei verschiedenen Zahlen darstellen kann. – David

+0

Der Grund, warum Sie keine Zufälligkeit sehen, ist, dass 'z' und' theta' in Bezug auf Zeit und Variable nur zwischen Simulationen "konstant" sind. Da Sie über Simulationen hinweg mitteln (d. H. Sie nehmen 50 Werte pro Zeitschritt), fallen alle verschiedenen 'z' und' theta' pro Zeitschritt in einen Wert zusammen, und es gibt keine Zufälligkeit. – EBH

Verwandte Themen