ЛЕКЦИЯ 12
ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ
ФИЗИЧЕСКИХ ПРОЦЕССОВ
Единичная реализация является основным элементом

случайного выбора (вынимание жетона из вращающегося барабана, поглощение частицы,…), называемый «единичным жребием»
Задача 1
![]()









Решение.

Выберем на оси х N точек
. Пусть Т1 и Т2 – температуры на верхней и нижней поверхностях. Для каждой точки выполним следующий расчет температуры Т(х).
Напишем на языке Ruby следующую программу
x1=
# задаем начальное значение координаты х
y1=0 # задаем начальное значение координаты у
N1=0 # задаем начальное значение числа частиц, достиг
ших верхней поверхности
N2=0 # задаем начальное значение числа частиц, достиг
ших нижней поверхности
for i in 1..100 # цикл для 100 частиц, вылетающих из точки (x1,0)
for k in 1…1000 # цикл для 1000 поворотов частицы
TT=rand(360) # случайное значение угла
x2=x1+s*sin(TT) # новое значение координаты х
y2=y1+s*cos(TT) # новое значение координаты у
if x2>0 and x2<а
end
end
if x2<0 N2=N2+1
end
if x2>a N1=N1+1
end
end
T=(N1*T1+N2*T1)/100
Таким образом мы рассчитали температуру Т(х) в точке (х,0). Теперь необходимо повторить расчет для каждой из точек на оси х и проверить формулу зависимости температуры от координаты.


Эта двумерная задача решается аналогичным способом.
Задаем начальные значения координат x1 и y1 на окружности, рассчитываем методом, описанным ранее число частиц N1, достигших правой стороны квадрата, температура в которой была равна Т1, N2- левой стороны с температурой Т2 , верхней N3 и Т3, нижней N4 и Т4 и вычисляем 
где NN число частиц, вылетевших из точки (х. у).
Задача 2

Решение.
Длина свободного пробега имеет непрерывное распределение, поэтому для получения значения случайной величины вначале ищем функцию распределения F(l).


Затем получаем случайную величину
, равномерно распределенную на интервале (0,1) и ищем l по формуле ![]()
Координаты молекулы в каждый момент времени будем записывать как ![]()
N – число положений молекулы. Зная координаты частицы в различные моменты времени, нанеся их на плоскость и соединив линиями, получим траекторию движения. Таким образом, основная задача состоит в том, чтобы найти массивы
.
Напишем на языке Ruby следующую программу
x(0)=0 # задаем начальное значение координаты х
y(0)=0 # задаем начальное значение координаты у
l=0.58*10**(-5) # задаем среднее значение длины свободного пробега
N=100 # задаем число положений частицы
for i in 1..100 # цикл для 100 положений частицы
z=rand # значение случайной величины ![]()
ll=-l*log(1-z) # значение случайной величины длины свободного пробега
TT=rand(360) # случайное значение угла
x(i+1)=x(i)+ll*sin(TT) # новое значение координаты х
y(i+1)=y(i)+ll*cos(TT) # новое значение координаты у
end
Массивы
найдены.
Задача 3

