在MATLAB中使用蒙特卡罗方法模拟连续衰减

计算科学 matlab 蒙特卡洛
2021-12-26 18:16:05

我正在尝试使用 MATLAB 通过使用蒙特卡罗方法来模拟原子衰变过程。过程如下:

假设原子 1 衰变为原子 2,原子 2 又衰变为稳定的类型 3 原子。1 和 2 的衰变常数λ1λ2

假设在t=0N1=N0N2=N3=0

λ1=0.0001 , , 进程为λ2=0.00005tMAX150000s

我对蒙特卡洛方法不是很熟悉,所以我只设法模​​拟了单次衰减过程。当谈到连续衰减时,我完全迷失了。

我在下面附上了我的单衰变脚本。希望能在这里得到帮助。

N0=input('Enter total number of nuclides: '); %Determine N0
lambda1 = 0.0001; %decays/s
dt = 100; %time step
M = 1500; % total number of time steps
t = 0:dt:(M-1)*dt; %time series
p = lambda1*dt; %probability of having a decay in the time dt

% Define the array that will be populated with the number of atoms at each time step N = zeros(M,1);

N(1) = N0;

for j=2:M % Loop over time
    nd = 0; % number of decays
    for i=1:N(j-1)
        %generate a single random number  
        r = rand();
        %binary value =1 if the condition is True -> Atom has decayed
        rb = r < dt*lambda1; 
        if rb == 1
           nd = nd+1;
        end    
    end
    N(j) = N(j-1)-nd; % number of atoms left at the step 2
end

plot(t, N)
1个回答

放射性同位素的衰变可以用一组耦合的一阶微分方程其中衰变为同位素相关的衰变常数是总的衰减常数的时间依赖性浓度

dNi(t)dt=λiNi(t)+jiλjiNj(t)
λjijiλiiNi(t)i

这可以很容易地写成矩阵形式其中通常非常稀疏。与这组耦合微分方程相关的数值困难是双重的:

dN¯(t)dt=A¯N¯(t)
A¯

  1. 系统可能很大(在我们的应用程序中,我们跟踪大约 3500 种同位素)
  2. 由于衰变常数之间的巨大差异,系统非常僵硬(一些同位素衰变的半衰期以毫秒为单位,另一些则以数百万年为单位)

幸运的是,存在可以处理这些问题的求解器:用于刚性 ODE 集的求解器,例如隐式 Runge-Kutta 方法 ( RADAU ) 或基于矩阵指数方法 ( CRAM ) 的方法。RADAU 在此问题上的应用在加速器驱动系统中核心燃耗、结构材料激活和散裂产物累积的高级方法中进行了描述(请注意,我是本文的合著者)。

我认为使用蒙特卡洛方法解决这个问题没有任何理由或优势。你打算模拟放射性衰变的随机性吗?为什么?