Я запускаю симуляцию частиц в коробке. Когда частица покидает ящик, ее кинетическая энергия становится равной нулю (за время > t выхода). Итак, я хочу построить гистограмму того, как Wkinet (которая является функцией nP = количество частиц, ntM = временных шагов) развивается во времени, но я не хочу принимать во внимание нулевые значения каждого столбца. Есть ли способ закодировать его, чтобы он мог найти оптимальное количество бункеров?
Это то, что я пробовал:
nbins = 1000;
for j = 1:ntM/5
Wkinet(Wkinet==0) = NaN;
y = Wkinet(:,j).*erg2eV;
end
histfit(y,nbins)
Как я мог это сделать? Также одна проблема заключается в том, что он показывает мне только последнюю гистограмму для финала j, как я могу решить эту проблему и заставить ее отображать все гистограммы на одном графике? заранее спасибо
Старайтесь не перезаписывать y
каждую итерацию цикла.
Можете ли вы объяснить, как я могу это сделать, пожалуйста?
Логическое индексирование часто бывает довольно быстрым и интуитивно понятным, если вы освоите синтаксис.
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...
... или иногда полезно использовать команду оси для точного управления, например.
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, вероятно, вызванная дискретизацией бина.
спасибо! Не могли бы вы также помочь мне сделать график похожим на этот ... я имею в виду только показать подгонку, а не столбцы, быть нормированным по оси Y и иметь те же ограничения по оси X я добавил изображение в изначальный вопрос? @ЭрикП
Обновления о том, как вы удаляете графики, как изменить масштаб на логарифмическую ось и как ограничить масштабы. Неясно, какую нормализацию вы ищете на графике PDF. Потенциально вы можете проверить YData H(2) для дальнейших манипуляций.
Добавлено примечание о функции fitdist
, которая, вероятно, более точно соответствует тому, что вы делаете.
Большое спасибо! Хотя второй не работает (у него несбалансированное предложение, и вы хотели сказать pdf в myY? .. Что я имел в виду по оси Y, так это то, что я хочу показать процент и переход от нуля к 1. @ЭрикП
@nikos, да, я имел в виду pdf, отредактированный. Хотя не видел, где импаланс. Я не уверен, какой процент вам нужен. Если это% максимальной плотности, вы можете просто масштабировать, разделив на max(myY).
Почему бы не сделать гистограмму с нулями, а затем просто удалить эту ячейку?