我正在模拟盒子中的粒子。当粒子离开盒子时,其动能变为零(时间> t逸出)。因此,我想对Wkinet(它是nP =粒子数,ntM =时间步长的函数)如何随时间演变的直方图,但我不想考虑每列的零值。有没有一种方法可以对其进行编码,以便找到最佳数量的垃圾箱?
这是我尝试过的:
nbins = 1000;
for j = 1:ntM/5
Wkinet(Wkinet==0) = NaN;
y = Wkinet(:,j).*erg2eV;
end
histfit(y,nbins)
答案 0 :(得分:1)
一旦掌握了语法,逻辑索引通常会相当快速和直观。
myTolerance=1e-7; % in erg units.
nbins=1000;
for j=1:ntM/5
%Wkinet(Wkinet==0)=NaN;
% y=Wkinet(:,j).*erg2eV; % An extra assigment is costly and probably not needed.
H = histfit(Wkinet(abs(Wkinet(:,j))>myTolerance, j) * erg2ev, nbins);
% Select from column j all rows in column j whose absolute values are greater than the tolerance.
% Assumption; erg2ev is just a scalar, otherwise select its entries with erg2ev(abs(Wkinet(:,j))>myTolerance)
H(1).delete; Remove bins, only keep the fit.
set(gca, 'YScale', 'log'); % Make logarithmic Y
set(gca, 'XScale', 'log'); % Make logarithmic X
pause
end
如果需要显式限制轴,请使用
xlim([lowerBound upperBound]); ylim(etc...
...或者有时候使用axis命令进行精确控制会有所帮助,例如
ax=axis; ax(3)=min( 8ax(3) maxAllowedY]); axis(ax);
“暂停”(用于交互式使用)可以由打印命令代替,以将图保存到磁盘。例如
print(sprintf('My_plot_%02d',j),'-dpng');
或保存图形:
savefig(sprintf('My_fig_%02d',j));
如果确定打印数量少于16个,则可以在循环中放置一个subplot命令。将暂停替换为
subplot(4,4,j);
最后的笔记;如果您打算绘制适合非零数据的正态分布,则使用
替换histfit函数可能会获得更好的结果myFit = fitdist(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev), 'Normal');
maxEv = max(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev);
myX = [myTolerance; maxEv/100; maxEv]; % Alter for different plot X-axis
myY = pdf(myFit, myX);
plot(myX, myY);
我检查了一下,fitdist和histdist之间存在差异,可能是由于bin离散化造成的。