Текущая версия |
Ваш текст |
Строка 3: |
Строка 3: |
| | | |
| Исполнитель: [[Волоцкий_Арсений|Волоцкий Арсений]],[[Штамм_Максим|Штамм Максим]] | | Исполнитель: [[Волоцкий_Арсений|Волоцкий Арсений]],[[Штамм_Максим|Штамм Максим]] |
− |
| |
− | Файл: [[http://tm.spbstu.ru/htmlets/VolotskyAA/text.docx]]
| |
| | | |
| ==Математическая модель== | | ==Математическая модель== |
Строка 21: |
Строка 19: |
| ==Визуализация== | | ==Визуализация== |
| | | |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/VolotskyAA/main.html |width=1000|height=1100|border=0 }} | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/VolotskyAA/main.html |width=1000|height=1500 |border=0 }} |
− | | |
− | ==Код программы==
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | let ctx = space.getContext("2d"),
| |
− | ctt = graph.getContext("2d"),
| |
− | | |
− | Fg,
| |
− | R,
| |
− | rho,
| |
− | E,
| |
− | t = 0,
| |
− | dt = 0.01, //переменная интегрироваания
| |
− | g = 10, //уск. св. падения
| |
− | k, //коэф. жесткости
| |
− | F_l_y, //сила упругости в левой пружине по оси у
| |
− | F_r_y, //сила упругости в правой пружине по оси у
| |
− | F_y, //суммарная сила по оси у
| |
− | F_l_x, //сила упругости в левой пружине по оси х
| |
− | F_r_x, //сила упругости в правой пружине по оси х
| |
− | F_x, //суммарная сила упругости по х
| |
− | F_dis_y, //сила сопр-ия у
| |
− | F_dis_x, //сила сопр-ия x
| |
− | betta, //коэф затухания
| |
− | cos_l, //зн-ие косинуса для левой пружины
| |
− | cos_r, //зн-ие косинуса для правой пружины
| |
− | sin_l, //зн-ие синуса для левой пружины
| |
− | sin_r, //зн-ие синуса для правой пружины
| |
− | a, //width
| |
− | b, //height
| |
− | L, //length
| |
− | ball_weight,
| |
− | L_spr,
| |
− | scale_x,
| |
− | y_max,
| |
− | max_pot_energy,
| |
− | i;
| |
− | | |
− | //модуль физики
| |
− | | |
− | function right_spr_deform(x, x_next, y, y_next) {
| |
− | return Math.sqrt(Math.pow((x_next - x),2)+Math.pow((y_next - y),2));
| |
− | }
| |
− | | |
− | | |
− | function left_spr_deform(x, x_prev, y, y_prev) {
| |
− | return Math.sqrt(Math.pow((x - x_prev),2)+Math.pow((y - y_prev),2));
| |
− | }
| |
− | | |
− | | |
− | function physics(i)
| |
− | {
| |
− | cos_l = (r[i].y - r[i-1].y) / left_spr_deform(r[i].x, r[i-1].x, r[i].y, r[i-1].y);
| |
− | sin_l = (r[i].x - r[i-1].x) / left_spr_deform(r[i].x, r[i-1].x, r[i].y, r[i-1].y);
| |
− | | |
− | F_l_y = -k * (left_spr_deform(r[i].x, r[i-1].x, r[i].y, r[i-1].y) - L_spr) * cos_l;
| |
− | F_l_x = -k * (left_spr_deform(r[i].x, r[i-1].x, r[i].y, r[i-1].y) - L_spr) * sin_l;
| |
− | | |
− | cos_r = (r[i+1].y - r[i].y) / right_spr_deform(r[i].x, r[i+1].x, r[i].y, r[i+1].y);
| |
− | sin_r = (r[i+1].x - r[i].x) / right_spr_deform(r[i].x, r[i+1].x, r[i].y, r[i+1].y);
| |
− | | |
− | F_r_y = k * (right_spr_deform(r[i].x, r[i+1].x, r[i].y, r[i+1].y) - L_spr) * cos_r;
| |
− | F_r_x = k * (right_spr_deform(r[i].x, r[i+1].x, r[i].y, r[i+1].y) - L_spr) * sin_r;
| |
− | | |
− | F_dis_x = -betta * r[i].v_x;
| |
− | F_dis_y = -betta * r[i].v_y;
| |
− | | |
− | F_y = F_r_y + F_l_y + Fg + F_dis_y;
| |
− | F_x = F_r_x + F_l_x + F_dis_x;
| |
− | | |
− | r[i].v_y = r[i].v_y + F_y * dt / r[i].m;
| |
− | r[i].v_x = r[i].v_x + F_x * dt / r[i].m;
| |
− | | |
− | r[i].x = r[i].x + r[i].v_x * dt;
| |
− | r[i].y = r[i].y + r[i].v_y * dt;
| |
− | }
| |
− | | |
− | | |
− | function teor_phys()
| |
− | {
| |
− | a = parseInt(document.getElementById("p1").value); //width
| |
− | b = parseInt(document.getElementById("p2").value); //height
| |
− | L = parseInt(document.getElementById("p3").value); //length
| |
− | | |
− | let Qn = rho * b / 1000 * a / 1000,
| |
− | I = Math.pow(a,3) * b / 12 / 1000000;
| |
− | | |
− | R = 5 / 384 * Qn * Math.pow(L,4) / (E * I);
| |
− | console.log(R+' m');
| |
− | | |
− | ball_weight = rho * a / 1000 * b / 1000 * L / K;
| |
− | k = ball_weight * 100;
| |
− | betta = k / 20;
| |
− | L_spr = L / (K - 1);
| |
− | scale_x = 380 / L;
| |
− | | |
− | for (i=0; i<K; i++)
| |
− | {
| |
− | r.push(new Ball(i * L_spr, 0, ball_weight, 0, 0));
| |
− | }
| |
− | Fg = -r[1].m * g;
| |
− | }
| |
− | | |
− | | |
− | function fast_modeling()
| |
− | {
| |
− | while (t < 200)
| |
− | {
| |
− | for (i = 1; i < K - 1; i++)
| |
− | {
| |
− | physics(i);
| |
− | }
| |
− | t += dt;
| |
− | }
| |
− | y_max = -r[4].y;
| |
− | t = 0;
| |
− | for (i = 1; i < K - 1; i++)
| |
− | {
| |
− | r[i].y = 0;
| |
− | r[i].x = i * L_spr;
| |
− | r[i].v_x = 0;
| |
− | r[i].v_y = 0;
| |
− | }
| |
− | max_pot_energy = sum_pot_energy();
| |
− | }
| |
− | | |
− | | |
− | function sum_springs_energy()
| |
− | {
| |
− | let sum_spr_energy = 0,
| |
− | L_def,
| |
− | R_def;
| |
− | for (i = 1; i < K; i += 2){
| |
− | L_def = left_spr_deform(r[i].x, r[i-1].x, r[i].y, r[i-1].y) - L_spr;
| |
− | R_def = right_spr_deform(r[i].x, r[i+1].x, r[i].y, r[i+1].y) - L_spr;
| |
− | sum_spr_energy += k * Math.pow(L_def,2) / 2 + k * Math.pow(R_def,2) / 2;
| |
− | }
| |
− | return sum_spr_energy;
| |
− | }
| |
− | | |
− | | |
− | function sum_kin_energy()
| |
− | {
| |
− | let E_kin = 0;
| |
− | for (i = 1; i < K - 1; i++)
| |
− | {
| |
− | E_kin += r[i].kin_energy();
| |
− | }
| |
− | return E_kin;
| |
− | }
| |
− | | |
− | | |
− | function sum_pot_energy()
| |
− | {
| |
− | let E_pot = 0;
| |
− | for (i = 0; i < K; i++)
| |
− | {
| |
− | E_pot += (r[i].m * g * y_max - r[i].pot_energy());
| |
− | }
| |
− | return E_pot;
| |
− | }
| |
− | | |
− | | |
− | function sum_full_energy()
| |
− | {
| |
− | return sum_pot_energy() + sum_kin_energy() + sum_springs_energy();
| |
− | }
| |
− | | |
− | | |
− | //модуль рисования
| |
− | | |
− | | |
− | function draw()
| |
− | {
| |
− | t += dt;
| |
− | ctx.beginPath();
| |
− | ctx.arc(10 +r [0].x * scale_x, 100, 10, 0, 2 * Math.PI);
| |
− | ctx.arc(10 + r[K-1].x * scale_x, 100, 10, 0, 2 * Math.PI);
| |
− | ctx.fill();
| |
− | | |
− | let e_kin_prev = sum_kin_energy(),
| |
− | e_pot_prev = sum_pot_energy(),
| |
− | e_spr_prev = sum_springs_energy(),
| |
− | e_full_prev = sum_full_energy(),
| |
− | energy_scale = -180 / max_pot_energy;
| |
− | | |
− | for (i = 1; i < K - 1; i++)
| |
− | {
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = 'white';
| |
− | ctx.arc(10 + r[i].x * scale_x, 100 - r[i].y * 10, 11, 0, 2 * Math.PI);
| |
− | ctx.fill();
| |
− | | |
− | ctx.beginPath();
| |
− | physics(i);
| |
− | ctx.fillStyle = 'black';
| |
− | ctx.arc(10 + r[i].x * scale_x, 100 - r[i].y * 10, 10, 0, 2 * Math.PI);
| |
− | ctx.fill();
| |
− | }
| |
− | | |
− | | |
− | ctt.lineWidth = '2';
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.moveTo((t - dt) * 10,200 + e_pot_prev*energy_scale);
| |
− | ctt.strokeStyle = 'red';
| |
− | ctt.lineTo(t * 10,200 + sum_pot_energy()*energy_scale);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.moveTo((t - dt) * 10,200 + e_spr_prev * energy_scale);
| |
− | ctt.strokeStyle = 'black';
| |
− | ctt.lineTo(t * 10,200 + sum_springs_energy() * energy_scale);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.moveTo((t - dt) * 10,200 + e_kin_prev * energy_scale);
| |
− | ctt.strokeStyle = 'green';
| |
− | ctt.lineTo(t * 10,200 + sum_kin_energy() * energy_scale);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.moveTo((t - dt) * 10,200 + e_full_prev * energy_scale);
| |
− | ctt.strokeStyle = 'blue';
| |
− | ctt.lineTo(t * 10,200 + sum_full_energy() * energy_scale);
| |
− | ctt.stroke();
| |
− | | |
− | if (t > 40)
| |
− | {
| |
− | ctt.beginPath();
| |
− | ctt.fillStyle = 'white';
| |
− | ctt.rect(0,0,400,400);
| |
− | ctt.fill();
| |
− | t = 0;
| |
− | drawgraf();
| |
− | }
| |
− | }
| |
− | | |
− | | |
− | function drawgraf()
| |
− | {
| |
− | let ctthig = 400,
| |
− | cttlen = 400;
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.strokeStyle = 'black';
| |
− | ctt.lineWidth="3";
| |
− | ctt.moveTo(0,ctthig / 2);
| |
− | ctt.lineTo(cttlen,ctthig / 2);
| |
− | ctt.lineTo(cttlen - 10,ctthig / 2 - 10);
| |
− | ctt.moveTo(cttlen,ctthig / 2);
| |
− | ctt.lineTo(cttlen - 10,ctthig / 2 + 10);
| |
− | ctt.moveTo(0, ctthig);
| |
− | ctt.lineTo(0,0);
| |
− | ctt.lineTo(-10,10);
| |
− | ctt.moveTo(0,0);
| |
− | ctt.lineTo(10,10);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.lineWidth = '1';
| |
− | ctt.rect(299, 0, 101, 60);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.lineWidth = '4';
| |
− | ctt.strokeStyle = 'red';
| |
− | ctt.moveTo(390, 7);
| |
− | ctt.lineTo(395,7);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.lineWidth = '4';
| |
− | ctt.strokeStyle = 'black';
| |
− | ctt.moveTo(390, 22);
| |
− | ctt.lineTo(395,22);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.lineWidth = '4';
| |
− | ctt.strokeStyle = 'green';
| |
− | ctt.moveTo(390, 37);
| |
− | ctt.lineTo(395,37);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.beginPath();
| |
− | ctt.lineWidth = '4';
| |
− | ctt.strokeStyle = 'blue';
| |
− | ctt.moveTo(390, 52);
| |
− | ctt.lineTo(395,52);
| |
− | ctt.stroke();
| |
− | | |
− | ctt.font = "normal small-caps normal 13px Times New Roman";
| |
− | ctt.fillText('Full', 300, 55);
| |
− | | |
− | ctt.font = "normal small-caps normal 13px Times New Roman";
| |
− | ctt.fillText('Kinetic', 300, 40);
| |
− | | |
− | ctt.font = "normal small-caps normal 13px Times New Roman";
| |
− | ctt.fillText('Interaction', 300, 25);
| |
− | | |
− | ctt.font = "normal small-caps normal 13px Times New Roman";
| |
− | ctt.fillText('Potencial', 300, 10);
| |
− | }
| |
− | | |
− | | |
− | //модуль вывода
| |
− | | |
− | | |
− | button1.onclick = function()
| |
− | {
| |
− | ctt.moveTo(0,200);
| |
− | if (document.getElementById('p4').checked === true)
| |
− | {
| |
− | rho = 7900;
| |
− | E = 200000;
| |
− | }
| |
− | if (document.getElementById('p5').checked === true)
| |
− | {
| |
− | rho = 600;
| |
− | E = 100000;
| |
− | }
| |
− | teor_phys();
| |
− | fast_modeling();
| |
− | timerId = setInterval(draw, 60/1000);
| |
− | drawgraf();
| |
− | };
| |
− | | |
− | | |
− | button2.onclick = function()
| |
− | {
| |
− | clearInterval(timerId);
| |
− | };
| |
− | | |
− | | |
− | button3.onclick = function()
| |
− | {
| |
− | clearInterval(timerId);
| |
− | r = [];
| |
− | t = 0;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = 'white';
| |
− | ctx.rect(0,0,400,400);
| |
− | ctx.fill();
| |
− | ctt.beginPath();
| |
− | ctt.fillStyle = 'white';
| |
− | ctt.rect(0,0,400,400);
| |
− | ctt.fill();
| |
− | }
| |
− | }
| |
− | </syntaxhighlight>
| |
− | </div>
| |