Редактирование: Моделирование провисания балки

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 2: Строка 2:
 
Моделирование провисания балки из дерева или стали
 
Моделирование провисания балки из дерева или стали
  
Исполнитель: [[Волоцкий_Арсений|Волоцкий Арсений]],[[Штамм_Максим|Штамм Максим]]
+
Исполнитель: [[Волоцкий_Арсений|Волоцкий Арсений]],[[Максим_Штамм|Максим Штамм]]
 
 
Файл: [[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>
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)