Словесно–формульный алгоритм
Нахождение проекций вектора индукции магнитной индукции в заданной точке:
1) Находим значение Bz на оси по формуле:
2) Находим значение B’z на оси по формуле:
3) Находим Br по формуле:
4) Находим Bz по формуле:
Значение Bz в приосевой области считаем неизменным и равным значению на оси. Считая , получаем:
.
Запуск программы:
1) Организуем диалог с пользователем:
На экран выводим информацию о программе;
По нажатию пользователем клавиши программа начинает расчет;
2) На экране отображаем магнитную линзу и ось;
3) Создаем и открываем файл для записи результатов расчета.
Расчет траектории электрона:
1) Находим координаты электрона на (n+1/2) шаге:
;
2) Находим приближенное значение угловой скорости на (n+1) шаге:
3) Вычисляем значения скоростей на (n+1) и (n+1/2) шагах:
4) Корректируем значение угловой скорости:
Значения Br и Bz в пунктах 2) – 4) относятся к точке с координатами, найденными в
пункте 1) ;
5) Находим координаты электрона на (n+1) шаге:
6) Находим модуль скорости электрона:
7) Сохраняем координаты и модуль скорости электрона в файл с результатами;
8) На экране ставим точку, соответствующую текущему положению электрона;
9) Повторяем пункты 1) – 8) от начального до конечного положения электрона по
оси z.
Завершение работы программы:
1) Закрываем файл с результатами расчета;
2) Выводим на экран сообщение о завершении расчета;
3) Выводим на экран путь к файлу с результатами расчета;
4) По нажатию пользователем клавиши программа завершает свою работу.
Листинг программы
{ Воробьев К.И. гр.21212, 2012 }
{ Расчет траектории электрона, влетающего в магнитную линзу параллельно оси }
program My_Model;
uses graph,crt;
const
Iw=100; { Круговой ток, А*виток }
R1=0.9E-2; R2=1.6E-2; { Внутренний и внешний радиусы катушки, м }
h=0.5E-2; { Толщина катушки, м }
V0=1E7; { Начальная скорость электрона, м/с }
Nz=5; Nr=7; { Число витков катушки вдоль осей z и r }
m0=1.2566371E-6; { Магнитная постоянная }
b0=-1.6E-19/9.1E-31; { Удельный заряд электрона }
Ib=Iw/(Nr*Nz); { Ток в одном витке катушки, A }
m=1; { Магнитная проницаемость среды }
r0=0.2E-2; { Начальное расстояние электрона от оси r }
z0=-3*h; zmax=3*h; { Начальное и конечное положения электрона по оси z }
dt=(zmax-z0)/(750*V0); { Шаг по времени }
path='C:\Results.dat'; { Имя файла с результатами }
k=20000; { Масштаб }
{********************************************************************}
{ Функция вычисления индукции магнитного поля }
function Find_B (r,z:real; c:char):real;
var
zj,zjp1,zjm1:real; { zj - расстояние от точки, в которой рассчитывается поле, }
{ до плоскости, в которой расположен j-й слой витков катушки }
{ zjp1 - расстояние zj на (j+1) шаге }
{ zjm1 - расстояние zj на (j-1) шаге }
SB,SBp1,SBm1:real; { SB - сумма индукции от каждого витка }
{ SBp1 - сумма индукции на (j+1) шаге }
{ SBm1 - сумма индукции на (j-1) шаге }
Ri:real; { Радиус i-того слоя витков }
i,j:integer; { Счетчики }
begin
SB:=0; SBp1:=0; SBm1:=0;
zj:=0; zjp1:=0; zjm1:=0;
for j:=1 to Nz do
begin
zj:=z+h/2-j*h/Nz; { Вычисление расстояния zj }
zjp1:=z+h/2+(1-j)*h/Nz; { Вычисление расстояния zjp1 }
zjm1:=z+h/2+(-1-j)*h/Nz; { Вычисление расстояния zjm1 }
for i:=1 to Nr do
begin
Ri:=R2-i*(R2-R1)/Nr; { Вычисление радиуса Ri }
{ Суммирование индукции }
SB:=SB+(m*m0*Ib*Ri*Ri)/(2*exp(1.5*ln(Ri*Ri+zj*zj)));
{ Суммирование индукции на (j+1) шаге }
SBp1:=SBp1+(m*m0*Ib*Ri*Ri)/(2*exp(1.5*ln(Ri*Ri+zjp1*zjp1)));
{ Суммирование индукции на (j-1) шаге }
SBm1:=SBm1+(m*m0*Ib*Ri*Ri)/(2*exp(1.5*ln(Ri*Ri+zjm1*zjm1)));
end;
end;
if c='z' then Find_B:=SB;
if c='r' then Find_B:=-r/2*(SBp1-SBm1)/(zjp1-zjm1);
end;
{********************************************************************}
{ Инициализация графического режима }
procedure Init_Screen;
var
grDriver,grMode:integer; { grDriver - графический драйвер }
{ grMode - графический режим }
begin
{ Установка графического драйвера }
grDriver:=Detect;
DetectGraph(grDriver,grMode);
{ Установка графического режима }
InitGraph(grDriver,grMode,'C:\Program Files\Turbo Pascal\BGI\');
{ Предупреждение об ошибке и завершение работы программы }
if GraphResult <> GrOK then
begin
writeln('Ошибка инициализации графики!');
readkey;
Halt(1);
end;
end;
{********************************************************************}
{ Отображение графики }
procedure Draw;
begin
setbkcolor(0); { Установка фонового цвета }
setcolor(3); { Установка цвета линзы }
{ Отображение магнитной линзы }
rectangle(320-round(0.5*h*k),240+round(R2*k),320+round(0.5*h*k),240+round(R1*k));
rectangle(320-round(0.5*h*k),240-round(R2*k),320+round(0.5*h*k),240-round(R1*k));
line(320-round(0.5*h*k),240+round(R2*k),320+round(0.5*h*k),240+round(R1*k));
line(320-round(0.5*h*k),240-round(R2*k),320+round(0.5*h*k),240-round(R1*k));
line(320+round(0.5*h*k),240+round(R2*k),320-round(0.5*h*k),240+round(R1*k));
line(320+round(0.5*h*k),240-round(R2*k),320-round(0.5*h*k),240-round(R1*k));
{ Отображение оси }
SetLineStyle(DashedLn,0,NormWidth);
line(0,240,640,240);
end;
{********************************************************************}
var
r,z,q,dr,dz,dq:array[1..1000] of real; { Координаты и скорости электрона }
r05,z05,dr05,dz05,dq05:real; { Координаты и скорости на (n+1/2) шаге }
V:real; { Модуль скорости электрона }
outfile:text; { Файловая переменная для хранения результатов }
i,j:integer; { Счетчики }
c:char;
begin
r[1]:=r0; dr[1]:=0; { Задание начального положения и скорости по r }
z[1]:=z0; dz[1]:=V0; { Задание начального положения и скорости по z }
q[1]:=0; dq[1]:=0; { Задание начального угла и угловой скорости }
r05:=0; z05:=0; { Обнуление координат на (n+1/2) шаге }
{ Диалог с пользователем }
clrscr;
writeln(' Программа рассчитывает траекторию электрона, ');
writeln(' влетающего в магнитную линзу параллельно оси. ');
writeln;
writeln(' Для продолжения нажмите любую клавишу... ');
readkey;
Init_Screen; { Инициализация графики }
Draw; { Отображение магнитной линзы }
assign(outfile,path); { Связь файла с файловой переменной }
rewrite(outfile); { Создание и открытие файла для записи }
i:=1;
repeat
{ Координаты r и z на (n+1/2) шаге }
r05:=r[i]+dt*dr[i]/2;
z05:=z[i]+dt*dz[i]/2;
{ Приближенное значение угловой скорости на (n+1) шаге }
dq[i+1]:=dq[i]+dt*(-b0*(dr[i]*Find_B(r05,z05,'z')
-dz[i]*Find_B(r05,z05,'r'))-2*dr[i]*dq[i])/r05;
{ Скорости на (n+1) и (n+1/2) шагах }
dq05:=(dq[i]+dq[i+1])/2;
dr[i+1]:=dr[i]+dt*(b0*r05*dq05*Find_B(r05,z05,'z')
+r05*dq05*dq05);
dz[i+1]:=dz[i]-dt*b0*r05*dq05*Find_B(r05,z05,'r');
dr05:=(dr[i]+dr[i+1])/2;
dz05:=(dz[i]+dz[i+1])/2;
{ Корректировка угловой скорости }
dq[i+1]:=dq[i]+dt*(b0*(dz05*Find_B(r05,z05,'r')
-dr05*Find_B(r05,z05,'z'))-2*dr05*dq05)/r05;
{ Координаты частицы на (n+1) шаге }
r[i+1]:=r[i]+dt*dr05;
z[i+1]:=z[i]+dt*dz05;
q[i+1]:=q[i]+dt*(dq[i]+dq[i+1])/2;
{ Модуль скорости электрона }
V:=sqrt(dr[i]*dr[i]+dz[i]*dz[i]+dq[i]*dq[i]*r[i]*r[i]);
{ Сохранение координат и модуля скорости в файл }
writeln(outfile,z[i]:1:9,' ',r[i]:1:9,' ',q[i]:1:9,' ',V:9:0);
{ На экране ставится точка, соответствуюшая текущему }
{ положению электрона }
putpixel(round(z[i]*k+320),round(240+r[i]*sin(q[i])*k*10)-round(r0*k),15);
i:=i+1;
until z[i]>zmax;
readkey;
close(outfile); { Закрытие файла }
CloseGraph; { Выключение графического режима }
{ Диалог с пользователем }
writeln(' Расчет завершен. Результаты сохранены в файле: ',path);
writeln;
writeln(' Для завершения работы программы нажмите любую клавишу...');
readkey;
end.