Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мат.моделирование_Воробьев_21212.doc
Скачиваний:
13
Добавлен:
14.05.2015
Размер:
217.6 Кб
Скачать

Словесно–формульный алгоритм

  1. Нахождение проекций вектора индукции магнитной индукции в заданной точке:

1) Находим значение Bz на оси по формуле:

2) Находим значение B’z на оси по формуле:

3) Находим Br по формуле:

4) Находим Bz по формуле:

Значение Bz в приосевой области считаем неизменным и равным значению на оси. Считая , получаем:

.

  1. Запуск программы:

1) Организуем диалог с пользователем:

  • На экран выводим информацию о программе;

  • По нажатию пользователем клавиши программа начинает расчет;

2) На экране отображаем магнитную линзу и ось;

3) Создаем и открываем файл для записи результатов расчета.

  1. Расчет траектории электрона:

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. Завершение работы программы:

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.