Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2012, 18:15   #1
Евгудвин
 
Регистрация: 14.05.2011
Сообщений: 9
По умолчанию

необходимо создать модель броуновского движения.
есть двумерный массив молекул. число молекул =н;
i= номер молекулы а j:= параметру.
1- масса m
2- радиус r
3 скорость по координате х Vx
4 скорость по координате у Vy
5 координата молекулы х
6 координата молекулы у
учесть закон сохранения импульса.

вот что за 2 часа запилил(дубль 2)
Код:
uses crt,graph;
const n=100;
var mol: array [1..n,1..6] of real;
gd,gm,i,j,a,v:integer;
t,b,s:real;
begin
clrscr;
gd:=9; gm:=2;
t:=0.1; {время}
 randomize;
for i:=1 to n do
 for j:=1 to 6 do
  begin
  v:=random(9)+1;
  a:=random(359)+1;
  if (j=1) or (j=2) then mol[i,j]:=10;  {задаем радиус и массу}
  if j=3 then mol[i,3]:=v*cos(a); { скорость vx}
  if j=4 then mol[i,4]:=v*sin(a); { скорость Vy}
  if j=5 then mol[i,5]:=random(639)+1; { координата по x}
  if j=6 then mol[i,6]:= random(479)+1; { координата по y}
 end;

initgraph(gd,gm,'');
repeat
 for i:=2 to n do
  for j:=i-1 to n do
   begin
   s:=sqrt(sqr(mol[i,6]-mol[j,6])+sqr(mol[i,5]-mol[j,5])); {расчет соударений}
   if s<=mol[i,2]*2 then {если ударились}
    begin
    b:=mol[j,3];
    mol[j,3]:=mol[i,3];
    mol[i,3]:=b;           {меняем направлеие движения Vx}
    b:=mol[j,4];
    mol[j,4]:=mol[i,4];     {меняем направление движения Vy}
    mol[i,4]:=b;
    end;{конец расчета соударений}
   end;

 setcolor(15); {отрисовка}
 bar(0,0,640,480);
 for i:=1 to n do
  for j:=1 to 6 do
   begin
   mol[i,5];=mol[i,5]+(mol[i,3]*t); {Расчет новых координат Х и У}
   mol[i,6]:=mol[i,6]+(mol[i,4]*t);
   circle(mol[i,5],mol[i,6],mol[i,2]);
    until keypressed;

end.
блин с комментариями проблема

осталось прописать соударение о стенки и модель готова но вопрос как в данной модели учесть разность масс?
поясню в колбе будет 2 газа например О2 и N2 масс их разные и при соударении они вести будут себя по разному как это учесть?

вот сделал расчет соударения о стены но возникают иногда туннельные эффекты некоторые молекулы проходят сквозь стены почему?
if (mol[j,5]>=630) or (mol[j,5]<=10 ) then mol[j,3]:=mol[j,3]*(-1);{расчет соударения об стены}
if (mol[j,6]>=470) or (mol[j,6]<=10) then mol[j,4]:=mol[j,4]*(-1);

забыл уточнить что молекулы газа должны быть разного цвета например кислород красный а азот синий

Последний раз редактировалось Stilet; 21.11.2012 в 19:02.
Евгудвин вне форума Ответить с цитированием
Старый 21.11.2012, 19:23   #2
Евгудвин
 
Регистрация: 14.05.2011
Сообщений: 9
По умолчанию

Код:
uses crt,graph;
const n=100;
var mol: array [1..n,1..6] of real;
gd,gm,i,j,a,v:integer;
t,b,s:real;
begin
clrscr;
gd:=9; gm:=2;
t:=0.1; {ўаҐ¬п}
 randomize;
