- •Министерство образования и науки Российской Федерации
- •Курсовая работа по дисциплине «Моделирование систем» тема: Движение заряженных частиц
- •Содержание
- •2. Обозначения и сокращения
- •3. Введение
- •4. Моделирование
- •4.1 Формализация задач моделирования
- •4.2 Описание предметной области
- •4.2.1 Закон сохранения электрического заряда
- •4.2.2 Закон Кулона
- •4.2.3 Электростатическое поле. Напряжённость электростатического поля.
- •4.2.4 Принцип суперпозиции электростатических полей.
- •4.3 Построение математической модели
- •5.3 Пример моделирования движения заряженной частицы.
- •5.4 Результаты работы программы
- •Приложение а Текст программы
- •6. Заключение
- •Список литературы
5.3 Пример моделирования движения заряженной частицы.
-
В открывшемся окне программы вводим параметры a, c, d.
Рис 4. Основное окно программы
-
В качестве величины, по которой происходит настройка, берется угол прицеливания. Вводится значение начальной скорости. Нажимается кнопка «моделировать» и рассчитывается значение угла.
Рис 5. Окно подстройки
-
Нажимается кнопка «моделировать» в основном окне.
Рис 6. Основное окно программы
-
При нажатии на кнопку «Таблица» открывается окно с результатами расчета в численном виде.
Рис 7. Окно результатов в табличном виде
-
При нажатии на кнопку «График» открывается окно с результатами расчета графическом виде.
Рис 7. Окно результатов в графическом виде
5.4 Результаты работы программы
Моделирование производилось при постоянных значениях величин a=3, c=1, d=0,5. Меняли значение угла прицеливания Y и рассчитывали начальную скорость V0
На рисунках показаны графики зависимости координаты частицы от времени
Рис 8. графики зависимости координаты частицы от времени при Y = 10, V0 = 175
Рис 9. графики зависимости координаты частицы от времени при Y = 20, V0 = 72
Рис 10. графики зависимости координаты частицы от времени при Y = 40, V0 = 40
Рис 11. графики зависимости координаты частицы от времени при Y = 70, V0 = 29
Найдем значения скорости, при задании значений угла в диапазоне от 100 до 850 (табл. 1) и составим график зависимости начальной скорости от угла прицеливания.
Таблица 1
Y |
V0 |
10 |
175 |
15 |
98 |
20 |
72 |
25 |
59 |
30 |
50 |
35 |
44 |
40 |
40 |
45 |
36 |
50 |
34 |
55 |
32 |
60 |
30 |
65 |
29 |
70 |
29 |
75 |
28 |
80 |
28 |
85 |
28 |
Рис 12. График зависимости скорости от угла
Из графика можно сделать вывод, что начальная скорость и угол прицеливания обратно пропорциональны.
Приложение а Текст программы
Основное окно
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, XPMan;
type
TForm1 = class(TForm)
Image1: TImage;
GroupBox1: TGroupBox;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
LabeledEdit6: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
XPManifest1: TXPManifest;
GroupBox2: TGroupBox;
LabeledEdit8: TLabeledEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
LabeledEdit9: TLabeledEdit;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
function prover:boolean;
procedure Button1Click(Sender: TObject);
function fu(q1,q2,m,x,y:real;n:byte):real;
procedure Button2Click(Sender: TObject);
private
public
procedure podgon(n:byte);
end;
var
Form1: TForm1;
q1,q2,a,c,d,v,f,vx,vy,x,y,dt,m,t:real;
implementation
uses Unit2, Unit4, Unit3;
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
begin
form2.show;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
form4.show;
end;
function tform1.prover;
begin
try
prover:=false;
try
q1:=strtofloat(labelededit1.text);
except
on EConvertError do begin labelededit1.text:='';
showmessage('Неправильный формат числа "'+labelededit1.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
a:=strtofloat(labelededit3.text);
except
on EConvertError do begin labelededit3.text:='';
showmessage('Неправильный формат числа "'+labelededit3.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
c:=strtofloat(labelededit4.text);
except
on EConvertError do begin labelededit4.text:='';
showmessage('Неправильный формат числа "'+labelededit4.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
d:=strtofloat(labelededit5.text);
except
on EConvertError do begin labelededit5.text:='';
showmessage('Неправильный формат числа "'+labelededit5.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
v:=strtofloat(labelededit6.text);
except
on EConvertError do begin labelededit6.text:='';
showmessage('Неправильный формат числа "'+labelededit6.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
f:=strtofloat(labelededit7.text);
except
on EConvertError do begin labelededit7.text:='';
showmessage('Неправильный формат числа "'+labelededit7.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
dt:=strtofloat(labelededit8.text);
except
on EConvertError do begin labelededit8.text:='';
showmessage('Неправильный формат числа "'+labelededit8.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
m:=strtofloat(labelededit9.text);
except
on EConvertError do begin labelededit9.text:='';
showmessage('Неправильный формат числа "'+labelededit9.editlabel.Caption+'"');//если данные не являются числом
end;
end;
try
q2:=strtofloat(labelededit2.text);
except
on EConvertError do begin labelededit2.text:='';
showmessage('Неправильный формат числа "'+labelededit2.editlabel.Caption+'"');//если данные не являются числом
end;
end;
prover:=true;
except
on EConvertError do showmessage('Неправильный формат числа');//если данные не являются числом
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
VAR K1_1,k2_1,k3_1,k4_1, k1_2,k2_2,k3_2,k4_2:double; dv,vis:integer;
begin
if prover then
begin
begin
form2.Series1.Clear;
x:=-a;
y:=0;
t:=0;
vis:=0;
dv:=1;
vx:=v*cos((f/180)*pi);
vy:=v*sin((f/180)*pi);
while (x<c) and(y>=0) do
begin
k1_1:=fu(q1,q2,m,x,y,1);
k1_2:=fu(q1,q2,m,x,y,2);
k2_1:=fu(q1,q2,m,x+dt*(vx+k1_1/2),y+dt*(vy+k1_2/2),1);
k2_2:=fu(q1,q2,m,x+dt*(vx+k1_1/2),y+dt*(vy+k1_2/2),2);
k3_1:=fu(q1,q2,m,x+dt*(vx+k1_2/2),y+dt*(vy+k2_2/2),1);
k3_2:=fu(q1,q2,m,x+dt*(vx+k2_1/2),y+dt*(vy+k2_2/2),2);
k4_1:=fu(q1,q2,m,x+dt*(vx+k3_1),y+dt*(vy+k3_2),1);
k4_2:=fu(q1,q2,m,x+dt*(vx+k3_1),y+dt*(vy+k3_2),2);
vy:=vy+dt*(k1_2+2*k2_2+2*k3_2+k4_2)/6;
vx:=vx+dt*(k1_1+2*k2_1+2*k3_1+k4_1)/6;
x:=x+dt*vx;
y:=y+dt*vy;
t:=t+dt;
if vis=0 then
begin
form2.chart1.Series[0].AddXY(x,y,'',clgreen);
form4.StringGrid1.Rows[round(form4.StringGrid1.RowCount-1)].Strings[0]:=floattostr(t);
form4.StringGrid1.Rows[round(form4.StringGrid1.RowCount-1)].Strings[1]:=floattostr(x);
form4.StringGrid1.Rows[round(form4.StringGrid1.RowCount-1)].Strings[2]:=floattostr(y);
form4.StringGrid1.RowCount:=form4.StringGrid1.RowCount+1;
end;
vis:=vis+1;
if vis=dv then vis:=0;
end;
form4.StringGrid1.RowCount:=form4.StringGrid1.RowCount-1;
end;
end;
end;
function tform1.fu;
begin
case n of
1: fu:=(1/(4*pi*0.85e-12))*(q1*q2/m)*(x/sqrt(x*x+y*y));
2: fu:=(1/(4*pi*0.85e-12))*(q1*q2/m)*(y/sqrt(x*x+y*y));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form3.show;
form3.LabeledEdit1.Text:=LabeledEdit1.Text;
form3.LabeledEdit6.Text:=LabeledEdit6.Text;
form3.LabeledEdit7.Text:=LabeledEdit7.Text;
end;
procedure tform1.podgon;
VAR K1_1,k2_1,k3_1,k4_1, k1_2,k2_2,k3_2,k4_2,y1,f0,g0:double;
begin
if prover then
begin
f0:=f;
repeat
t:=0;
x:=-a;
y:=0;
vx:=v*cos((f/180)*pi);
vy:=v*sin((f/180)*pi);
while (x<c) and(y>=0) do
begin
k1_1:=fu(q1,q2,m,x,y,1);
k1_2:=fu(q1,q2,m,x,y,2);
k2_1:=fu(q1,q2,m,x+dt*(vx+k1_1/2),y+dt*(vy+k1_2/2),1);
k2_2:=fu(q1,q2,m,x+dt*(vx+k1_1/2),y+dt*(vy+k1_2/2),2);
k3_1:=fu(q1,q2,m,x+dt*(vx+k1_2/2),y+dt*(vy+k2_2/2),1);
k3_2:=fu(q1,q2,m,x+dt*(vx+k2_1/2),y+dt*(vy+k2_2/2),2);
k4_1:=fu(q1,q2,m,x+dt*(vx+k3_1),y+dt*(vy+k3_2),1);
k4_2:=fu(q1,q2,m,x+dt*(vx+k3_1),y+dt*(vy+k3_2),2);
vy:=vy+dt*(k1_2+2*k2_2+2*k3_2+k4_2)/6;
vx:=vx+dt*(k1_1+2*k2_1+2*k3_1+k4_1)/6;
x:=x+dt*vx;
y:=y+dt*vy;
t:=t+dt;
end;
if (abs(y-d)>(d/100))then
begin
if y<=0 then y:=d/10;
case n of
0:begin
v:=v*sqrt(d/y);
end;
1:begin
f:=f*sqrt(d/y);
end;
2:begin
if q2>0 then
begin
if q1>0 then q1:=q1*sqr(d/y)
else q1:=q1*sqr(sqr(y/d))
end
else
begin
if q1<0 then q1:=q1*(d/y)
else q1:=q1*sqr(sqr(y/d))
end;
end;
end;
end;
if f>89 then begin showmessage('при данных v и q попадаение не возможно'); f:=f0; break; end;
until (abs(y-d)<(d/100));
labelededit6.Text:=floattostr(v);
labelededit7.Text:=floattostr(f);
y1:=y;
labelededit1.Text:=floattostr(q1);
end;
end;
end.
Окно графика:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
type
TForm2 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
procedure FormResize(Sender: TObject);
private
public
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormResize(Sender: TObject);
begin
chart1.Width:=form2.ClientWidth;
chart1.Height:=form2.ClientHeight;
end;
end.
Окно настройки попадания в мишень:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm3 = class(TForm)
LabeledEdit6: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
LabeledEdit1: TLabeledEdit;
Button1: TButton;
RadioGroup1: TRadioGroup;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form3: TForm3;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
form1.LabeledEdit1.Text:=LabeledEdit1.Text;
form1.LabeledEdit6.Text:=LabeledEdit6.Text;
form1.LabeledEdit7.Text:=LabeledEdit7.Text;
form3.Hide;
form1.podgon(radiogroup1.ItemIndex);
end;
end.
Окно таблицы:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus;
type
TForm4 = class(TForm)
MainMenu1: TMainMenu;
Save1: TMenuItem;
Savetofile1: TMenuItem;
StringGrid1: TStringGrid;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Savetofile1Click(Sender: TObject);
private
public
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
begin
stringgrid1.Rows[0].Strings[0]:='время';
stringgrid1.Rows[0].Strings[1]:='x';
stringgrid1.Rows[0].Strings[2]:='y';
end;
procedure TForm4.Savetofile1Click(Sender: TObject);
begin
if savedialog1.Execute then
if savedialog1.FileName<>''then begin
stringgrid1.cols[0].SaveToFile(savedialog1.FileName+'t.txt');
stringgrid1.cols[1].SaveToFile(savedialog1.FileName+'x.txt');
stringgrid1.cols[2].SaveToFile(savedialog1.FileName+'y.txt');
end;
end;
end.