Алгоритм построения графика изменения напряженности поля движущейся заряженной частицы

Курсовая робота

	по дисциплине «Алгоритмические языки»

	

	на тему:

	Расчет изменения напряженности поля движущейся заряженной частицы

	

	

	

	План

	

			Постановка задачи.

			Таблица символических имен.

			Блок-схемы главной функции main и других функций, которые вызываются из main.

			Текст программы на языке Си. Результаты в виде таблиц и графиков.

	Вывод.

	Список использованной литературы.

	

	
1. Постановка задачи

	

	Описать массив структур из 3-х элементов. Каждая структура объединяет данные для одного варианта расчета.

	Необходимо для каждого варианта на отрезке времени от 0 до T с шагом ∆t построить график изменения напряженности поля движущейся заряженной частицы. Её величина определяется выражением:

	

	

	

	где 

	e – заряд частицы;

	v – скорость;

	α – угол между направлением скорости и прямой, проведенной от частицы в данную точку поля.

	

	α =π/2

	

	Заряд частицы и скорость её движения изменяются во времени:

	

	

	

	Здесь:

	

	

	

	e0, k0, с – заданные константы.

	


	

	v0, r – заданные константы.

	Исходные данные считывать из файла. Результаты расчетов занести в другой файл. Предусмотреть отдельные функции для вычисления k, e, v.

	Исходные данные:

	Вариант №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

	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

	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

	

	Функция main.

	

	

	

	

	Функция chtenie_dannih.

	

	

	

	Функция eee.

	

	

	

	Функция kkk.

	

	

	

	Функция vvv.

	

	

	

	

	Функция 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,019950125

	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».

	Работоспособность алгоритма и программы проверена на контрольных примерах.

	

	
Список использованной литературы

	

			«Язык программирования Cи» 2-е изд. М.: «Вильямс»

		Керниган Б., Ритчи Д.

			«Полный справочник по C» 4-е изд. М.: «Вильямс»

		Шилдт Г.

			«Программирование на языке Cи» 3-е изд. М.: «Вильямс»

		Кочан С.