Текущая версия |
Ваш текст |
Строка 6: |
Строка 6: |
| | | |
| '''Семестр:''' осень 2022 | | '''Семестр:''' осень 2022 |
− |
| |
− |
| |
− | ==Постановка задачи==
| |
− | Данная работа посвящена визуализации статического провисания и падения цепочки.
| |
− | Цепочка состоит из частиц, соединенных упругими связями. Необходимо показать, как цепочка придет в положение равновесия под воздействем силы тяжести, и смоделировать движение цепочки при отпускании одного края, а также исследовать зависимость ускорения отпущенной крайней частицы от времени.
| |
− |
| |
− | ==Математическая модель==
| |
− |
| |
− | <math>
| |
− | m\underline{\ddot{r}}_i(t)=\underline{F}_{R_1}+\underline{F}_{R_2} + \underline{F}_{g}\\
| |
− | \underline{r}_i(0)=\underline{r}_i^0,~\underline{v}_i(0)=0~~~i=1,\ldots,n
| |
− | </math>
| |
− |
| |
− |
| |
− | где
| |
− | <math>
| |
− | \underline{F}_{R_1}, \underline{F}_{R_2}\\
| |
− | </math> - силы упругости действующие на <math>i</math>-ую частицу со стороны <math>i-1</math> и <math>i+1</math> соответственно;
| |
− |
| |
− | <math>
| |
− | \underline{F}_{g} = -mg\underline{k} \\
| |
− | </math> - сила тяжести;
| |
− |
| |
− | Сила упругости, возникающая в пружине соединяющей частицу 1 и 2, вычисляется по следующей формуле:
| |
− |
| |
− | <math>
| |
− | \underline{F}_{R}= c(||\underline{r}_2-\underline{r}_1|| - l_0)\frac{(\underline{r}_2-\underline{r}_1)}{||\underline{r}_2-\underline{r}_1||}
| |
− | </math>, где <math>c</math> - коэффициент жесткости пружины.
| |
− |
| |
− | Обезразмеренное уравнение будет иметь вид:
| |
− |
| |
− | <math>
| |
− | \underline{\ddot{r}}_i(t)= \frac{cl_0}{mg}(||\underline{r}_{i+1}-\underline{r}_i|| - 1)\frac{(\underline{r}_{i+1}-\underline{r}_i)}{||\underline{r}_{i+1}-\underline{r}_i||} + \frac{cl_0}{mg}(||\underline{r}_{i-1}-\underline{r}_i|| - 1)\frac{(\underline{r}_{i-1}-\underline{r}_i)}{||\underline{r}_{i-1}-\underline{r}_i||} - \underline{k}\\
| |
− |
| |
− | </math>
| |
− |
| |
− | Интегрирование по времени производится явной схемой интегрирования методом Верле.
| |
− |
| |
− | == Визуализация ==
| |
− | На рис.1 представлен интерфейс программы.
| |
− | *[[Медиа: интерфейс.png]]
| |
− | На рис.2 представлена программа в процессе работы.
| |
− | *[[Медиа: inwork.png]]
| |
− |
| |
− | ==Код программы==
| |
− | Код программы:
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | '''JS:''' <div class="mw-collapsible-content">
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | <br />
| |
− | window.addEventListener('load',main,false)
| |
− | function main(){
| |
− |
| |
− | Num = document.getElementById("num").value;
| |
− | my = document.getElementById("my");
| |
− | my.innerHTML =Num + " numbers";
| |
− | var animation = 0;
| |
− | var za = 0;
| |
− | var padenie = 0;
| |
− | var ctx2 = canvasex2.getContext('2d');
| |
− | var cplot = canvasex1.getContext('2d');
| |
− | var width = canvasex1.width;
| |
− | var height = canvasex1.height;
| |
− |
| |
− | var t_max = 0;
| |
− | var q = 0;
| |
− | var W=[]; // массив
| |
− | var V = []; // массив скоростей
| |
− | var c=0;
| |
− | una.onclick= function una(){animation = 0; }
| |
− |
| |
− | start.onclick= function start(){
| |
− |
| |
− | // Изменяемые параметры
| |
− | var b = document.getElementById("b").value; // вязкость
| |
− | var C = document.getElementById("D").value; // жесткость пружины
| |
− | var N = document.getElementById("num").value; // количество элементов в цепочке
| |
− | var m= document.getElementById("mass").value; // масса цепочки
| |
− |
| |
− | animation=1;
| |
− | za = za + 1;
| |
− | // Неизменяемые параметры
| |
− | //var N=41; var Mass = 50; var C = 50000; b=0.3;
| |
− | var L0 = 10; //равновесное растояние
| |
− | var Lenght = (N-1)*L0;
| |
− | //var m = Mass/N;
| |
− | var g = 9.81;
| |
− | var rad = 5;
| |
− | var eps = 0.9;
| |
− | var voln = 0.1;
| |
− | var dt=voln/Math.pow(C/m, 1/2);
| |
− |
| |
− |
| |
− | function Particle(x,y,vx,vy,wx,wy,vxpred,vypred){
| |
− | var that=this;
| |
− | this.x=x;
| |
− | this.y=y;
| |
− | this.vx=vx;
| |
− | this.vy=vy;
| |
− | this.wx=wx;
| |
− | this.wy=wy;
| |
− | this.vxpred=vxpred;
| |
− | this.vypred=vypred;
| |
− |
| |
− | this.info = function (){
| |
− | console.log('Position: ('+that.x+','+that.y+')\nVelocity: ('+that.vx+','+that.vy+')\nAcceleration_y: ('+that.wy+')')
| |
− | }
| |
− |
| |
− | this.move=function(){
| |
− |
| |
− | }
| |
− |
| |
− | this.draw = function(){
| |
− | ctx2.beginPath();
| |
− | ctx2.arc(that.x,that.y,rad,0,2*Math.PI);
| |
− | ctx2.fillStyle = '#9999FF';
| |
− | ctx2.fill();
| |
− | }
| |
− | }
| |
− |
| |
− |
| |
− | if (za==1){ // создание частиц
| |
− | var particles = [];
| |
− |
| |
− | if (N%2==0){
| |
− | for(var i=0;i<N;i++){
| |
− | var fi= Math.PI/3;
| |
− | var dy=0;
| |
− | if (i<N/2)
| |
− | dy = i*(L0-1)*Math.sin(fi);
| |
− | else
| |
− | dy = (N-i-1)*(L0-1)*Math.sin(fi);
| |
− | particles.push(
| |
− | new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy, 0, 0, 0, 0, 0, 0)
| |
− | );
| |
− | particles[i].draw();
| |
− | }
| |
− | }
| |
− |
| |
− | if (N%2!=0){
| |
− | for(var i=0;i<N;i++){
| |
− | var fi= Math.PI/4;
| |
− | if (i<(N+1)/2)
| |
− | var dy = i*(L0-1)*Math.sin(fi);
| |
− | else
| |
− | dy = (N-i-1)*(L0-1)*Math.sin(fi);
| |
− | particles.push(
| |
− | new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy, 0, 0, 0, 0, 0, 0)
| |
− | );
| |
− | particles[i].draw();
| |
− |
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | function phys(){
| |
− | t_max+=dt;
| |
− | var Vmax=0;
| |
− | for(var i=0;i<N;i++){
| |
− | //particles[i].move();
| |
− |
| |
− | if (i!=0 && i!=N-1){
| |
− |
| |
− | var rxl = particles[i].x-particles[i-1].x;
| |
− | var ryl = particles[i].y-particles[i-1].y;
| |
− | var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
| |
− |
| |
− |
| |
− | var rxr = particles[i].x-particles[i+1].x;
| |
− | var ryr = particles[i].y-particles[i+1].y;
| |
− | var rr = Math.sqrt(Math.pow(rxr,2)+Math.pow(ryr,2));
| |
− |
| |
− | var Fx = -C*(rl-L0)*rxl/rl/L0 - C*(rr-L0)*rxr/rr/L0;
| |
− | var Fy = -C*(rl-L0)*ryl/rl/L0 - C*(rr-L0)*ryr/rr/L0;
| |
− |
| |
− | particles[i].wx = Fx/m - b* particles[i].vx/m;
| |
− | particles[i].wy = Fy/m + g - b* particles[i].vy/m;
| |
− | }
| |
− |
| |
− | else if(i==N-1){
| |
− | if (padenie == 0) W.push (0);
| |
− | if (padenie == 1){
| |
− | var rxl = particles[i].x-particles[i-1].x;
| |
− | var ryl = particles[i].y-particles[i-1].y;
| |
− | var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
| |
− |
| |
− | var Fx = -C*(rl-L0)*rxl/rl/L0 ;
| |
− | var Fy = -C*(rl-L0)*ryl/rl/L0 ;
| |
− |
| |
− | particles[i].wx = Fx/m- b* particles[i].vx/m;
| |
− | particles[i].wy = Fy/m + g- b* particles[i].vy/m;
| |
− |
| |
− | W.push (Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)));
| |
− | console.log(Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)))
| |
− | }
| |
− | }
| |
− | }
| |
− | // явная схема интегрирования, Верле
| |
− | for (var i=0;i<N;i++){
| |
− | particles[i].vx = particles[i].vx + particles[i].wx*dt;
| |
− | particles[i].vy = particles[i].vy + particles[i].wy*dt;
| |
− | particles[i].x = particles[i].x + particles[i].vx*dt;
| |
− | particles[i].y = particles[i].y + particles[i].vy*dt;
| |
− | var v = Math.sqrt(Math.pow(particles[i].vx,2)+Math.pow(particles[i].vy,2));
| |
− | if (v>Vmax) Vmax=v;
| |
− | }
| |
− | if (Vmax < eps){ padenie = 1; b=0.01}
| |
− | //console.log(Vmax)
| |
− | }
| |
− |
| |
− |
| |
− | function draw(){
| |
− | ctx2.clearRect(0,0,800,800);
| |
− | for(var i=0;i<N;i++){
| |
− | particles[i].draw();
| |
− | }
| |
− |
| |
− |
| |
− | cplot.clearRect(0,0,width,height);
| |
− |
| |
− | var W_scale =height/250;
| |
− | var t_scale= width/t_max;
| |
− |
| |
− | cplot.beginPath();
| |
− | for (var i =0; i<W.length-1; i++){
| |
− | cplot.moveTo(i*t_scale,height-W[i]*(W_scale)-50);
| |
− | cplot.lineTo((i+1)*t_scale, height-W[i+1]*(W_scale)-50);
| |
− |
| |
− | }
| |
− | cplot.stroke();
| |
− | }
| |
− |
| |
− | function control(){
| |
− | if (animation!=0){
| |
− | phys();
| |
− | draw();
| |
− | }
| |
− | }
| |
− | setInterval(control,1000*dt);
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | </syntaxhighlight>
| |
− | </div>
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | '''HTML:''' <div class="mw-collapsible-content">
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | <!DOCTYPE html>
| |
− | <html>
| |
− | <head>
| |
− | <title>Class</title>
| |
− | <script src='cepochka.js'></script>
| |
− | <style>
| |
− | input{
| |
− | width:100px;
| |
− | height:30px;
| |
− | }
| |
− | button{
| |
− | width:100px;
| |
− | height:30px;
| |
− | }
| |
− | div table{
| |
− | margin-left:auto;
| |
− | margin-right:auto;}
| |
− | table td{
| |
− | text-align:center;
| |
− | width:180px;
| |
− | height:30px;
| |
− | }
| |
− | </style>
| |
− | </head>
| |
− | <body>
| |
− | <center>
| |
− | <canvas id='canvasex2' width=800 height=800 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
| |
− | <canvas id='canvasex1' width=800 height=300 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
| |
− |
| |
− | <table>
| |
− | <tr>
| |
− | <td><input type="button" id="start" value="start" > </td>
| |
− | <td> <input type="button" id="una" value="stop" width=40 height=20></td>
| |
− | <td> <button onclick='window.location.reload(true)' style ='width=100 height=20'>clear</button></td>
| |
− | <table>
| |
− | <tr><th>
| |
− | <input type="range" min="11" max="41" id="num"
| |
− | oninput="main()" value="0"></th>
| |
− | <th><div id="my">0</div></th></tr>
| |
− | <tr><th>
| |
− | <input type="number" id="b" name="b" value="0.1"
| |
− | min="0" max="0.1" step="0.01" style='border: 1px dashed #000000'></th>
| |
− | <th> <div> <h3><i> viscosity</i></div></th></tr>
| |
− | <tr><th>
| |
− | <input type="number" id="D" name="D" value="50000"
| |
− | min="1000" max="50000" step="5000" style='border: 1px dashed #000000'></th>
| |
− | <th> <div> <h3><i> spring rate</i></div></th></tr>
| |
− | <tr><th>
| |
− | <input type="number" id="mass" name="mass" value="1"
| |
− | min="0" max="2" step="0.5" style='border: 1px dashed #000000'></th>
| |
− | <th> <div> <h3><i> mass</i></div></th></tr>
| |
− | </center>
| |
− | </body>
| |
− | </html>
| |
− | </syntaxhighlight>
| |
− | </div>
| |