Не получаются правильные расчеты

Рейтинг: 1Ответов: 2Опубликовано: 28.02.2023

Задача следующая:
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 велся аналогично, и в целом там все работало корректно).

Ответы

▲ 1Принят

Вопрос решил, но пришлось исправить значительную часть кода для решения поставленной задачи. Кому интересно, прикрепляю:

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

▲ 1

По условию у вас 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 вы вновь обнуляете этот массив, и все записанные во вложенном цикле туда значения пропадают.