for i:=1 to n do
 for j:=1 to 6 do
  begin
  v:=random(9)+1;
  a:=random(359)+1;
  if i<=50 then
   begin
   if (j=1) or (j=2) then mol[i,j]:=10;  {§*¤*Ґ¬ а*¤Ёгб Ё ¬*ббг}
   if j=3 then mol[i,3]:=v*cos(a); { §*¤*Ґ¬ vx}
   if j=4 then mol[i,4]:=v*sin(a); { §*¤*Ґ¬ Vy}
   if j=5 then mol[i,5]:=random(639)+1; { §*¤*Ґ¬ Є®®а¤Ё**вг x}
   if j=6 then mol[i,6]:= random(229)+1; { §*¤*Ґ¬ Є®®а¤Ё**вг y}
  end else
  if i>50 then
  begin
   if (j=1) or (j=2) then mol[i,j]:=10;  {§*¤*Ґ¬ а*¤Ёгб Ё ¬*ббг}
   if j=3 then mol[i,3]:=v*cos(a); { §*¤*Ґ¬ vx}
   if j=4 then mol[i,4]:=v*sin(a); { §*¤*Ґ¬ Vy}
   if j=5 then mol[i,5]:=random(639)+1; { §*¤*Ґ¬ Є®®а¤Ё**вг x}
   if j=6 then mol[i,6]:= random(240)+240; { §*¤*Ґ¬ Є®®а¤Ё**вг y}
  end;
 end;
initgraph(gd,gm,'');
repeat
 for i:=2 to n-1 do
  for j:=i-1 to n do
   begin
   s:=sqrt(sqr(mol[i,6]-mol[j,6])+sqr(mol[i,5]-mol[j,5])); {Їа®ўҐаЄ* б®г¤*аҐ*Ё Є*¦¤®© ¬®«ҐЄг«л б Є*¦¤®©}
   if s<=mol[i,2]*2 then {Ґб«Ё г¤*аЁ«Ёбм}
    begin
    b:=mol[j,3];
    mol[j,3]:=mol[i,3];
    mol[i,3]:=b;           {¬Ґ*塞 ¤ўЁ¦Ґ*ЁҐ Ї® е}
    b:=mol[j,4];
    mol[j,4]:=mol[i,4];     {¬Ґ*塞 ¤ўЁ¦Ґ*ЁҐ Ї® г}
    mol[i,4]:=b;
    end;{Є®*Ґж §*Є®** б®еа**Ґ*Ёп н*ҐаЈЁЁ}
   if (mol[j,5]>=630) or (mol[j,5]<=10) then mol[j,3]:=mol[j,3]*(-1);
   if (mol[j,6]>=470) or (mol[j,6]<=10) then mol[j,4]:=mol[j,4]*(-1);
   end;

 setcolor(15); {®ваЁб®ўЄ*}
 bar(0,0,640,480);
 for i:=1 to n do
  for j:=1 to 6 do
   begin
   if i<=50 then
   begin
    setcolor(5);
    mol[i,5]:=mol[i,5]+(mol[i,3]*t); {*®ўлҐ Є®®а¤Ё**вл • Ё “}
    mol[i,6]:=mol[i,6]+(mol[i,4]*t);
    circle(round(mol[i,5]),round(mol[i,6]),round(mol[i,2]));
   end else
   if i>50 then
    begin
    setcolor(10);
    mol[i,5]:=mol[i,5]+(mol[i,3]*t); {*®ўлҐ Є®®а¤Ё**вл • Ё “}
    mol[i,6]:=mol[i,6]+(mol[i,4]*t);
    circle(round(mol[i,5]),round(mol[i,6]),round(mol[i,2]));
   end;
 end;
 until keypressed;

end.
вот сделал разделил покрасил осталось только учесть зависимость передачи импульса от массы помогите пожалуйста
Евгудвин вне форума Ответить с цитированием
Старый 23.11.2012, 17:37   #3
Евгудвин
 
Регистрация: 14.05.2011
Сообщений: 9
По умолчанию

up тема еще актуальна
Евгудвин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для тех кто работает TacoBell Свободное общение 4 22.02.2012 22:40
Очень надо написать программу, задачи не сложные для тех кто разбирается (не для меня увы) Artm3 Паскаль, Turbo Pascal, PascalABC.NET 2 08.03.2011 22:54