Считая, что при числе нейтронов больше 500 реактор взрывается, найти критический размер реактора. Стенки реактора без отражающих свойств.
Решение.
Будем задавать размер реактора (а) и рассчитывать изменение числа нейтронов со временем. Если при данном размере число нейтронов растет и со временем превышает 500, считаем, что реактор взрывается. Изменяя а, найдем критический размер реактора,
Найдем вначале число нейтронов, вылетающих при делении атома урана. Будем считать, что может вылететь либо 2, либо 3 нейтрона. Найдем закон распределения случайной величины – числа вылетающих нейтронов:
Число вылетающих нейтронов | 2 | 3 |
Вероятность события | Р1 | Р2 |
Для того, чтобы найти Р1 и Р2 решим систему уравнений
Получим Р1 = 0.53 и Р2 = 0.47
Согласно правилам моделирования дискретной случайной величины, задаем случайную величину
. Если
считаем, что вылетело 2, а если
, то 3 нейтрона.
Координаты нейтронов в каждый момент времени будем записывать как
, где в начальный момент времени ![]()
Напишем на языке Ruby следующую программу
x(0)=0 # задаем начальное значение координаты х
y(0)=0 # задаем начальное значение координаты у
l=1.7 # задаем длинy свободного пробега
a=20 # задаем размер реактора
N=30 # задаем число нейтронов
for i in 1..300 # задаем число моментов времени
for i in 1..N # цикл для 30 координат нейтронов
x(i)=a*rand # начальное значение координаты х i-го нейтрона
y(i)=a*rand # начальное значение координаты y i-го нейтрона
end
for i in 1..N # цикл для N координат нейтронов
TT=rand(360) # случайное значение угла
x(i)=x(i)+ll*sin(TT) # новое значение координаты х
y(i)=y(i)+ll*cos(TT) # новое значение координаты у
if x(i)>a and x(i)<0 # поглощение нейтронов на стенках
N=N-1
все i больше данного заменяются на i-1
end
if y(i)>a and y(i)<0 # поглощение нейтронов на стенках
N=N-1
все i больше данного заменяются на i-1
end
z=rand # случайная величина, определяющая взаимодейст
вие нейтрона с ядром
# изотропное рассеяние нейтрона
end
and # поглощение нейтрона
N=N-1
все i больше данного заменяются на i-1
end
zz=rand # деление ядра
# деление ядра на 2 нейтрона
N=N+1
все i больше данного заменяются на i+1
x(i+1)=x(i)
y(i+1)=y(i)
end
# деление ядра на 3 нейтрона
N=N+2
все i больше данного заменяются на i+2
x(i+1)=x(i)
y(i+1)=y(i)
x(i+2)=x(i)
y(i+2)=y(i)
end
end
if N>500 print “взрыв” end
end
Для данного а определено, будет ли взрыв через 300 взаимодействий нейтронов с ядрами.
Задача 41

Решение.

Рисунок 1 Рисунок 2
Батарея состоит из 100 элементов, расположенных в 10 строках и 10 столбцах. Ток, получаемый с помощью элемента батареи, который находится в i – й строке и j - м столбце, можно вычислить по формуле
, где
-внутреннее сопротивление элемента,
-внешнее сопротивление для этого элемента. Схема для этого элемента батареи представлена на рисунках 1 и 2. Здесь для элемента (i,j)
- сопротивление остальных элементов столбца, а
- сопротивление остальных столбцов.

В этом случае сопротивление внешней цепи записывается как
![]()
Мощность, выделяемая батареей, рассчитывается по формуле 
Согласно условию, на батарею попадает одна частица в секунду.
Напишем на языке Ruby следующую программу
for i in 1..10 # задаем начальные значения сопротивлений
for j in 1.10
r(i,j)=100
end
end
for k in 1..100 # считаем изменение мощности за 100 секунд
i=rand # случайным образом выбираем i-ю строку
j=rand # случайным образом выбираем j –й столбец
r(i,j)=3*r(i,j)
Рассчитываем W
if W> 0.022 stop
end
end
print k
k – время, за которое батарея теряет работоспособность
Задача 5



Решение.

Пусть R(i) – сопротивления, включенные последовательно с источником тока, а R(10+i) – параллельно.
Рассмотрим элементарное звено, состоящее из сопротивлений R1, R2, R3. Тогда сопротивление RR этого звена можно рассчитать по формуле

Напишем на языке Ruby программу для получения 100 значений сопротивления цепи.
for k in 1…100
for i in 1..10
R(i)=2.7+0.6rand # задаем случайную величину R(i)
R(10+i)=2.7+0.6rand # задаем случайную величину R(10+i)
end
R3=R10+R20
for j in 1..9
R1=R(10-j)
R2=R(20-j)
RR(k)=R1+R2*R3/(R2+R3)
R3=RR(k)
end
print RR(k)
end
Теперь имея 100 значений сопротивления цепи строим гистограмму и вычисляем



