Алгоритм построения графика изменения напряженности поля движущейся заряженной частицы
Курсовая
робота
по дисциплине «Алгоритмические языки»
на тему:
Расчет изменения напряженности поля движущейся заряженной
частицы
План
1.
Постановка
задачи.
2.
Таблица
символических имен.
3.
Блок-схемы
главной функции main и других функций, которые вызываются из main.
4.
Текст
программы на языке Си. Результаты в виде таблиц и графиков.
Вывод.
Список использованной литературы.
1. Постановка задачи
Описать массив структур
из 3-х элементов. Каждая структура объединяет данные для одного варианта
расчета.
Необходимо для каждого
варианта на отрезке времени от 0 до T с шагом ∆t построить
график изменения напряженности поля движущейся заряженной частицы. Её величина
определяется выражением:
где
e – заряд частицы;
v – скорость;
α – угол между
направлением скорости и прямой, проведенной от частицы в данную точку поля.
α =π/2
Заряд частицы и скорость
её движения изменяются во времени:
Здесь:
e0, k0, с – заданные константы.
v0, r –
заданные константы.
Исходные данные считывать
из файла. Результаты расчетов занести в другой файл. Предусмотреть отдельные
функции для вычисления k, e, v.
Исходные данные:
1. Вариант №1
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1000 м/с
r=2
R=0,001 м
2. Вариант №2
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1200 м/с
r=1,5
R=0,002 м
3. Вариант №3
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1500 м/с
r=0,7
R=0,003 м
2. Таблица символических имен
Глобальные переменные
|
N
|
Количество вариантов, результаты которых необходимо
вычислить.
|
T
|
Врем я окончания эксперимента. Исчисляется в секундах.
|
dt
|
Шаг, с которым изменяется время.
|
e0
|
Заданные константы.
|
k0
|
c
|
v0
|
r
|
R
|
mas[N]
|
Массив структур, в котором хранятся заданные константы.
|
*ptt
|
Массив указателей на значения времени t.
|
*pHH
|
Массив указателей на значения функции H.
|
N_[N]
|
Массив, в котором мы храним длины массивов.
|
Функция main
|
i
|
Временные переменные. Счетчики.
|
l
|
j
|
e
|
Заряд частицы. С её помощью вычисляется H.
|
v
|
Скорость частицы. С её помощью вычисляется H.
|
H
|
Напряженность поля движущейся частицы.
|
alfa
|
Угол между направлением скорости и прямой, проведенной от
частицы в данную точку поля.α=∏/2
|
t
|
Время.
|
res
|
Файл, в который заносятся результаты эксперимента.
|
Функция chtenie_dannih
|
a[]
|
Массив структур, который нужно прочитать из файла.
|
i
|
Временная переменная. Счетчик.
|
f
|
Файл с исходными данными.
|
Функция eee
|
k0
|
Заданные константы.
|
c
|
e0
|
t
|
Время.
|
T
|
Время окончания эксперимента.
|
k
|
Параметр, от которого зависит заряд частицы и который изменяется
во времени.
|
res_e
|
Заряд частицы в текущее время t. Временная переменная.
|
Функция kkk
|
k0
|
Заданные константы.
|
c
|
t
|
Время.
|
T
|
Время окончания эксперимента.
|
res_k
|
Значение параметра k текущее время t. Временная переменная.
|
Функция vvv
|
v0
|
Заданные константы.
|
r
|
t
|
Время.
|
T
|
Время окончания эксперимента.
|
res_v
|
Скорость движения частицы в текущее время t. Временная переменная.
|
Функция vivod_grafikov
|
xmax
|
Максимальная ширина графика.
|
ymax
|
Максимальная высота графика.
|
xmin
|
Отступы от краёв экрана.
|
ymin
|
x_tek
|
Текущие координаты.
|
y_tek
|
x_pred
|
Предыдущие координаты.
|
y_pred
|
i
|
Временная переменная. Счетчик.
|
st[20]
|
Строка символов. Временная переменная.
|
minH
|
Минимальное значение функции Н.
|
maxH
|
Максимальное значение функции Н.
|
3. Блок-схемы главной функции main и
других функций, которые вызываются из main
1. Функция main.
2. Функция chtenie_dannih.
3. Функция eee.
4. Функция kkk.
5. Функция vvv.
6. Функция vivod_grafikov.
4. Текст программы на языке Си. Результаты
в виде таблиц и графиков
Текст программы на языке
Си.
#include
<stdio.h>
#include
<math.h>
#include
<alloc.h>
#include
<conio.h>
#include
<graphics.h>
#define N 3
struct variant
{
double T;
double dt;
double e0;
double k0;
double c;
double v0;
double r;
double R;
} mas[N];
double*ptt[N];
double*pHH[N];
int N_[N];
void chtenie_dannih(struct
variant a[]);
double
eee(double k0,double c,double e0,double t,double T);
double
kkk(double k0,double c,double t,double T);
double
vvv(double v0,double r,double t,double T);
void
vivod_grafikov(int a,double*ptt,double*pHH,int N_);
//---------------------------------------------------------------------------
void main()
{
FILE *res;
int i,l,j;
double
e,v,H,t;
double alfa=M_PI/2;
res=fopen("result.txt","w");
clrscr();
chtenie_dannih(mas);//s4itivaem
dannie
puts("Vvedite,
pogalyista, vawe ljubimoe chislo:");
scanf("%f",&H);
//tabyliryem
fynkciju
for(i=0;i<N;i++)
{
N_[i]=((int)(mas[i].T/mas[i].dt))+2;
ptt[i]=(double*)malloc(N_[i]*sizeof(double));
pHH[i]=(double*)malloc(N_[i]*sizeof(double));
for(t=0,l=0;t<=mas[i].T+1e-5;t+=mas[i].dt,l++)
{
e=eee(mas[i].k0,mas[i].c,mas[i].e0,t,mas[i].T);
v=vvv(mas[i].v0,mas[i].r,t,mas[i].T);
H=e*v*sin(alfa)/pow(mas[i].R,2.0);
ptt[i][l]=t;
pHH[i][l]=H;
fprintf(res,"H(%lf)=%lf\n",t,H);
}
N_[i]=l;
fprintf(res,"\n");
}
fclose(res);
fflush(stdin);
//vivodim
grafiki
for(i=0;i<N;i++)
{
vivod_grafikov(i,ptt[i],pHH[i],N_[i]);
getchar();
}
}
//---------------------------------------------------------------------------
void
chtenie_dannih(struct variant a[])
{
int i;
FILE*f =
fopen("ish.txt","r");
for(i=0;i<N;i++)
{
fscanf(f,"%lf",&a[i].T);
fscanf(f,"%lf",&a[i].dt);
fscanf(f,"%lf",&a[i].e0);
fscanf(f,"%lf",&a[i].k0);
fscanf(f,"%lf",&a[i].c);
fscanf(f,"%lf",&a[i].v0);
fscanf(f,"%lf",&a[i].r);
fscanf(f,"%lf",&a[i].R);
}
fclose(f);
}
//---------------------------------------------------------------------------
double
eee(double k0,double c,double e0,double t,double T)
{
double
k=kkk(k0,c,t,T);
double res_e;
if(t<=T/4)
res_e=e0*(1-exp(-k*t));
else
res_e=e0*(1-exp(-k*T/4));
return res_e;
}
//---------------------------------------------------------------------------
double
kkk(double k0,double c,double t,double T)
{
double res_k;
if(t<=T/8)
res_k=k0*(1+exp(-c*t));
else
res_k=k0*(1+exp(-c*T/8));
return res_k;
}
//---------------------------------------------------------------------------
double
vvv(double v0,double r,double t,double T)
{
double res_v;
if(t<=T/2)
res_v=v0*(1+exp(-r*t));
else
res_v=v0*(1+exp(-r*T/2));
return res_v;
}
//---------------------------------------------------------------------------
void
vivod_grafikov(int a,double*ptt,double*pHH,int N_)
{
int gdriver =
DETECT, gmode, errorcode;
int
xmax,ymax;//maksimalnie koordinatu x - shir, y - visota
int
xmin,ymin;//otstupi ot kraev
int
x_tek,y_tek;//tekushie koordinati
int
x_pred,y_pred;//predidushie koordinati
int i;
char st[20];
double
minH,maxH;//krajnie znachenija H
initgraph(&gdriver,
&gmode, "f:\\turbocpp\\bgi");
//ystanavlivaem
otstypi ot kraev
xmin = 85;
ymin = 15;
//ystanavlivaem
maksimalnie koordinati x i y
xmax =
getmaxx()-20;
ymax =
getmaxy()-20;
//nahodim
maksimalnoe i minimalnoe H
maxH = minH =
pHH[0];
for(i=0;i<N_;i++)
{
minH =
(pHH[i]<minH)?pHH[i]:minH;
maxH =
(pHH[i]>maxH)?pHH[i]:maxH;
}
//zalivaem fon
setfillstyle(SOLID_FILL,7);
bar(0,0,getmaxx(),getmaxy());
//vivodim
nomer varianta
setcolor(2);
sprintf(st,"Variant
No %d",a+1);
outtextxy(0,4,st);
//4ertim osi
setcolor(0);
line(xmin,ymin,xmin,ymax);//os'
oy
line(xmin,ymax,xmax,ymax);//os'
ox
//risyem
strelo4ki
line(xmin,ymin,xmin+3,ymin+5);
// Y \
line(xmin,ymin,xmin-3,ymin+5);
// Y /
line(xmax,ymax,xmax-5,ymax-3);
// X \
line(xmax,ymax,xmax-5,ymax+3);
// X /
//podpisivaem
osi
setcolor(6);
outtextxy(xmin+6,ymin,"H");
outtextxy(xmax,ymax-10,"t");
//4ertim i
podpisivaem delenija po osi oy
setcolor(0);
settextstyle(SMALL_FONT,HORIZ_DIR,4);
for(y_tek=ymax-20;y_tek>ymin+10;y_tek-=
20)
{
line(xmin-2,y_tek,xmin+2,y_tek);
sprintf(st,"%0.5lf",maxH-(y_tek-ymin)*(maxH-minH)/(ymax-ymin));
outtextxy(xmin-70,y_tek-6,st);
}
//4ertim i
podpisivaem delenija po osi ox
for(i=0;i<N_;i++)
{
x_tek=xmin+((ptt[i]-ptt[0])*(xmax-xmin)/(ptt[N_-1]-ptt[0]));
line(x_tek,ymax-2,x_tek,ymax+2);
if(i%3==0)
{
sprintf(st,"%0.2lf",ptt[0]+(x_tek-xmin)*(ptt[N_-1]-ptt[0])/(xmax-xmin));
outtextxy(x_tek-3,ymax+4,st);
}
//risyem
grafik
setcolor(1);
x_pred=xmin;
y_pred=ymax;
for(i=0;i<N_;i++)
{
x_tek=xmin+((ptt[i]-ptt[0])*(xmax-xmin)/(ptt[N_-1]-ptt[0]));
y_tek=(int)((pHH[i]-minH)*(ymax-ymin)/(maxH-minH));
y_tek=ymax-y_tek;
line(x_pred,y_pred,x_tek,y_tek);
x_pred=x_tek;
y_pred=y_tek;
}
}
Результаты в виде таблиц
и графиков.
Ø 1-й вариант
Исходные данные:
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1000 м/с
r=2
R=0,001 м
Результаты программы:
H(0.000000)=0.000000
H(0.050000)=0.001899
H(0.100000)=0.003616
H(0.150000)=0.005182
H(0.200000)=0.006627
H(0.250000)=0.007963
H(0.300000)=0.007677
H(0.350000)=0.007418
H(0.400000)=0.007184
H(0.450000)=0.006972
H(0.500000)=0.006780
H(0.550000)=0.006780
H(0.600000)=0.006780
H(0.650000)=0.006780
H(0.700000)=0.006780
H(0.750000)=0.006780
H(0.800000)=0.006780
H(0.850000)=0.006780
H(0.900000)=0.006780
H(0.950000)=0.006780
H(1.000000)=0.006780
Результаты в Excel:
t
|
k
|
e
|
v
|
H
|
0
|
0,02
|
0
|
2000
|
0
|
0,05
|
0,019950125
|
0,0000000000010
|
1904,837
|
0,001899
|
0,1
|
0,019900498
|
0,0000000000020
|
1818,731
|
0,003616
|
0,15
|
0,019875778
|
0,0000000000030
|
1740,818
|
0,005182
|
0,2
|
0,019875778
|
0,0000000000040
|
1670,32
|
0,006627
|
0,25
|
0,019875778
|
0,0000000000050
|
1606,531
|
0,007963
|
0,3
|
0,019875778
|
0,0000000000050
|
1548,812
|
0,007677
|
0,35
|
0,019875778
|
0,0000000000050
|
1496,585
|
0,007418
|
0,4
|
0,019875778
|
0,0000000000050
|
1449,329
|
0,007184
|
0,45
|
0,019875778
|
0,0000000000050
|
1406,57
|
0,006972
|
0,5
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,55
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,6
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,65
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,7
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,75
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,8
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,85
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,9
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
0,95
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
1
|
0,019875778
|
0,0000000000050
|
1367,879
|
0,00678
|
Ø 2-й вариант
Исходные данные:
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1200 м/с
r=1,5
R=0,002 м
Результаты программы:
H(0.000000)=0.000000
H(0.050000)=0.000577
H(0.100000)=0.001110
H(0.150000)=0.001606
H(0.200000)=0.002072
H(0.250000)=0.002509
H(0.300000)=0.002435
H(0.350000)=0.002367
H(0.400000)=0.002303
H(0.450000)=0.002244
H(0.500000)=0.002189
H(0.550000)=0.002189
H(0.600000)=0.002189
H(0.650000)=0.002189
H(0.700000)=0.002189
H(0.750000)=0.002189
H(0.800000)=0.002189
H(0.850000)=0.002189
H(0.900000)=0.002189
H(0.950000)=0.002189
H(1.000000)=0.002189
Результаты в Excel:
T
|
k
|
e
|
v
|
H
|
0
|
0,02
|
0
|
2400
|
0
|
0,05
|
0,019950125
|
0,00000000000100
|
2313,292
|
0,000577
|
0,1
|
0,019900498
|
0,00000000000199
|
2232,85
|
0,00111
|
0,15
|
0,019875778
|
0,00000000000298
|
2158,219
|
0,001606
|
0,2
|
0,019875778
|
0,00000000000397
|
2088,982
|
0,002072
|
0,25
|
0,019875778
|
0,00000000000496
|
2024,747
|
0,002509
|
0,3
|
0,019875778
|
0,00000000000496
|
1965,154
|
0,002435
|
0,35
|
0,019875778
|
0,00000000000496
|
1909,866
|
0,002367
|
0,4
|
0,019875778
|
0,00000000000496
|
1858,574
|
0,002303
|
0,45
|
0,019875778
|
0,00000000000496
|
1810,988
|
0,002244
|
0,5
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,55
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,6
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,65
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,7
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,75
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,8
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,85
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,9
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
0,95
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
1
|
0,019875778
|
0,00000000000496
|
1766,84
|
0,002189
|
Ø 3-й вариант
Исходные данные:
T=1 c
∆t=0.05 c
e0=1*10-9 к
k0=0.01
с=0,1
v0=1500 м/с
r=0,7
R=0,003 м
Результаты программы:
H(0.000000)=0.000000
H(0.050000)=0.000327
H(0.100000)=0.000640
H(0.150000)=0.000943
H(0.200000)=0.001236
H(0.250000)=0.001520
H(0.300000)=0.001496
H(0.350000)=0.001473
H(0.400000)=0.001450
H(0.450000)=0.001429
H(0.500000)=0.001408
H(0.550000)=0.001408
H(0.600000)=0.001408
H(0.650000)=0.001408
H(0.700000)=0.001408
H(0.750000)=0.001408
H(0.800000)=0.001408
H(0.850000)=0.001408
H(0.900000)=0.001408
H(0.950000)=0.001408
H(1.000000)=0.001408
Результаты в Excel:
t
|
k
|
e
|
v
|
H
|
0
|
0,02
|
0
|
3000
|
0
|
0,05
|
0,000000000000997
|
2948,408
|
0,000327
|
0,1
|
0,019900498
|
0,000000000001988
|
2898,591
|
0,00064
|
0,15
|
0,019875778
|
0,000000000002977
|
2850,487
|
0,000943
|
0,2
|
0,019875778
|
0,000000000003967
|
2804,037
|
0,001236
|
0,25
|
0,019875778
|
0,000000000004957
|
2759,186
|
0,00152
|
0,3
|
0,019875778
|
0,000000000004957
|
2715,876
|
0,001496
|
0,35
|
0,019875778
|
0,000000000004957
|
2674,057
|
0,001473
|
0,4
|
0,019875778
|
0,000000000004957
|
2633,676
|
0,00145
|
0,45
|
0,019875778
|
0,000000000004957
|
2594,683
|
0,001429
|
0,5
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,55
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,6
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,65
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,7
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,75
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,8
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,85
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,9
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
0,95
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
1
|
0,019875778
|
0,000000000004957
|
2557,032
|
0,001408
|
Выводы
Выполняя курсовую работу,
разработан алгоритм программы на языке Си, которая вычисляет и рисует график
изменения напряженности поля движущейся заряженной частицы на интервале времени
[0,T].
Результаты программы
заносятся в файл «RESULT.txt».
Работоспособность
алгоритма и программы проверена на контрольных примерах.
Список использованной
литературы
1.
«Язык
программирования Cи» 2-е изд. М.: «Вильямс»
Керниган
Б., Ритчи Д.
2.
«Полный
справочник по C» 4-е изд. М.: «Вильямс»
Шилдт Г.
3.
«Программирование
на языке Cи» 3-е изд. М.: «Вильямс»
Кочан С.