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

5.3 Пример моделирования движения заряженной частицы.

  1. В открывшемся окне программы вводим параметры a, c, d.

Рис 4. Основное окно программы

  1. В качестве величины, по которой происходит настройка, берется угол прицеливания. Вводится значение начальной скорости. Нажимается кнопка «моделировать» и рассчитывается значение угла.

Рис 5. Окно подстройки

  1. Нажимается кнопка «моделировать» в основном окне.

Рис 6. Основное окно программы

  1. При нажатии на кнопку «Таблица» открывается окно с результатами расчета в численном виде.

Рис 7. Окно результатов в табличном виде

  1. При нажатии на кнопку «График» открывается окно с результатами расчета графическом виде.

Рис 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.