Курсовой проект: Колебания груза на пружине. — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Визуализация)
Строка 8: Строка 8:
 
==Визуализация==
 
==Визуализация==
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Olenchuk_Morozov/1.html |width=1100|height=800|border=0 }}
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Olenchuk_Morozov/1.html |width=1100|height=800|border=0 }}
 +
==Код программы==
 +
'''Текст программы на языке JavaScript:'''
 +
<div class="mw-collapsible-content">
 +
function main() {
 +
var ctx = canv.getContext("2d");
 +
var ctxE = ENERGY.getContext("2d");
 +
var ctxVX = vxg.getContext("2d");
 +
var w = canv.width;
 +
var h = canv.height;
 +
var button=document.getElementById("button");
 +
var paint=document.getElementById("button2");
 +
var stopbutton=document.getElementById("button3");
 +
var a=0;
 +
var m=0;
 +
var k=0;
 +
var s=0;
 +
var l=0;
 +
var j=0;
 +
var b=0;
 +
var i=0;
 +
var x=0;
 +
var y=0;
 +
var x1=0;
 +
var y1=0;
 +
var v=0;
 +
var x2=0;
 +
var y2=0;
 +
//var abs=0;
 +
var timerId=0;
 +
var Ek=0;
 +
var Ep=0;
 +
var E=0;
 +
var bl=1;
 +
var x0=0;
 +
var Vm=0;
 +
paint.onclick=function(){
 +
bl=1;
 +
paint.value="Refresh";
 +
button.value="Start";
 +
ctxE.clearRect(0,0,500,500);
 +
ctxVX.clearRect(0,0,500,500);
 +
ctxE.beginPath();
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(20,230);
 +
ctxE.lineTo(480,230);
 +
ctxE.lineTo(475,225);
 +
ctxE.moveTo(480,230);
 +
ctxE.lineTo(475,235);
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(25,25);
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(15,25);
 +
ctxE.stroke();
 +
ctxE.fillText("Energy",30,25);
 +
ctxE.fillText("Time",470,245);
 +
ctxVX.beginPath();
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(250,230);
 +
ctxVX.moveTo(20,125);
 +
ctxVX.lineTo(480,125);
 +
ctxVX.lineTo(475,120);
 +
ctxVX.moveTo(480,125);
 +
ctxVX.lineTo(475,130);
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(255,25);
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(245,25);
 +
ctxVX.stroke();
 +
ctxVX.fillText("V",255,25);
 +
ctxVX.fillText("x",470,140);
 +
if (x!=0) {clearInterval(timerId);}
 +
i=0;
 +
x=0;
 +
y=0;
 +
console.clear();
 +
ctx.clearRect(0,0,w,h);
 +
document.getElementById("velocity").value=0;
 +
document.getElementById("absolute").value=0;
 +
b=parseFloat(document.getElementById("res").value);
 +
l=parseFloat(document.getElementById("lng").value);
 +
s=parseFloat(document.getElementById("brt").value);
 +
m=parseFloat(document.getElementById("mass").value);
 +
k=parseFloat(document.getElementById("kfc").value);
 +
a=parseFloat(document.getElementById("amp").value);
 +
if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");}
 +
else{
 +
if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");}
 +
else{
 +
ctx.beginPath();
 +
ctx.arc(25+l,125,10,0,2*Math.PI);
 +
ctx.fill();
 +
ctx.moveTo(20,20);
 +
ctx.lineTo(980,20);
 +
ctx.moveTo(20,20);
 +
ctx.lineTo(20,230);
 +
ctx.moveTo(20,120);
 +
ctx.lineTo(25,125);
 +
ctx.lineTo(20,130);
 +
ctx.moveTo(25,125);
 +
ctx.lineTo(25+l,125);
 +
ctx.moveTo(25+s,20);
 +
ctx.lineTo(25+s,22,5);
 +
while (j<20){
 +
j=j+1;
 +
ctx.lineTo(25+Math.pow(-1,j)*5+s,20+5*j);
 +
}
 +
j=0;
 +
ctx.lineTo(25+s,122,5);
 +
ctx.lineTo(25+s,125);
 +
ctx.stroke();
 +
}
 +
}
 +
}
 +
 +
function start () {
 +
ctx.clearRect(0,0,1000,250);
 +
var w=Math.sqrt(3*k*s*s/(m*l*l));
 +
var beta=3*b/(2*m*l);
 +
var A=a*Math.exp(-i*beta);
 +
var x0=m*9.8*l/(k*s);
 +
x=Math.exp(-beta*i)*a*Math.sin(i*w);
 +
y=l*(1-Math.cos(Math.asin(x/l)));
 +
x1=a*Math.exp(-i*beta)*(-beta*Math.sin(w*i)+w*Math.cos(w*i));
 +
y1=x*x1/(l*Math.sqrt(l*l-x*x));
 +
v=Math.sqrt(x1*x1+y1*y1);
 +
x2=a*Math.exp(-i*beta)*((beta*beta-w*w)*Math.sin(w*i)-2*beta*w*Math.cos(w*i));
 +
y2=(x1*x1+x*x2+x*x1*x*l/Math.sqrt(l*l-x*x))/(l*l*(l*l-x*x));
 +
abs=Math.sqrt(x2*x2+y2*y2);
 +
Ek=m*v*v/2;
 +
Vm=Math.sqrt(k*A*A*s*s/(l*l*m)+2*9.8*A);
 +
Ep=m*(Vm*Vm-v*v)/2//-k*x0*x0*s*s/(2*l*l);
 +
E=Ep+Ek;
 +
ctxE.beginPath();
 +
ctxE.strokeStyle='rgba(255,0,0,1)';
 +
ctxE.arc(20+i*10,230-Ek/15,1,0,2*Math.PI);
 +
ctxE.stroke();
 +
ctxE.beginPath();
 +
ctxE.strokeStyle='rgba(0,0,255,1)';
 +
ctxE.arc(20+i*10,230-Ep/15,1,0,2*Math.PI);
 +
ctxE.stroke();
 +
ctxE.beginPath();
 +
ctxE.strokeStyle='rgba(0,255,0,1)';
 +
ctxE.arc(20+i*10,230-E/15,1,0,2*Math.PI);
 +
ctxE.stroke();
 +
ctxE.strokeStyle='rgba(0,0,0,1)';
 +
ctxVX.beginPath();
 +
ctxVX.arc(250+2*x,125-2*x1,1,0,2*Math.PI);
 +
ctxVX.fill();
 +
document.getElementById("velocity").value=Math.round(v*100)/100;
 +
document.getElementById("absolute").value=Math.round(abs*100)/100;
 +
i=i+0.02;
 +
console.log(i,x,x1);
 +
ctx.beginPath();
 +
 +
 +
// ctx.setLineDash([5, 3])
 +
// ctx.moveTo(25+s,20);
 +
// ctx.lineTo(25+s-(y*s/l),125+(x*s/l));//пружина
 +
//ctx.stroke();
 +
ctx.moveTo(25+s,20);
 +
ctx.lineTo(25+s-y*s/(21*l),22.5+x*s/(21*l));
 +
while (j<20){
 +
j=j+1;
 +
ctx.lineTo(25+Math.pow(-1,j)*5+s-j*y*s/(21*l),20+5*j+j*x*s/(21*l));
 +
}
 +
j=0;
 +
ctx.lineTo(25+s-20*y*s/(21*l),122.5+20*x*s/(21*l));
 +
ctx.lineTo(25+s-y*s/l,125+x*s/l);
 +
ctx.moveTo(20,20);
 +
ctx.lineTo(980,20);
 +
ctx.moveTo(20,20);
 +
ctx.lineTo(20,230);
 +
ctx.moveTo(20,120);
 +
ctx.lineTo(25,125);
 +
ctx.lineTo(20,130);
 +
ctx.moveTo(25,125);
 +
ctx.lineTo(25+l-y,125+x); //стержень
 +
ctx.stroke();
 +
ctx.beginPath();
 +
ctx.arc(25+l-y,125+x,10,0,2*Math.PI);//шар
 +
ctx.fill();
 +
 +
}
 +
button.onclick=function(){
 +
console.clear();
 +
b=parseFloat(document.getElementById("res").value);
 +
l=parseFloat(document.getElementById("lng").value);
 +
s=parseFloat(document.getElementById("brt").value);
 +
m=parseFloat(document.getElementById("mass").value);
 +
k=parseFloat(document.getElementById("kfc").value);
 +
a=parseFloat(document.getElementById("amp").value);
 +
if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");}
 +
else{
 +
if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");}
 +
else{
 +
if (bl=0) {
 +
ctxE.clearRect(0,0,500,500);
 +
ctxVX.clearRect(0,0,500,500);
 +
}
 +
ctxE.beginPath();
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(20,230);
 +
ctxE.lineTo(480,230);
 +
ctxE.lineTo(475,225);
 +
ctxE.moveTo(480,230);
 +
ctxE.lineTo(475,235);
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(25,25);
 +
ctxE.moveTo(20,20);
 +
ctxE.lineTo(15,25);
 +
ctxE.stroke();
 +
ctxE.fillText("Energy",30,25);
 +
ctxE.fillText("Time",470,245);
 +
ctxVX.beginPath();
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(250,230);
 +
ctxVX.moveTo(20,125);
 +
ctxVX.lineTo(480,125);
 +
ctxVX.lineTo(475,120);
 +
ctxVX.moveTo(480,125);
 +
ctxVX.lineTo(475,130);
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(255,25);
 +
ctxVX.moveTo(250,20);
 +
ctxVX.lineTo(245,25);
 +
ctxVX.stroke();
 +
ctxVX.fillText("V",255,25);
 +
ctxVX.fillText("x",470,140);
 +
timerId=setInterval(start,10);
 +
 +
stopbutton.onclick=function(){
 +
button.value="Resume";
 +
bl=0;
 +
clearInterval(timerId);
 +
}
 +
console.clear();
 +
}
 +
}
 +
}
 +
}
 +
