Смекни!
smekni.com

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

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

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

на тему:

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


План

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&bsol;n",t,H);

}

N_[i]=l;

fprintf(res,"&bsol;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:&bsol;turbocpp&bsol;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 &bsol;

line(xmin,ymin,xmin-3,ymin+5); // Y /

line(xmax,ymax,xmax-5,ymax-3); // X &bsol;

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