Не получаются правильные расчеты
Задача следующая:
10 частиц распределены вдоль линии по Z, т.е. по направлению движения
Расстояние между частицами одинаково.
Q = 10 нКл – заряд каждой частицы.
Масса каждой частицы равна массе электрона.
L = 0,004 см – длина последовательности частиц.
N= 10 - кол-во частиц,
W = 10 МеВ – начальная полная энергия частиц.
Частицы начинают двигаться вдоль положительного направления оси Z
Найти распределение энергии между частицами после прохождения 1 см пути, учитывая только
Кулоновское взаимодействие.*
Для решения задачи я написал следующий код в Matlab (версия R2020b)
clc
clear
N=10;
dt=1*10^-12;
q=10^-9;
eps0=8.85*10^-12;
c=3*10^8;
pi=3.1415926;
m=9.1*10^-31;
k=1/(4*pi*eps0);
W=[1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13 1.6*10^-13];
R=[0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0; 4*10^-5 8*10^-5 12*10^-5 16*10^-5 20*10^-5 24*10^-5 28*10^-5 32*10^-5 36*10^-5 4*10^-4];
dp=zeros(3,N);
dr=zeros(3,N);
V=zeros(3,N);
F_Q_2=zeros(3,N,N);
F_Q=zeros(3,N);
F_Q2=zeros(3,N);
Z=zeros(1,N);
p=zeros(3,N);
X=[];
Y=[];
Z=[];
R=vpa(R);
while R(3,10)<4*10^-4+10^-2
F_Q = ForceQ(F_Q, R,N,k,q);
for i=1:N
p(3,i)=sqrt((W(1,i)^2/c^2)-(m^2*c^2));
V(3,i)=((c^2/W(1,i))*p(3,i));
dp=F_Q(1:3,i)*dt;
p(1:3,i)=p(1:3,i)+dp;
pn=sqrt(p(1,i).^2+p(2,i).^2+p(3,i).^2);
W(1,i)=c*sqrt(pn^2+m^2*c^2);
V(1:3,i)=(c^2/W(1,i))*p(1:3,i);
dr(1:3,i)=V(1:3,i).*dt;
R(1:3,i)=R(1:3,i)+dr(1:3,i);
R = real(R);
Z(1,i) = R(3,i);
end
end
colormap hot
plot(Z(1:N),W(1:N), '.');
ylabel('\itW, Дж','fontsize',14)
xlabel('\itZ, м','fontsize',14)
function F_Q = ForceQ(F_Q2, R,N,k,q)
R = circshift(R,1,2);
for count=1:N
F_Q_2=zeros(3,N,N);
R = circshift(R,-1,2);
for var=2:N
r=sqrt((R(1,var)-R(1,1))^2+(R(2,var)-R(2,1))^2+(R(3,var)-R(3,1))^2);
force=(k*q^2)/r^2;
alpha=asin(real(R(3,var)-R(3,1))/r);
rxy=r*cos(alpha);
gamma=asin(real(R(2,var)-R(2,1))/rxy);
gamma2=asin(real(R(1,var)-R(1,1))/rxy);
F_Q_2(1,1,var)=F_Q2(1,count)-(force*1*sin(gamma2));
F_Q_2(2,1,var)=F_Q2(2,count)-(force*1*sin(gamma));
F_Q_2(3,1,var)=F_Q2(3,count)-(force*sin(alpha));
end
F_Q1 = sum(F_Q_2,3);
F_Q(:,count) = F_Q1(:,1);
end
end
Опуская физику, чисто математически мне нужно построить зависимость W от Z, причем частицы должны менять координаты таким образом, что первые 5 двигаются в отрицательном направлении, оставшиеся 5 - в положительном. В корректности формул я уверен, однако расчеты получаются не совсем верными. Проверял в debug, первые два прохода в цикле while считаются корректно, на 3 проход уже при вызове функции F_Q на выходе значения численно верные, но знаки у 5 и 6 частиц инверсно меняются (должно быть -число у 5 и +число у 6, а на выходе наоборот). Причем функцию F_Q проверял в отдельном файле с циклом for, считается корректно. Соответственно, из-за этого портятся все остальные расчеты координат и на выходе к концу цикла while получается совершенно не то, что должно быть. Пробовал также использовать другой вариант расчета F_Q без использования функции, через циклы, однако там проблема встает при расчете проекций вектора. Код вот (прикрепляю уже сам цикл, тк начальные условия до цикла те же):
while R(3,10)<4*10^-2
for i=1:N
p(3,i)=sqrt((W(1,i)^2/c^2)-(m^2*c^2));
V(3,i)=((c^2/W(1,i))*p(3,i));
for var=i+1:N
r=sqrt((R(1,var)-R(1,i))^2+(R(2,var)-R(2,i))^2+(R(3,var)-R(3,i))^2);
force=(k*q^2)/r^2;
alpha=asin(abs(R(3,var)-R(3,i))/r);
rxy=r*cos(alpha);
gamma=asin(abs(R(2,var)-R(2,i))/rxy);
F_Qx(1,i)=F_Qx(1,i)+(force*cos(alpha)*cos(gamma));
F_Qy(1,i)=F_Qy(1,i)+(force*cos(alpha)*sin(gamma));
F_Qz(1,i)=F_Qz(1,i)+(force*cos(alpha));
F_Qx(1,var)=F_Qx(1,var)-(force*cos(alpha)*cos(gamma));
F_Qy(1,var)=F_Qy(1,var)-(force*cos(alpha)*sin(gamma));
F_Qz(1,var)=F_Qz(1,var)-(force*cos(alpha));
F_Q(1:3,i)=[F_Qx(1,i); F_Qy(1,i); F_Qz(1,i)];
F_Q(1:3,var)=[F_Qx(1,var); F_Qy(1,var); F_Qz(1,var)];
end
end
for i=1:N
F=F_Q(1:3,i);
dp=F*dt;
p(1:3,i)=p(1:3,i)+dp;
pn=sqrt(p(1,i).^2+p(2,i).^2+p(3,i).^2);
W(1,i)=c*sqrt(pn^2+m^2*c^2);
V(1:3,i)=(c^2/W(1,i))*p(1:3,i);
dr(1:3,i)=V(1:3,i).*dt;
R(1:3,i)=R(1:3,i)+dr(1:3,i);
R = real(R);
Z = R(1:N);
end
end
colormap hot
plot(Z(1:N),W(1:N), '.');
ylabel('\itW, Дж','fontsize',14)
xlabel('\itZ, м','fontsize',14)
Я не понимаю в чем причина неправильных расчетов, мои предположения в том, что либо я неправильно оформил порядок в цикле, либо расчет портит circshift (эту функцию я использовал в другой похожей программе, расчет F_Q велся аналогично, и в целом там все работало корректно).
Ответы (2 шт):
По условию у вас L=4 10^-3 см, а вы задаёте длину последовательности 4 10^-4 неясно чего. По идее, надо переводить в метры, тогда должна быть 3-я строка у R такого вида: (4:4:40) 10^-6.
Далее, опять же по условию, W = 10 МэВ, это 1,6 10^-12 Дж, а вы пишете W = 1.6 10^-13.
И q должно быть равно 10^-8, а не 10^-9.
Во вложенном цикле для var вы записываете в массив F_Q_2 некие значения, однако, затем при переходе на уровень выше в цикл для count вы вновь обнуляете этот массив, и все записанные во вложенном цикле туда значения пропадают.
Вопрос решил, но пришлось исправить значительную часть кода для решения поставленной задачи. Кому интересно, прикрепляю:
clc
clear
%--------------------------------------------------------------------------
q=1.e-8;
qe=1.6e-19;
qeq=qe/q;
eps0=8.85e-12;
c=3e+8;
m=9.1e-31;
dt=1/(100000*c);
k=1/(4*pi*eps0);
W=repmat(1.6e-12, [1, 10]);
gam=(1.6e-12)/(m*c^2);
beta=sqrt((gam^2-1)/gam^2);
%--------------------------------------------------------------------------
N=10; %число частиц
R=1.e-6*[0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
4 8 12 16 20 24 28 32 36 40];
%--------------------------------------------------------------------------
dr=zeros(3,N);
V=zeros(3,N);
F_Qz=zeros(1,N);
Z=zeros(1,N);
p=zeros(3,N);
p0=zeros(3,N);
Wk=zeros(1,N);
p0(3,:)=sqrt(((W(1,:).^2)/(c^2))-(m^2*c^2));
figure(1);
xlabel('Номер частицы','fontsize',14)
ylabel('\itZ, м','fontsize',14)
%--------------------------------------------------------------------------
while R(3,10)<4.e-4+1.e-2
[F_Qz,R,force,p,p0] = ForceQ(R,N,k,q,qeq,F_Qz,beta,p0,p,dt);
cla
hold on, scatter(1:N,Z,50,'filled');% Начальное положение частиц
drawnow
[R, W, Wk, Z, p, V] = Radius(N, m, V, p, R, dt, c);
scatter(1:N,Z,50,'filled');% Конечное положение частиц
end
colormap hot
figure(2), scatter(Z(1:N),Wk(1:N),50,'filled');
ylabel('\itW, МэВ','fontsize',14)
xlabel('\itZ, м','fontsize',14)
function [R, W, Wk, Z, p, V] = Radius(N, m, V, p, R, dt, c)
for i=1:N
W(1,i)=c*sqrt(p(3,i)^2+(m*c)^2);
Wk(1,i)=W(1,i)/1.6e-13;
V(1:3,i)=(c^2/W(1,i))*p(1:3,i);
dr(1:3,i)=V(1:3,i).*dt;
R(1:3,i)=R(1:3,i)+dr(1:3,i);
Z(1,i) = R(3,i);
end
end
function [F_Qz,R,force,p,p0] = ForceQ(R,N,k,q,qeq,F_Qz,beta,p0,p,dt)
for i=1:N-1
for var=i+1:N
r=R(3,var)-R(3,i);
rz=r/sqrt(1-beta^2);
force1=(k*q^2);
force=force1/rz^2;
F_Qz(1,i)=F_Qz(1,i)-(force);
F_Qz(1,var)=F_Qz(1,var)+(force);
p(3,i)=p0(3,i)+qeq*F_Qz(1,i)*dt;
p(3,var)=p0(3,var)+qeq*F_Qz(1,var)*dt;
end
end
end
Р.S. Потребовалось подкорректировать формулы для расчета с учетом релятивизма, упростить расчет Кулоновского взаимодействия, и ввести добавочные коэффициенты. dt можно не определять указанным способом, а принять порядка 10^-14