</div>

Версия 00:12, 31 мая 2019

Задача

С помощью языка программирования JavaScript смоделировать колебания груза на пружине.

Схема маятника.

Описание

Моделирование пружинного маятника с изменяемыми входными данными.

Работу выполнили: Оленчук Павел и Морозов Даниил

Визуализация

Код программы

Текст программы на языке JavaScript:

function main() { var ctx = canv.getContext("2d"); var ctxE = ENERGY.getContext("2d"); var ctxVX = vxg.getContext("2d"); var w = canv.width; var h = canv.height; var button=document.getElementById("button"); var paint=document.getElementById("button2"); var stopbutton=document.getElementById("button3"); var a=0; var m=0; var k=0; var s=0; var l=0; var j=0; var b=0; var i=0; var x=0; var y=0; var x1=0; var y1=0; var v=0; var x2=0; var y2=0; //var abs=0; var timerId=0; var Ek=0; var Ep=0; var E=0; var bl=1; var x0=0; var Vm=0; paint.onclick=function(){ bl=1; paint.value="Refresh"; button.value="Start"; ctxE.clearRect(0,0,500,500); ctxVX.clearRect(0,0,500,500); ctxE.beginPath(); ctxE.moveTo(20,20); ctxE.lineTo(20,230); ctxE.lineTo(480,230); ctxE.lineTo(475,225); ctxE.moveTo(480,230); ctxE.lineTo(475,235); ctxE.moveTo(20,20); ctxE.lineTo(25,25); ctxE.moveTo(20,20); ctxE.lineTo(15,25); ctxE.stroke(); ctxE.fillText("Energy",30,25); ctxE.fillText("Time",470,245); ctxVX.beginPath(); ctxVX.moveTo(250,20); ctxVX.lineTo(250,230); ctxVX.moveTo(20,125); ctxVX.lineTo(480,125); ctxVX.lineTo(475,120); ctxVX.moveTo(480,125); ctxVX.lineTo(475,130); ctxVX.moveTo(250,20); ctxVX.lineTo(255,25); ctxVX.moveTo(250,20); ctxVX.lineTo(245,25); ctxVX.stroke(); ctxVX.fillText("V",255,25); ctxVX.fillText("x",470,140); if (x!=0) {clearInterval(timerId);} i=0; x=0; y=0; console.clear(); ctx.clearRect(0,0,w,h); document.getElementById("velocity").value=0; document.getElementById("absolute").value=0; b=parseFloat(document.getElementById("res").value); l=parseFloat(document.getElementById("lng").value); s=parseFloat(document.getElementById("brt").value); m=parseFloat(document.getElementById("mass").value); k=parseFloat(document.getElementById("kfc").value); a=parseFloat(document.getElementById("amp").value); if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");} else{ if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");} else{ ctx.beginPath(); ctx.arc(25+l,125,10,0,2*Math.PI); ctx.fill(); ctx.moveTo(20,20); ctx.lineTo(980,20); ctx.moveTo(20,20); ctx.lineTo(20,230); ctx.moveTo(20,120); ctx.lineTo(25,125); ctx.lineTo(20,130); ctx.moveTo(25,125); ctx.lineTo(25+l,125); ctx.moveTo(25+s,20); ctx.lineTo(25+s,22,5); while (j<20){ j=j+1; ctx.lineTo(25+Math.pow(-1,j)*5+s,20+5*j); } j=0; ctx.lineTo(25+s,122,5); ctx.lineTo(25+s,125); ctx.stroke(); } } }

function start () { ctx.clearRect(0,0,1000,250); var w=Math.sqrt(3*k*s*s/(m*l*l)); var beta=3*b/(2*m*l); var A=a*Math.exp(-i*beta); var x0=m*9.8*l/(k*s); x=Math.exp(-beta*i)*a*Math.sin(i*w); y=l*(1-Math.cos(Math.asin(x/l))); x1=a*Math.exp(-i*beta)*(-beta*Math.sin(w*i)+w*Math.cos(w*i)); y1=x*x1/(l*Math.sqrt(l*l-x*x)); v=Math.sqrt(x1*x1+y1*y1); x2=a*Math.exp(-i*beta)*((beta*beta-w*w)*Math.sin(w*i)-2*beta*w*Math.cos(w*i)); y2=(x1*x1+x*x2+x*x1*x*l/Math.sqrt(l*l-x*x))/(l*l*(l*l-x*x)); abs=Math.sqrt(x2*x2+y2*y2); Ek=m*v*v/2; Vm=Math.sqrt(k*A*A*s*s/(l*l*m)+2*9.8*A); Ep=m*(Vm*Vm-v*v)/2//-k*x0*x0*s*s/(2*l*l); E=Ep+Ek; ctxE.beginPath(); ctxE.strokeStyle='rgba(255,0,0,1)'; ctxE.arc(20+i*10,230-Ek/15,1,0,2*Math.PI); ctxE.stroke(); ctxE.beginPath(); ctxE.strokeStyle='rgba(0,0,255,1)'; ctxE.arc(20+i*10,230-Ep/15,1,0,2*Math.PI); ctxE.stroke(); ctxE.beginPath(); ctxE.strokeStyle='rgba(0,255,0,1)'; ctxE.arc(20+i*10,230-E/15,1,0,2*Math.PI); ctxE.stroke(); ctxE.strokeStyle='rgba(0,0,0,1)'; ctxVX.beginPath(); ctxVX.arc(250+2*x,125-2*x1,1,0,2*Math.PI); ctxVX.fill(); document.getElementById("velocity").value=Math.round(v*100)/100; document.getElementById("absolute").value=Math.round(abs*100)/100; i=i+0.02; console.log(i,x,x1); ctx.beginPath();


// ctx.setLineDash([5, 3]) // ctx.moveTo(25+s,20); // ctx.lineTo(25+s-(y*s/l),125+(x*s/l));//пружина //ctx.stroke(); ctx.moveTo(25+s,20); ctx.lineTo(25+s-y*s/(21*l),22.5+x*s/(21*l)); while (j<20){ j=j+1; ctx.lineTo(25+Math.pow(-1,j)*5+s-j*y*s/(21*l),20+5*j+j*x*s/(21*l)); } j=0; ctx.lineTo(25+s-20*y*s/(21*l),122.5+20*x*s/(21*l)); ctx.lineTo(25+s-y*s/l,125+x*s/l); ctx.moveTo(20,20); ctx.lineTo(980,20); ctx.moveTo(20,20); ctx.lineTo(20,230); ctx.moveTo(20,120); ctx.lineTo(25,125); ctx.lineTo(20,130); ctx.moveTo(25,125); ctx.lineTo(25+l-y,125+x); //стержень ctx.stroke(); ctx.beginPath(); ctx.arc(25+l-y,125+x,10,0,2*Math.PI);//шар ctx.fill();

} button.onclick=function(){ console.clear(); b=parseFloat(document.getElementById("res").value); l=parseFloat(document.getElementById("lng").value); s=parseFloat(document.getElementById("brt").value); m=parseFloat(document.getElementById("mass").value); k=parseFloat(document.getElementById("kfc").value); a=parseFloat(document.getElementById("amp").value); if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");} else{ if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");} else{ if (bl=0) { ctxE.clearRect(0,0,500,500); ctxVX.clearRect(0,0,500,500); } ctxE.beginPath(); ctxE.moveTo(20,20); ctxE.lineTo(20,230); ctxE.lineTo(480,230); ctxE.lineTo(475,225); ctxE.moveTo(480,230); ctxE.lineTo(475,235); ctxE.moveTo(20,20); ctxE.lineTo(25,25); ctxE.moveTo(20,20); ctxE.lineTo(15,25); ctxE.stroke(); ctxE.fillText("Energy",30,25); ctxE.fillText("Time",470,245); ctxVX.beginPath(); ctxVX.moveTo(250,20); ctxVX.lineTo(250,230); ctxVX.moveTo(20,125); ctxVX.lineTo(480,125); ctxVX.lineTo(475,120); ctxVX.moveTo(480,125); ctxVX.lineTo(475,130); ctxVX.moveTo(250,20); ctxVX.lineTo(255,25); ctxVX.moveTo(250,20); ctxVX.lineTo(245,25); ctxVX.stroke(); ctxVX.fillText("V",255,25); ctxVX.fillText("x",470,140); timerId=setInterval(start,10);

stopbutton.onclick=function(){ button.value="Resume"; bl=0; clearInterval(timerId); } console.clear(); } } } }