Редактирование: Сравнение методов Рунге-Кутта и Липфрога
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | [[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и | + | [[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и leapfrog]] <HR> |
− | |||
− | |||
== '''Постановка задачи ''' == | == '''Постановка задачи ''' == | ||
Строка 15: | Строка 13: | ||
<math>kv_4 = dt(-x(t)+kv_3)</math><br /> | <math>kv_4 = dt(-x(t)+kv_3)</math><br /> | ||
<br /> | <br /> | ||
− | <math>kr_1 = | + | <math>kr_1 = dtV(t)</math><br /> |
− | <math>kr_2 = dt( | + | <math>kr_2 = dt(V(t)+\frac{kr_1}{2})</math><br /> |
− | <math>kr_3 = dt( | + | <math>kr_3 = dt(V(t)+\frac{kr_2}{2})</math><br /> |
− | <math>kr_4 = dt( | + | <math>kr_4 = dt(V(t)+kv_3)</math><br /> |
где <math>dt</math> - шаг интегрирования.<br /> | где <math>dt</math> - шаг интегрирования.<br /> | ||
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br /> | Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br /> | ||
− | <math> | + | <math>V(t+dt) = V(t) + \frac{h}{6}(kr_1 + 2kr_2 + 2kr_3 + kr_4)</math><br /> |
<math>x(t+dt) = x(t) + \frac{h}{6}(kv_1 + 2kv_2 + 2kv_3 + kv_4)</math><br /> | <math>x(t+dt) = x(t) + \frac{h}{6}(kv_1 + 2kv_2 + 2kv_3 + kv_4)</math><br /> | ||
=='''Метод численного интегрирования leapfrog'''== | =='''Метод численного интегрирования leapfrog'''== | ||
Для уравнения второй степени скорость и перемещение находятся следующим образом:<br /> | Для уравнения второй степени скорость и перемещение находятся следующим образом:<br /> | ||
− | <math> | + | <math>V(t+dt) = V(t)-x(t)dt</math><br /> |
− | <math>x(t+dt) = x(t)+ | + | <math>x(t+dt) = x(t)+V(t+dt)dt</math><br /> |
'''Метод Рунге-Кутта''' '''Метод leapfrog''' | '''Метод Рунге-Кутта''' '''Метод leapfrog''' | ||
Строка 89: | Строка 87: | ||
// Задание констант | // Задание констант | ||
const Pi = 3.1415926; // число "пи" | const Pi = 3.1415926; // число "пи" | ||
+ | const m0 = 1; // масштаб массы | ||
const T0 = 1; // масштаб времени (период колебаний исходной системы) | const T0 = 1; // масштаб времени (период колебаний исходной системы) | ||
const a0 = 1; // масштаб расстояния (диаметр шара) | const a0 = 1; // масштаб расстояния (диаметр шара) | ||
+ | const g0 = a0 / T0 / T0; // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0) | ||
const k0 = 2 * Pi / T0; // масштаб частоты | const k0 = 2 * Pi / T0; // масштаб частоты | ||
+ | const C0 = m0 * k0 * k0; // масштаб жесткости | ||
+ | const B0 = 2 * m0 * k0; // масштаб вязкости | ||
// *** Задание физических параметров *** | // *** Задание физических параметров *** | ||
const Ny = 5; // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна) | const Ny = 5; // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна) | ||
+ | const m = 1 * m0; // масса | ||
+ | const Cwall = 10 * C0; // жесткость стен | ||
+ | const B = 0.01 * B0; // вязкость среды | ||
+ | const B1 = 0.03 * B0; // вязкость на стенках | ||
+ | var mg = 0.25 * m * g0; // сила тяжести | ||
+ | const r = 0.5 * a0; // радиус частицы в расчетных координатах | ||
+ | var stiff = 1 * C0; // "жесткость" пружинки | ||
var vx0 = 1 * a0 / T0; | var vx0 = 1 * a0 / T0; | ||
Строка 109: | Строка 118: | ||
const spf = 100; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | const spf = 100; // steps per frame - число шагов интегрирования между кадрами (скорость расчета) | ||
var dt = 0.2 * T0 / fps; | var dt = 0.2 * T0 / fps; | ||
− | var n = | + | var n = 100; // шаг интегрирования |
slider_n.value = parseInt(n); | slider_n.value = parseInt(n); | ||
number_n.value = parseInt(n); | number_n.value = parseInt(n); | ||
Строка 117: | Строка 126: | ||
function setN(new_n) { | function setN(new_n) { | ||
n = new_n; | n = new_n; | ||
− | |||
− | |||
− | |||
− | |||
for (var i = 0; i< n; i++) { | for (var i = 0; i< n; i++) { | ||
for (var j = 0; j < n; j++) { | for (var j = 0; j < n; j++) { | ||
c = []; | c = []; | ||
d = []; | d = []; | ||
− | c.x = w / | + | c.x = w / 2 + w / 7.1 / n * i; |
− | c.vx = | + | c.vx = vx0 / 1.7 / n * j; |
− | d.x = | + | d.x = 0.28 / n * i; |
− | d.vx = | + | d.vx = vx0 / 1.7 / n * j; |
b[i][j] = c; | b[i][j] = c; | ||
a[i][j] = d; | a[i][j] = d; | ||
Строка 143: | Строка 148: | ||
c = []; | c = []; | ||
d = []; | d = []; | ||
− | c.x = w / | + | c.x = w / 2 + w / 7.1 / n * i; |
− | c.vx = | + | c.vx = vx0 / 1.7 / n * j; |
− | d.x = | + | d.x = 0.28 / n * i; |
− | d.vx = | + | d.vx = vx0 / 1.7 / n * j; |
b[i][j] = c; | b[i][j] = c; | ||
a[i][j] = d; | a[i][j] = d; | ||
Строка 196: | Строка 201: | ||
c = []; | c = []; | ||
d = []; | d = []; | ||
− | c.x = w / | + | c.x = w / 2 + w / 7.1 / n * i; |
− | c.vx = | + | c.vx = vx0 / 1.7 / n * j; |
− | d.x = | + | d.x = 0.28 / n * i; |
− | d.vx = | + | d.vx = vx0 / 1.7 / n * j; |
b[i][j] = c; | b[i][j] = c; | ||
a[i][j] = d; | a[i][j] = d; | ||
Строка 225: | Строка 230: | ||
for (var k = 0; k < n; k++) { | for (var k = 0; k < n; k++) { | ||
for (var p = 0; p < n; p++) { | for (var p = 0; p < n; p++) { | ||
− | + | k1v = dt*(-( b[k][p].x - w/2)); | |
− | k1v = dt*(-( b[k][p].x)); | + | k2v = dt*(-( b[k][p].x - w/2) + k1v/2); |
− | k2v = dt*(-( b[k][p].x) + k1v/2); | + | k3v = dt*(-( b[k][p].x - w/2) + k2v/2); |
− | k3v = dt*(-( b[k][p].x) + k2v/2); | + | k4v = dt*(-( b[k][p].x - w/2) + k3v); |
− | k4v = dt*(-( b[k][p].x) + k3v); | ||
k1r = dt* b[k][p].vx; | k1r = dt* b[k][p].vx; | ||
Строка 287: | Строка 291: | ||
for (var m = 0; m < n; m++) { | for (var m = 0; m < n; m++) { | ||
context_gr.beginPath(); | context_gr.beginPath(); | ||
− | context_gr.arc | + | context_gr.arc(b[l][m].x * scale, (-b[l][m].vx + h / 2) * scale, 1, 0, 2 * Math.PI, false); //рисуем шар |
context_gr.fill(); | context_gr.fill(); | ||
context_gr.closePath(); | context_gr.closePath(); | ||
context_gr1.beginPath(); | context_gr1.beginPath(); | ||
− | context_gr1.arc | + | context_gr1.arc(a[l][m].x * 300 + 300, (-a[l][m].vx + h / 2) * scale, 1, 0, 2 * Math.PI, false); //рисуем шар |
context_gr1.fill(); | context_gr1.fill(); | ||
context_gr1.closePath(); | context_gr1.closePath(); |