КП: Динамика лавины — различия между версиями
Sizova (обсуждение | вклад) (→Обсуждение результатов и выводы) |
Sizova (обсуждение | вклад) (→Визуализация задачи) |
||
Строка 49: | Строка 49: | ||
ctx.fillStyle="#8888ff"; | ctx.fillStyle="#8888ff"; | ||
− | + | ||
− | + | var r = 5; | |
− | |||
− | |||
var grass_height = 5; | var grass_height = 5; | ||
var mountian_length = 400; | var mountian_length = 400; | ||
− | |||
var sin_alpha_1 = 0.5; | var sin_alpha_1 = 0.5; | ||
var cos_alpha_1 = 0.866; | var cos_alpha_1 = 0.866; | ||
− | |||
var sun_r = 50; | var sun_r = 50; | ||
− | var | + | var rx1 = 0, ry1 = (mountian_length)* sin_alpha_1 / cos_alpha_1 - r; |
+ | var rx2 = 40, ry2 = (mountian_length + rx2 - 4 * r) * sin_alpha_1 / cos_alpha_1; | ||
+ | var rx3 = 80, ry3 = (mountian_length + rx3 - 6 * r) * sin_alpha_1 / cos_alpha_1; | ||
var g = 2; | var g = 2; | ||
− | var dt = 0. | + | var dt = 0.15; |
var m = 1; | var m = 1; | ||
var B = 0.06; | var B = 0.06; | ||
var B2 = 0.09; | var B2 = 0.09; | ||
− | var | + | var vx1 = 2, vy1 = 2; |
− | var | + | var vx2 = 2, vy2 = 2; |
+ | var vx3 = 2, vy3 = 2; | ||
+ | var fy1 = 0; | ||
+ | var fx1 = 0; | ||
+ | var fy2 = 0; | ||
+ | var fx2 = 0; | ||
+ | var fy3 = 0; | ||
+ | var fx3 = 0; | ||
+ | |||
+ | var mu1 = 0.2; | ||
+ | |||
+ | var a1 = g * (sin_alpha_1 - mu1 * cos_alpha_1); | ||
function step() { | function step() { | ||
Строка 76: | Строка 85: | ||
function tick() { | function tick() { | ||
− | if ( | + | if (rx1 + r > 0 && rx1 - r < mountian_length && ry1 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx1 |
− | + | + mountian_length * sin_alpha_1 / cos_alpha_1) { | |
− | + | fy1 = m * g - B * vy1; | |
− | + | fx1 = m * g - B * vx1; | |
− | + | vy1 = vy1 + fy1 / m * dt * sin_alpha_1; | |
− | + | vx1 = vx1 + fx1 / m * dt * cos_alpha_1; | |
− | + | ry1 = ry1 + vy1 * dt * sin_alpha_1; | |
− | + | rx1 = rx1 + vx1 * dt * cos_alpha_1; | |
− | + | ||
− | + | } | |
+ | if (rx1 - r > mountian_length){ | ||
+ | |||
+ | fx1 = - B2 * vx1; | ||
+ | vx1 = vx1 + fx1 / m * dt; | ||
+ | rx1 = rx1 + vx1 * dt; | ||
+ | ry1 = height - grass_height; | ||
+ | } | ||
+ | if (rx2 + r > 0 && rx2 - r < mountian_length && ry2 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx2 | ||
+ | + mountian_length * sin_alpha_1 / cos_alpha_1) { | ||
+ | fy2 = m * g - B * vy2; | ||
+ | fx2 = m * g - B * vx2; | ||
+ | vy2 = vy2 + fy2 / m * dt * sin_alpha_1; | ||
+ | vx2 = vx2 + fx2 / m * dt * cos_alpha_1; | ||
+ | ry2 = ry2 + vy2 * dt * sin_alpha_1; | ||
+ | rx2 = rx2 + vx2 * dt * cos_alpha_1; | ||
+ | } | ||
+ | if (rx2 - r > mountian_length){ | ||
+ | ry2 = height - grass_height; | ||
+ | fx2 = - B2 * vx2; | ||
+ | vx2 = vx2 + fx2 / m * dt; | ||
+ | rx2 = rx2 + vx2 * dt; | ||
+ | } | ||
+ | if (rx3 + r > 0 && rx3 - r < mountian_length && ry3 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx3 | ||
+ | + mountian_length * sin_alpha_1 / cos_alpha_1) { | ||
+ | fy3 = m * g - B * vy3; | ||
+ | fx3 = m * g - B * vx3; | ||
+ | vy3 = vy3 + fy3 / m * dt * sin_alpha_1; | ||
+ | vx3 = vx3 + fx3 / m * dt * cos_alpha_1; | ||
+ | ry3 = ry3 + vy3 * dt * sin_alpha_1; | ||
+ | rx3 = rx3 + vx3 * dt * cos_alpha_1; | ||
} | } | ||
− | if ( | + | if (rx3 - r > mountian_length){ |
− | + | ry3 = height - grass_height; | |
− | + | fx3 = - B2 * vx3; | |
− | + | vx3 = vx3 + fx3 / m * dt; | |
− | + | rx3 = rx3 + vx3 * dt; | |
} | } | ||
Строка 119: | Строка 158: | ||
ctx.fillStyle="#fff200"; //sun | ctx.fillStyle="#fff200"; //sun | ||
− | + | ctx.beginPath(); | |
− | + | ctx.arc(width, 0, sun_r, 0, 2 * Math.PI); | |
− | + | ctx.fill(); | |
+ | |||
+ | ctx.fillStyle="#ff0000"; //snow1 | ||
+ | ctx.beginPath(); | ||
+ | ctx.arc(rx1, ry1, r, 0, 2 * Math.PI); | ||
+ | ctx.fill(); | ||
+ | |||
+ | ctx.fillStyle="#0900ff"; //snow2 | ||
+ | ctx.beginPath(); | ||
+ | ctx.arc(rx2, ry2, r, 0, 2 * Math.PI); | ||
+ | ctx.fill(); | ||
− | ctx.fillStyle="#e6e5d1"; // | + | ctx.fillStyle="#e6e5d1"; //snow3 |
ctx.beginPath(); | ctx.beginPath(); | ||
− | + | ctx.arc(rx3, ry3, r, 0, 2 * Math.PI); | |
− | + | ctx.fill(); | |
Строка 134: | Строка 183: | ||
} | } | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Версия 15:25, 11 июня 2015
А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 2015 > Динамика лавиныКурсовой проект по Теоретической механике
Исполнитель: Сизова Екатерина
Группа: 09 (23604)
Семестр: весна 2015
Содержание
Аннотация проекта
На данный момент лавины являются одним из самых опасных видов природных катастроф. Под снежными лавинами погибает большое количество горнолыжников, сноубордистов, горных туристов, а также происходит разрушение горных деревень, дорожной инфраструктуры и наносится экологический вред лесам. Целью данной работы является разработка модели лавины, условий, при которых происходит ее сход(отрыв), а также расчет последствий, к которым может привести сход лавины.
Формулировка задачи
- разработка модели лавины, как набор шариков, обладающих определенной массой и находящихся в неустойчивом состоянии
- расчет параметров отрыва(схода лавины), ее распространения, а также исследование динамических характеристик процесса жизненного цикла лавины
Общие сведения по теме
Снег удерживается на склоне горы за счет силы трения. Сход лавины происходит в тот момент, когда сила давления массы снега начинает превышать силу трения.
Наиболее благоприятными для лавинообразования являются склоны крутизной
. Сход со склона скопившейся снежной массы обычно провоцируется климатическими причинами: резкой сменой погоды, дождями, а также механическими воздействиями на снежную массу. Иногда, в силу установившегося относительного равновесия между действующей силой трения и силой давления, сход лавины может инициироваться незначительным толчком (например, звуком ружейного выстрела или давлением на снег одного человека — горнолыжника, сноубордиста)Решение
Моделирование схода лавины происходит в двумерном пространстве. В качестве простейшей модели горы был взят прямоугольный треугольник с углом наклона
, а в качестве снежной массы - элементs-круги радиуса , имитирующие отдельные частицы снежной массы.Целесообразно разделить движение частицы на 2 части: движение по наклонной плоскости и движение по горизонтальной поверхности.
При движении по наклонной плоскости шары скатываются со склона за счет силы тяжести
, однако удерживаются на склоне за счет силы трения . При данном движении меняются координаты частицы и по оси ординат, и по оси абсцисс. Сила, действующая на частицу, вычисляется по формуле , где - коэффициент, связывающий скорость частицы и силу.После того, как шары скатились со склона, они продолжают движение по горизонтальной поверхности, замедляясь за счет силы трения
. Сила, действующая на частицу, считается аналогично , однако взят другой коэффициент пропорциональности и составляющие, отвечающие за движение по вертикали взаимоуничтожают друг друга, за счёт чего происходит лишь торможение по горизонтальной оси.Изначально частицы расположены на расстоянии, превышающим радиус частицы в 8 раз.
Визуализация задачи
Файл "dl_avalanche_finish.js"
1 function main_dl_avalanche_finish() {
2
3 var ctx = canvas_avalanche_finish.getContext("2d");
4 var width = canvas_avalanche_finish.width;
5 var height = canvas_avalanche_finish.height;
6
7 ctx.fillStyle="#8888ff";
8
9 var r = 5;
10 var grass_height = 5;
11 var mountian_length = 400;
12 var sin_alpha_1 = 0.5;
13 var cos_alpha_1 = 0.866;
14 var sun_r = 50;
15 var rx1 = 0, ry1 = (mountian_length)* sin_alpha_1 / cos_alpha_1 - r;
16 var rx2 = 40, ry2 = (mountian_length + rx2 - 4 * r) * sin_alpha_1 / cos_alpha_1;
17 var rx3 = 80, ry3 = (mountian_length + rx3 - 6 * r) * sin_alpha_1 / cos_alpha_1;
18
19 var g = 2;
20 var dt = 0.15;
21 var m = 1;
22 var B = 0.06;
23 var B2 = 0.09;
24 var vx1 = 2, vy1 = 2;
25 var vx2 = 2, vy2 = 2;
26 var vx3 = 2, vy3 = 2;
27 var fy1 = 0;
28 var fx1 = 0;
29 var fy2 = 0;
30 var fx2 = 0;
31 var fy3 = 0;
32 var fx3 = 0;
33
34 var mu1 = 0.2;
35
36 var a1 = g * (sin_alpha_1 - mu1 * cos_alpha_1);
37
38 function step() {
39 tick();
40 draw();
41 }
42
43 function tick() {
44 if (rx1 + r > 0 && rx1 - r < mountian_length && ry1 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx1
45 + mountian_length * sin_alpha_1 / cos_alpha_1) {
46 fy1 = m * g - B * vy1;
47 fx1 = m * g - B * vx1;
48 vy1 = vy1 + fy1 / m * dt * sin_alpha_1;
49 vx1 = vx1 + fx1 / m * dt * cos_alpha_1;
50 ry1 = ry1 + vy1 * dt * sin_alpha_1;
51 rx1 = rx1 + vx1 * dt * cos_alpha_1;
52
53 }
54 if (rx1 - r > mountian_length){
55
56 fx1 = - B2 * vx1;
57 vx1 = vx1 + fx1 / m * dt;
58 rx1 = rx1 + vx1 * dt;
59 ry1 = height - grass_height;
60 }
61 if (rx2 + r > 0 && rx2 - r < mountian_length && ry2 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx2
62 + mountian_length * sin_alpha_1 / cos_alpha_1) {
63 fy2 = m * g - B * vy2;
64 fx2 = m * g - B * vx2;
65 vy2 = vy2 + fy2 / m * dt * sin_alpha_1;
66 vx2 = vx2 + fx2 / m * dt * cos_alpha_1;
67 ry2 = ry2 + vy2 * dt * sin_alpha_1;
68 rx2 = rx2 + vx2 * dt * cos_alpha_1;
69 }
70 if (rx2 - r > mountian_length){
71 ry2 = height - grass_height;
72 fx2 = - B2 * vx2;
73 vx2 = vx2 + fx2 / m * dt;
74 rx2 = rx2 + vx2 * dt;
75 }
76 if (rx3 + r > 0 && rx3 - r < mountian_length && ry3 < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx3
77 + mountian_length * sin_alpha_1 / cos_alpha_1) {
78 fy3 = m * g - B * vy3;
79 fx3 = m * g - B * vx3;
80 vy3 = vy3 + fy3 / m * dt * sin_alpha_1;
81 vx3 = vx3 + fx3 / m * dt * cos_alpha_1;
82 ry3 = ry3 + vy3 * dt * sin_alpha_1;
83 rx3 = rx3 + vx3 * dt * cos_alpha_1;
84 }
85 if (rx3 - r > mountian_length){
86 ry3 = height - grass_height;
87 fx3 = - B2 * vx3;
88 vx3 = vx3 + fx3 / m * dt;
89 rx3 = rx3 + vx3 * dt;
90 }
91
92 }
93
94 function draw() {
95
96 ctx.clearRect(0, 0, width, height); //clear
97 ctx.beginPath();
98
99 ctx.fillStyle="#49b9ed"; //sky
100 ctx.beginPath();
101 ctx.fillRect(0, 0, width, height);
102
103 ctx.fillStyle="#16a600"; //grass
104 ctx.beginPath();
105 ctx.fillRect(0, height - grass_height, width, height);
106
107 ctx.fillStyle="#57564c"; //mountain
108 ctx.beginPath();
109 ctx.moveTo(0, height - grass_height);
110 ctx.lineTo(mountian_length, height - grass_height);
111 ctx.lineTo(0, mountian_length * sin_alpha_1 / cos_alpha_1);
112 ctx.lineTo(0, height - grass_height);
113 ctx.fill();
114
115
116 ctx.fillStyle="#fff200"; //sun
117 ctx.beginPath();
118 ctx.arc(width, 0, sun_r, 0, 2 * Math.PI);
119 ctx.fill();
120
121 ctx.fillStyle="#ff0000"; //snow1
122 ctx.beginPath();
123 ctx.arc(rx1, ry1, r, 0, 2 * Math.PI);
124 ctx.fill();
125
126 ctx.fillStyle="#0900ff"; //snow2
127 ctx.beginPath();
128 ctx.arc(rx2, ry2, r, 0, 2 * Math.PI);
129 ctx.fill();
130
131 ctx.fillStyle="#e6e5d1"; //snow3
132 ctx.beginPath();
133 ctx.arc(rx3, ry3, r, 0, 2 * Math.PI);
134 ctx.fill();
135
136
137 }
138
139 setInterval(step, 1000 / 60); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
140
141 }
Файл "dl_avalanche_finish.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>Avalanche</title>
5 <script src="dl_avalanche_finish.js"></script>
6 </head>
7 <body onload="main_dl_avalanche_finish();">
8 <canvas id="canvas_avalanche_finish" width="800" height="400" style="border: 1px solid #000000"></canvas>
9 </body>
10 </html>
Обсуждение результатов и выводы
В ходе работы над курсовым проектом была разработана простейшая модель, визуализирующая процесс схода лавины. Было установлено, что при увеличении коэффициента пропорциональности между силой
, действующей на частицу и скоростью частицы уменьшается координата конечного положения частицы. При увеличении начальной скорости увеличивается координата конечного положения частицы.Из визуализации программы видно, что после схода расстояние между частицами уменьшается по сравнению с расстоянием между начальными положениями частиц примерно в
раз, т.е. происходит "кучкование" частиц. Следовательно можно сделать вывод о том, что линейные размеры района, охваченного снежной массой, значительно меньше линейных размеров снежной массы, из которой образуется лавина.Дальнейшие предложения по проекту:
- Увеличить число частиц, дав возможность пользователю выбирать количество с помощью движка
- Дать возможность пользователю менять коэффициент пропорциональности с помощью движка
- Добавить движок, позволяющий менять угол наклона горы
Скачать отчет
Скачать презентацию: