Взаимодействие молекулы газа с центром рассеяния.(Программа и описание). Взаимодействие молекулы газа с центром рассеяния.(Программа и оп. Постановка задачи и описание алгоритма
Скачать 264.21 Kb.
|
Блок-схема алгоритма на языке Pascal Приложение А. Реализация алгоритма, разработанного в Pascal, производящего расчет траектории частицы, движущейся как вдоль прямой навстречу неподвижному центру рассеяния, так и прямой параллельной заданному центру и взаимодействующей с ним посредством потенциала Леннард-Джонса. type vector = class public x1 : real; y1 :real; /// Складывает основной вектор с вектором Х function sumvector ( x : vector ) : vector; var a: vector := new vector (0,0); Begin a.x1:=x1+x.x1; a.y1:=y1+x.y1; Sumvector:=a; end; /// Строит вектор силы f из подвижной частицы к началу координат Procedure buildvector (f : real; k : vector); var a : vector := new vector (0,0); h :real; Begin h:=f/k.lengthvector(0,0); x1:=k.x1*(h); y1:=k.y1*(h); end; /// Длина вектора Function lengthvector (x , y : real ) : real; Begin lengthvector:=sqrt( sqr(x1 - x)+sqr(y1 - y)) ; end; /// Произведение векторов Function multvector(k : real) : vector; var a : vector := new vector (0,0); Begin a.x1:=x1*k; a.y1:=y1*k; multvector:=a; end; constructor create(x,y : real); Begin x1:=x; y1:=y; end; end; var f2 , f21, f22 : text; dt , m1,m2 , r , f1 : real; p: integer; crd1, crd2, v1, v2, a1, a2, f: vector ; // crd - радиусвектор (положение ча-стицы) const Put1 = 'Запись.txt'; Put2 = 'Координаты первой частицы.txt'; Put3 = 'Координаты второй частицы.txt'; ///вычисляется сила procedure force(r: real; var f:real); var A,B : real; begin A:=0.25; B:=1; f := 24*a*power(b,6)*power(r,-7)*(2*power(b/r,6)-1); //b-sigma; a-epsilon; end; Begin Assign(f2,put1); Reset(f2); crd1 := new vector (0,0); v1 := new vector (0,0); a1 := new vector (0,0); f:= new vector (0,0); crd2 := new vector (0,0); v2 := new vector (0,0); a2 := new vector (0,0); dt:=0.00001; m1:=1; m2:=1; readln(f2, crd1.x1, crd1.y1, crd2.x1, crd2.y1, v1.x1, v1.y1, v2.x1, v2.y1); Close(f2); Assign(f2,put2); Assign(f21,put3); Rewrite(f2); Rewrite(f21); Writeln(f2,'x1 y1'); Writeln(f21,'x2 y2'); Writeln(f2,crd1.x1,' ',crd1.y1); Writeln(f21,crd2.x1,' ',crd2.y1); While crd1.lengthvector(crd2.x1,crd2.y1) <3.5 do begin force(crd1.lengthvector(crd2.x1,crd2.y1),f1); f.buildvector(f1,crd2.sumvector(crd1.multvector(-1))); a1:=f.multvector(-1/m1); a2:=f.multvector(1/m2); crd1:=crd1.sumvector(v1.multvector(dt).sumvector(a1.multvector(sqr(dt)/2))); v1:=v1.sumvector(a1.multvector(dt)); crd2:=crd2; v2:=v2; p:=p+1; if p*dt>=100 then break; if p mod 10000 =0 then begin Writeln(f2,crd1.x1,' ',crd1.y1); Writeln(f21,crd2.x1,' ',crd2.y1); end; end; Close(f2); Close(f21); end. |