Редактирование: Сравнение методов Рунге-Кутта и Липфрога
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
[[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и Липфрога]] <HR> | [[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и Липфрога]] <HR> | ||
− | + | ||
− | |||
− | |||
== '''Постановка задачи ''' == | == '''Постановка задачи ''' == | ||
− | Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: | + | Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: Липфрога и Рунге-Кутта. Сравнить результаты. |
<br/> | <br/> | ||
== '''Метод численного интегрирования Рунге-Кутты''' == | == '''Метод численного интегрирования Рунге-Кутты''' == | ||
− | + | Рассмотри задачу Коши для системы обыкновенных дифференциальных уравнений первого порядка.<br /> | |
− | + | <math>\dot{y} = f(x, y), y(x_0)=y_0</math><br /> | |
− | |||
− | |||
− | <math> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br /> | Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br /> | ||
− | <math>\ | + | <math>y_n+1 = y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4)</math><br /> |
− | <math> | + | Вычисление нового зачения проходит в четыре стадии:<br /> |
− | + | <math>k_1 = f(x_n, y_n)</math><br /> | |
− | =='''Метод численного интегрирования | + | <math>k_2 = f(x_n+\frac{h}{2}, y_n+\frac{h}{2}k_1)</math><br /> |
+ | <math>k_3 = f(x_n+\frac{h}{2}, y_n+\frac{h}{2}k_2)</math><br /> | ||
+ | <math>k_4 = f(x_n+h, y_n+hk_3)</math><br /> | ||
+ | где <math>h</math> - величина сетки по <math>x</math>.<br /> | ||
+ | =='''Метод численного интегрирования Липфрога'''== | ||
Для уравнения второй степени скорость и перемещение находятся следующим образом:<br /> | Для уравнения второй степени скорость и перемещение находятся следующим образом:<br /> | ||
− | <math>\dot{x | + | <math>\dot{x(t+dt)} = \dot{x(t)}+f(t)dt</math><br /> |
− | <math>x(t+dt) = x(t)+\dot{x | + | <math>x(t+dt) = x(t)+\dot{x(t+dt)}dt</math><br /> |
− | + | '''Метод Рунге-Кутта''' '''Метод Липфрога''' | |
− | '''Метод Рунге-Кутта''' '''Метод | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Pogodina/Integrate/particles1.html |width=1300|height=800 |border=0 }} |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Pogodina/Integrate/ | ||
<br /> | <br /> | ||
<br /> | <br /> | ||
Строка 45: | Строка 36: | ||
<meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||
<title> Particle</title> | <title> Particle</title> | ||
− | <script src=" | + | <script src="Particles1.js"></script> |
<!-- <script src="jquery.min.js"></script> | <!-- <script src="jquery.min.js"></script> | ||
<script src="jquery.flot.js"></script> --> | <script src="jquery.flot.js"></script> --> | ||
Строка 89: | Строка 80: | ||
// Задание констант | // Задание констант | ||
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: | Строка 111: | ||
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: | Строка 119: | ||
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: | Строка 141: | ||
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: | Строка 194: | ||
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: | Строка 223: | ||
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: | Строка 284: | ||
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(); | ||
Строка 309: | Строка 306: | ||
=='''Ссылки'''== | =='''Ссылки'''== | ||
− | |||
− | |||
− | |||
− | |||
* [[Виртуальная лаборатория]] | * [[Виртуальная лаборатория]] | ||
<br/> | <br/> |