Редактирование: Интерактивная модель простейшей автоколебательной системы с пружиной
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
[[Виртуальная лаборатория]] > [[Простейшая колебательная система с двумя степенями свободы]] <HR> | [[Виртуальная лаборатория]] > [[Простейшая колебательная система с двумя степенями свободы]] <HR> | ||
− | Рассматривается простейшая колебательная система тело-пружина | + | Рассматривается простейшая колебательная система тело-пружина. Пружина крепится на неподвижном стержне, заделанном в центре движущейся круглой пластины. |
− | + | ||
+ | Уравнения движения системы будут выглядеть так: | ||
::<math> | ::<math> | ||
− | + | m \ddot{z} + F'(V) \dot{z} + c z = 0 | |
− | + | </math> | |
− | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/BondarevS/1_1.html |width=860 |height=1800 |border=0 }} | |
− | |||
− | m \ddot{z} + F'(V) \dot{z} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Скачать [[Медиа:IMoS-OSWaS.rar|IMoS-OSWaS.rar]]. | |
− | Скачать [[Медиа: | ||
<div class="mw-collapsible mw-collapsed" style="width:100%" > | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
'''Текст программы на языке JavaScript (разработчик [[Бондарев Сергей]]):''' <div class="mw-collapsible-content"> | '''Текст программы на языке JavaScript (разработчик [[Бондарев Сергей]]):''' <div class="mw-collapsible-content"> | ||
− | Файл '''" | + | Файл '''"2_1.js"''' |
<syntaxhighlight lang="javascript" line start="1" enclose="div"> | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
Строка 41: | Строка 27: | ||
const m0 = 1; // масштаб массы | const m0 = 1; // масштаб массы | ||
const T0 = 1; // масштаб времени (период колебаний исходной системы) | const T0 = 1; // масштаб времени (период колебаний исходной системы) | ||
− | const a0 = 1; | + | const a0 = 1; // масштаб расстояния (диаметр шара) |
− | |||
− | |||
const g0 = a0 / T0 / T0; // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0) | const g0 = a0 / T0 / T0; // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0) | ||
Строка 49: | Строка 33: | ||
const C0 = m0 * k0 * k0; // масштаб жесткости | const C0 = m0 * k0 * k0; // масштаб жесткости | ||
var scale1 = 0.2; | var scale1 = 0.2; | ||
− | + | var scale2 = 0.2; | |
+ | |||
+ | |||
// *** Задание физических параметров *** | // *** Задание физических параметров *** | ||
var xShift= 0; | var xShift= 0; | ||
Строка 55: | Строка 41: | ||
const Nx = 15; // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна) | const Nx = 15; // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна) | ||
const l1 = 15*a0; // длина первой пружины | const l1 = 15*a0; // длина первой пружины | ||
− | + | const l2 = 5*a0; // длина второй пружины | |
− | + | var m1 = 5 * m0; // масса первого шара | |
− | var | + | var m2 = 10 * m0; // масса второго шара |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
const Cwall = 10 * C0; // жесткость стен | const Cwall = 10 * C0; // жесткость стен | ||
const r = 1 * a0; // радиус частицы в расчетных координатах | const r = 1 * a0; // радиус частицы в расчетных координатах | ||
− | var | + | var c1 = 100; // "жесткость" пружинки 1 |
− | + | var c2 = 100; // "жесткость" пружинки 1 | |
var vx0 = 0 * a0/T0; //начальная скорость | var vx0 = 0 * a0/T0; //начальная скорость | ||
var delt = 0*a0; //начальное смещение | var delt = 0*a0; //начальное смещение | ||
Строка 74: | Строка 53: | ||
var Vmax = 0; var Mmin = 0; var Vprov = 0; | var Vmax = 0; var Mmin = 0; var Vprov = 0; | ||
− | + | ||
− | |||
//*** Передача значений слайдерам и текстовым окнам*** | //*** Передача значений слайдерам и текстовым окнам*** | ||
Text_delt.value = delt; | Text_delt.value = delt; | ||
− | + | Text_m1.value = m1; | |
− | + | //Text_m2.value = m2; | |
− | + | Text_c1.value = c1; | |
− | + | //Text_c2.value = c2; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Slider_delt.min = -1; | |
− | + | Slider_delt.max = 1; | |
− | |||
− | |||
− | |||
− | |||
− | |||
Slider_delt.step = 0.1; | Slider_delt.step = 0.1; | ||
Slider_delt.value = Text_delt.value; | Slider_delt.value = Text_delt.value; | ||
− | + | Slider_m1.min = 0.1; | |
− | + | Slider_m1.max = 10; | |
− | + | Slider_m1.step = 0.1; | |
− | + | Slider_m1.value = Text_m1.value; | |
− | + | //Slider_m2.min = 0.1; | |
− | + | //Slider_m2.max = 10; | |
− | + | //Slider_m2.step = 0.1; | |
− | + | // Slider_m2.value = Text_m2.value; | |
+ | |||
+ | //Slider_c2.min = 1; | ||
+ | // Slider_c2.max = 200; | ||
+ | // Slider_c2.step = 1; | ||
+ | //Slider_c2.value = Text_c2.value; | ||
+ | Slider_c1.min = 1; | ||
+ | Slider_c1.max = 200; | ||
+ | Slider_c1.step = 1; | ||
+ | Slider_c1.value = Text_c1.value; | ||
Slider_delt.focus(); | Slider_delt.focus(); | ||
Строка 114: | Строка 90: | ||
const fps = 550; // frames per second - число кадров в секунду (качеcтво отображения) | const fps = 550; // frames per second - число кадров в секунду (качеcтво отображения) | ||
const spf = 260; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | const spf = 260; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | ||
− | const dt = 0. | + | const dt = 0.01 * T0 / fps; // шаг интегрирования |
// Задание констант для рисования | // Задание констант для рисования | ||
Строка 135: | Строка 111: | ||
b.x_ = b.x; b.y_ = b.y; | b.x_ = b.x; b.y_ = b.y; | ||
b.fx = 0; b.vx = 0; // начальная скорость | b.fx = 0; b.vx = 0; // начальная скорость | ||
− | + | // Добавление шара 2 | |
+ | var c = []; | ||
+ | c.x = l2 + l1; c.y = h / 2; // расчетные координаты шара | ||
+ | c.x_ = c.x; c.y_ = c.y; | ||
+ | c.fx = 0; c.vx = 0; // начальная скорость | ||
+ | |||
// центр рамки | // центр рамки | ||
Строка 174: | Строка 155: | ||
} | } | ||
} | } | ||
− | |||
// функция запускается при отпускании клавиши мыши | // функция запускается при отпускании клавиши мыши | ||
Строка 191: | Строка 171: | ||
b.x = (m.x + xShift)/scale; | b.x = (m.x + xShift)/scale; | ||
delt = b.x - l1; | delt = b.x - l1; | ||
− | b.vx = 0; | + | b.vx = 0; c.vx = 0; |
− | + | console.log(b.x); | |
− | |||
Text_delt.value = delt; | Text_delt.value = delt; | ||
Slider_delt.value = Text_delt.value; | Slider_delt.value = Text_delt.value; | ||
Строка 224: | Строка 203: | ||
delt = Number(input); //записываем значение начального смещения | delt = Number(input); //записываем значение начального смещения | ||
time = 1; | time = 1; | ||
− | b.x = l1 + delt; //изменение начальных координат шаров | + | b.x = l1 + delt; c.x = l1+l2; //изменение начальных координат шаров |
b.x_ = b.x; | b.x_ = b.x; | ||
− | b.vx = 0; | + | b.vx = 0; c.vx = 0; //задание начальных скоростей шаров |
− | |||
Text_delt.value = delt; | Text_delt.value = delt; | ||
Slider_delt.value = Text_delt.value; | Slider_delt.value = Text_delt.value; | ||
Строка 236: | Строка 214: | ||
} | } | ||
− | this. | + | this.set_m1 = function(input) |
{ | { | ||
− | + | m1 = Number(input); | |
time = 1; | time = 1; | ||
context.clearRect(0, 0, w * scale, h* scale); | context.clearRect(0, 0, w * scale, h* scale); | ||
Строка 245: | Строка 223: | ||
} | } | ||
− | this. | + | this.set_c1 = function(input) |
{ | { | ||
− | + | c1 = Number(input); | |
time = 1; | time = 1; | ||
context.clearRect(0, 0, w * scale, h* scale); | context.clearRect(0, 0, w * scale, h* scale); | ||
Строка 255: | Строка 233: | ||
} | } | ||
− | this. | + | this.set_m2 = function(input) |
{ | { | ||
− | + | m2 = Number(input); | |
time = 1; | time = 1; | ||
− | + | context.clearRect(0, 0, w * scale, h* scale); | |
context_gr.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | context_gr.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | ||
− | context_gr2.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | + | context_gr2.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); |
} | } | ||
− | this. | + | this.set_c2 = function(input) |
− | { | + | {; |
− | + | c2 = Number(input); | |
time = 1; | time = 1; | ||
context.clearRect(0, 0, w * scale, h* scale); | context.clearRect(0, 0, w * scale, h* scale); | ||
context_gr.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | context_gr.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | ||
− | context_gr2.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); | + | context_gr2.clearRect(0, 0, w1 * scale_gr, h1 * scale_gr); |
} | } | ||
− | + | ||
/*this.set_scale1 = function(input) | /*this.set_scale1 = function(input) | ||
{ | { | ||
Строка 293: | Строка 271: | ||
context_gr.clearRect(0, 0, w * scale, h * scale); | context_gr.clearRect(0, 0, w * scale, h * scale); | ||
context_gr2.clearRect(0, 0, w * scale, h * scale); | context_gr2.clearRect(0, 0, w * scale, h * scale); | ||
− | }*/ | + | }*/ |
+ | |||
// Функция, делающая spf шагов интегрирования | // Функция, делающая spf шагов интегрирования | ||
function physics() | function physics() | ||
{ | { | ||
− | + | b.x_ = b.x; b.vx_= b.vx; //записываем старые координаты и скорости | |
− | + | c.x_ = c.x; c.vx_= c.vx; | |
E_ = E; | E_ = E; | ||
+ | |||
for (var s = 1; s <= spf; s++) | for (var s = 1; s <= spf; s++) | ||
{ | { | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | b.vx += (c2*(-b.x + c.x - l2) - c1*(b.x - l1))/m1*dt; //расчет скорости первого шара | |
− | + | c.vx += -c2*(c.x - b.x - l2)/m2*dt; //расчет скорости второго шара | |
− | b. | + | b.x += b.vx*dt; //расчет координаты первого шара |
− | + | c.x += c.vx*dt; //расчет координаты второго шара | |
− | b. | + | E = 0.5*(m1*b.vx*b.vx + m2*c.vx*c.vx)+0.5*c2*(c.x - b.x -l2)*(c.x - b.x -l2)+0.5*c1*(b.x-l1)*(b.x - l1); //рачсет энергии системы |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
//Vprov = Math.max(b.vx, c.vx); | //Vprov = Math.max(b.vx, c.vx); | ||
//if ((Vprov) > Vmax) Vmax = b.vx; | //if ((Vprov) > Vmax) Vmax = b.vx; | ||
− | + | } | |
time = time + 1; | time = time + 1; | ||
Строка 351: | Строка 308: | ||
context.moveTo(b.x*scale, b.y*scale); | context.moveTo(b.x*scale, b.y*scale); | ||
context.lineTo(wall1.x*scale, wall1.y*scale); | context.lineTo(wall1.x*scale, wall1.y*scale); | ||
+ | // линия, соединяющая первую частицу со второй | ||
+ | /* context.moveTo(b.x*scale, b.y*scale); | ||
+ | context.lineTo(c.x*scale, c.y*scale); */ | ||
// стенка | // стенка | ||
context.moveTo(wall1.x*scale, (wall1.y + a0)*scale ); | context.moveTo(wall1.x*scale, (wall1.y + a0)*scale ); | ||
Строка 357: | Строка 317: | ||
context.stroke(); | context.stroke(); | ||
+ | // частица вторая | ||
+ | /* context.fillStyle = "red"; | ||
+ | context.beginPath(); | ||
+ | context.arc(c.x * scale, c.y * scale, 0.5*r * scale, 0, 2*Math.PI, false); | ||
+ | context.fill(); */ | ||
//частица первая | //частица первая | ||
context.fillStyle = 'blue'; | context.fillStyle = 'blue'; | ||
Строка 371: | Строка 336: | ||
{ | { | ||
scale2 = h /5* delt; | scale2 = h /5* delt; | ||
− | // | + | //Graph1(c, 'red'); //график для второго шара |
− | + | Graph(b, 'blue'); //график для первого шара | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | Graph(b, ' | ||
− | |||
GraphAxex('black'); //оси | GraphAxex('black'); //оси | ||
− | |||
− | |||
} | } | ||
Строка 391: | Строка 347: | ||
function Graph(b, color) | function Graph(b, color) | ||
{ | { | ||
− | + | ||
context_gr.strokeStyle = color; | context_gr.strokeStyle = color; | ||
context_gr.beginPath(); | context_gr.beginPath(); | ||
Строка 403: | Строка 359: | ||
function GraphAxex(color) | function GraphAxex(color) | ||
{ | { | ||
− | |||
context_gr.strokeStyle = color; | context_gr.strokeStyle = color; | ||
context_gr.beginPath(); | context_gr.beginPath(); | ||
Строка 419: | Строка 374: | ||
function Graph1(b, color) | function Graph1(b, color) | ||
{ | { | ||
− | + | ||
context_gr.strokeStyle = color; | context_gr.strokeStyle = color; | ||
context_gr.beginPath(); | context_gr.beginPath(); | ||
− | context_gr.moveTo(time*scale2/3, (b.x-l1)*scale*2*scale2 + scale*h1/2); | + | context_gr.moveTo(time*scale2/3, (b.x-l1-l2)*scale*2*scale2 + scale*h1/2); |
− | context_gr.lineTo( (time+1)*scale2/3, (b.x_- l1)*scale*2*scale2 + scale*h1/2); | + | context_gr.lineTo( (time+1)*scale2/3, (b.x_- l1-l2)*scale*2*scale2 + scale*h1/2); |
context_gr.stroke(); | context_gr.stroke(); | ||
context_gr.closePath(); | context_gr.closePath(); | ||
Строка 432: | Строка 387: | ||
function draw_gr2() // Определение функции, рисующей второй график | function draw_gr2() // Определение функции, рисующей второй график | ||
{ | { | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | var Mmax= Math.max(m1, m2); | |
− | + | scale1 = 6* (h1*Mmax)/( (c1+c2)*delt*delt); | |
− | + | GraphVel(b, 'blue'); //график для первого шара | |
− | var | ||
− | |||
− | GraphVel(b, ' | ||
//GraphVel2(c, 'red'); //график для второго шара | //GraphVel2(c, 'red'); //график для второго шара | ||
GraphAxex2('black'); //оси | GraphAxex2('black'); //оси | ||
− | } | + | } |
− | |||
− | |||
function GraphVel(b, color) | function GraphVel(b, color) | ||
{ | { | ||
− | + | ||
context_gr2.strokeStyle = color; | context_gr2.strokeStyle = color; | ||
Строка 477: | Строка 416: | ||
function GraphVel2(b, color) | function GraphVel2(b, color) | ||
{ | { | ||
− | + | ||
context_gr2.strokeStyle = color; | context_gr2.strokeStyle = color; | ||
context_gr2.beginPath(); | context_gr2.beginPath(); | ||
− | context_gr2.moveTo((b.x-l1)*2* | + | context_gr2.moveTo((b.x-l1-l2)*2*scale1 + scale*w1/2, b.vx*scale1 + scale*h1/2 ); |
− | context_gr2.lineTo((b.x_- l1)*2* | + | context_gr2.lineTo((b.x_- l1-l2)*2*scale1 + scale*w1/2, b.vx_*scale1 + scale*h1/2); |
+ | |||
context_gr2.closePath(); | context_gr2.closePath(); | ||
context_gr2.stroke(); | context_gr2.stroke(); | ||
− | + | ||
− | + | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function GraphAxex2(color) | function GraphAxex2(color) | ||
{ | { | ||
− | |||
context_gr2.strokeStyle = color; | context_gr2.strokeStyle = color; | ||
context_gr2.beginPath(); | context_gr2.beginPath(); | ||
Строка 530: | Строка 450: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Файл '''" | + | Файл '''"1_1.html"''' |
<syntaxhighlight lang="html5" line start="1" enclose="div"> | <syntaxhighlight lang="html5" line start="1" enclose="div"> | ||
− | + | <!DOCTYPE html> | |
<html> | <html> | ||
<head> | <head> | ||
<title> 2 </title> | <title> 2 </title> | ||
− | <script src=" | + | <script src="2_1.js"></script> |
</head> | </head> | ||
<body> | <body> | ||
Строка 544: | Строка 464: | ||
<div> | <div> | ||
Координаты от времени: | Координаты от времени: | ||
− | <font color="#0000FF" size="5"><B>—</B></font> | + | <font color="#0000FF" size="5"><B>—</B></font> Первое тело |
+ | |||
+ | <!-- <font color="#FF0000" size="5"><B>—</B></font> Второе тело --> | ||
</div> | </div> | ||
Строка 551: | Строка 473: | ||
<div> | <div> | ||
Фазовая плоскость: | Фазовая плоскость: | ||
− | <font color="#0000FF" size="5"><B>—</B></font> | + | <font color="#0000FF" size="5"><B>—</B></font> Первое тело |
+ | |||
+ | <!-- <font color="#FF0000" size="5"><B>—</B></font> Второе тело --> | ||
</div> | </div> | ||
Строка 562: | Строка 486: | ||
app.set_delt(this.value); | app.set_delt(this.value); | ||
document.getElementById('Slider_delt').value = this.value; | document.getElementById('Slider_delt').value = this.value; | ||
− | + | ||
"> | "> | ||
<input type = "range" id="Slider_delt" style="width: 100px;" oninput="app.set_delt(this.value); document.getElementById('Text_delt').value = this.value;"> | <input type = "range" id="Slider_delt" style="width: 100px;" oninput="app.set_delt(this.value); document.getElementById('Text_delt').value = this.value;"> | ||
Строка 570: | Строка 494: | ||
<!-- Масса 1 --> | <!-- Масса 1 --> | ||
<div> | <div> | ||
− | + | m1 = | |
− | <input id=" | + | <input id="Text_m1" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" |
if (!this.checkValidity()) return; | if (!this.checkValidity()) return; | ||
− | app. | + | app.set_m1(this.value); |
− | document.getElementById(' | + | document.getElementById('Slider_m1').value = this.value; |
"> | "> | ||
− | <input type = "range" id=" | + | <input type = "range" id="Slider_m1" style="width: 100px;" oninput="app.set_m1(this.value); document.getElementById('Text_m1').value = this.value;"> |
</I></font> | </I></font> | ||
</div> | </div> | ||
Строка 582: | Строка 506: | ||
<!-- Жесткость 1--> | <!-- Жесткость 1--> | ||
<div> | <div> | ||
− | + | c1 = | |
− | <input id=" | + | <input id="Text_c1" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" |
if (!this.checkValidity()) return; | if (!this.checkValidity()) return; | ||
− | app. | + | app.set_c1(this.value); |
− | document.getElementById(' | + | document.getElementById('Slider_c1').value = this.value; |
"> | "> | ||
− | <input type = "range" id=" | + | <input type = "range" id="Slider_c1" style="width: 100px;" oninput="app.set_c1(this.value); document.getElementById('Text_c1').value = this.value;"> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</I></font> | </I></font> | ||
</div> | </div> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<script type="text/javascript"> app = new MainParticle(document.getElementById('canvasBalls'),document.getElementById('canvasGraph'),document.getElementById('canvasGraph1'));</script> | <script type="text/javascript"> app = new MainParticle(document.getElementById('canvasBalls'),document.getElementById('canvasGraph'),document.getElementById('canvasGraph1'));</script> | ||
</body> | </body> | ||
− | </html> | + | </html> |
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> |