Редактирование: Сравнение методов Рунге-Кутта и Липфрога

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и Липфрога]] <HR>
+
[[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и leapfrog]] <HR>
 
+
Перед прочтением статьи рекомендуется просмотреть раздел "Обсуждение"
 
 
 
 
== '''Постановка задачи ''' ==
 
== '''Постановка задачи ''' ==
Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: leapfrog и Рунге-Кутта. Построить фазовую плоскость для каждого из методов и сравнить результаты.
+
Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: leapfrog и Рунге-Кутта. Сравнить результаты.
 
<br/>
 
<br/>
  
Строка 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 = dt\dot{x}(t)</math><br />
+
<math>kr_1 = dtV(t)</math><br />
<math>kr_2 = dt(\dot{x}(t)+\frac{kr_1}{2})</math><br />
+
<math>kr_2 = dt(V(t)+\frac{kr_1}{2})</math><br />
<math>kr_3 = dt(\dot{x}(t)+\frac{kr_2}{2})</math><br />
+
<math>kr_3 = dt(V(t)+\frac{kr_2}{2})</math><br />
<math>kr_4 = dt(\dot{x}(t)+kv_3)</math><br />
+
<math>kr_4 = dt(V(t)+kv_3)</math><br />
 
где <math>dt</math> - шаг интегрирования.<br />  
 
где <math>dt</math> - шаг интегрирования.<br />  
 
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br />
 
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br />
<math>\dot{x}(t+dt) = \dot{x}(t) + \frac{h}{6}(kr_1 + 2kr_2 + 2kr_3 + kr_4)</math><br />
+
<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 />
 
+
[https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5_%E2%80%94_%D0%9A%D1%83%D1%82%D1%82%D1%8B Рунге-Кутты]
 
=='''Метод численного интегрирования leapfrog'''==
 
=='''Метод численного интегрирования leapfrog'''==
 
Для уравнения второй степени скорость и перемещение находятся следующим образом:<br />
 
Для уравнения второй степени скорость и перемещение находятся следующим образом:<br />
<math>\dot{x}(t+dt) = \dot{x}(t)-x(t)dt</math><br />
+
<math>V(t+dt) = V(t)-x(t)dt</math><br />
<math>x(t+dt) = x(t)+\dot{x}(t+dt)dt</math><br />
+
<math>x(t+dt) = x(t)+V(t+dt)dt</math><br />
 
+
[https://en.wikipedia.org/wiki/Leapfrog_integration leapfrog]
 
                             '''Метод Рунге-Кутта'''                                                            '''Метод leapfrog'''
 
                             '''Метод Рунге-Кутта'''                                                            '''Метод leapfrog'''
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Pogodina/Integrate/particles2.html |width=1300|height=800 |border=0 }}
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Pogodina/Integrate/particles2.html |width=1300|height=800 |border=0 }}
Строка 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 = 40; // шаг интегрирования  
+
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 z = 0; z < n; z++) {
 
b[z] = [];
 
a[z] = [];
 
}
 
 
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 / 3 / n * i;
+
c.x = w / 2 + w / 7.1 / n * i;
c.vx = 2 * vx0 / n * j;
+
c.vx = vx0 / 1.7 / n * j;
d.x = w / 3 / n * i;
+
d.x = 0.28 / n * i;
d.vx = 2 * vx0 / n * j;
+
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 / 3 / n * i;
+
c.x = w / 2 + w / 7.1 / n * i;
c.vx = 2 * vx0 / n * j;
+
c.vx = vx0 / 1.7 / n * j;
d.x = w / 3 / n * i;
+
d.x = 0.28 / n * i;
d.vx = 2 * vx0 / n * j;
+
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 / 3 / n * i;
+
c.x = w / 2 + w / 7.1 / n * i;
c.vx = 2 * vx0 / n * j;
+
c.vx = vx0 / 1.7 / n * j;
d.x = w / 3 / n * i;
+
d.x = 0.28 / n * i;
d.vx = 2 * vx0 / n * j;
+
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((b[l][m].x + w/2)* scale, (-b[l][m].vx + h / 2) * scale, 1, 0, 2 * Math.PI, false);                  //рисуем шар
+
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((a[l][m].x + w/2)* scale, (-a[l][m].vx + h / 2) * scale, 1, 0, 2 * Math.PI, false);                  //рисуем шар
+
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: Строка 313:
  
 
=='''Ссылки'''==
 
=='''Ссылки'''==
*[https://en.wikipedia.org/wiki/Leapfrog_integration leapfrog]
 
*[https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D1%83%D0%BD%D0%B3%D0%B5_%E2%80%94_%D0%9A%D1%83%D1%82%D1%82%D1%8B Рунге-Кутты]
 
*[[Курсовые работы по ВМДС: 2015-2016]]
 
*[[Введение в механику дискретных сред]]
 
 
* [[Виртуальная лаборатория]]
 
* [[Виртуальная лаборатория]]
 
<br/>
 
<br/>
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)