循环混乱

时间:2019-06-12 11:07:01

标签: matlab while-loop

我正在尝试创建一个while循环,该循环使用Bethe-Bloch方程计算重电荷粒子的停止功率和范围。我在设置循环以在每次循环时都保存每个值时遇到麻烦。

这个想法是,我有一个方程式Stopping Power(-dEdx),当给出初始能量值时,它给出了dx上损失了多少能量的值。

在这里的示例代码中,初始Energy = 250(MeV),我正在尝试计算每个dx的新能量。这看起来应该像 E = 250、249.99、249.96等 我不是100%知道回路是否还有其他问题,但是我主要无法弄清楚如何保持E的每个单独值,这样我就可以在总距离x上绘制能量的变化。 / p>

该公式似乎只为E吐出1个值,并且没有填写其他所有列。

任何帮助将不胜感激!

clear
clc

c = 2.998e10;
pm = 938.272; % proton mass
em = 0.510991; % electron mass
re = 2.818e-13; % classical electron radius
z = 1; % charge of proton (+)
na = 6.022e23; % avagadros number
rho = 1;
dx = 0.01;
x = 0:dx:350;    % 350mm = 35cm
n = na.*10./18.*rho;
E = x*0;
E(1) = 250;

while E > 0
    gam = E./pm + 1;
    beta = sqrt(gam.^2-1)./gam;
    dEdx = (4.*pi.*n.*z^2.*em.*re.^2)./beta.*(log(2.*em.*c.^2.*beta.^2./(75.*(1-beta.^2)))-beta.^2);
    dE = -dEdx.*dx;
    E(x(E)) = E(x(E)) + dE;
end

在每次迭代中保留gam,beta,dEdx,dE,E的所有值可能会很有用。例如 E = [250,249.99,249.96,...,0]

谢谢!

2 个答案:

答案 0 :(得分:0)

您的问题在E(x(E)) = E(x(E)) + dE;

运行循环时,E = 250,并且E中只有1个元素,因此x(E)是某个数字(x的第250个元素),然后E(x(E))是E的元素,其中该索引。通常,这将导致错误,因为在您的示例中x(E)不能保证是整数,但是它只是没有按照您希望的方式工作。为了实现您的目标,您需要一个索引变量:

index=1;
E(index)=250;

while E(index) > 0
    gam = E(index)/pm + 1;
    beta = sqrt(gam^2-1)/gam;
    dEdx = (4.*pi.*n.*z^2.*em.*re.^2)./beta.*(log(2.*em.*c.^2.*beta.^2./(75.*(1-beta.^2)))-beta.^2);
    dE = -dEdx*dx;
    E(index+1) = E(index) + dE;
    index=index+1;
end

您可能还要解决另一个矛盾之处。您正在以固定的最大值提前设置x,但在计算E时并没有强制执行该最大值。如果要使用while循环并确保获得E的完全衰减,则不应提前定义x时间,而是在知道需要多长时间后才在末尾创建它。另外,如果您只想达到x的最大值,则可以使用for循环而不是while循环,并且将内置索引变量。

答案 1 :(得分:0)

对于任何陷入类似问题的问题的人来说,这要感谢约翰回答了这个问题,这是更新后的代码,看起来非常正常。

clear
clc

c = 2.998e10;
pm = 938.272; % proton mass
em = 0.510991; % electron mass
re = 2.818e-13; % classical electron radius
z = 1; % charge of proton (+)
na = 6.022e23; % avagadros number
rho = 1;
dx = 0.01;
x = 0:dx:350;    % Expected Maximum range: 350mm = 35cm
n = na.*10./18.*rho;

dEdx = x*0;
dE = x*0;
E = x*0;

i = 1;
E(i) = 250;

while E(i) > 0
    gam = E./pm + 1;
    beta = sqrt(gam.^2-1)./gam;
    dEdx = ((4.*pi.*n.*z^2.*em.*re.^2)./beta).*(log(2.*em.*c.^2.*beta.^2./...
    (75.*(1-beta.^2)))-beta.^2);

    dE(i) = -dEdx(i).*dx;
    E(i+1) = E(i) + dE(i);
    i = i + 1;
end
相关问题