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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
[[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и Липфрога]] <HR>
 
[[Виртуальная лаборатория]]>[[Сравнение методов Рунге-Кутта и Липфрога]] <HR>
 
+
Перед прочтением статьи рекомендуется просмотреть раздел "Обсуждение"
 
 
 
 
== '''Постановка задачи ''' ==
 
== '''Постановка задачи ''' ==
Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: leapfrog и Рунге-Кутта. Построить фазовую плоскость для каждого из методов и сравнить результаты.
+
Дано простейшее уравнение движения грузика на пружине: <math>\ddot{x} = -cx</math>. Необходимо интегрировать его с помощью двух методов: Липфрога и Рунге-Кутта. Сравнить результаты.
 
<br/>
 
<br/>
  
 
== '''Метод численного интегрирования Рунге-Кутты''' ==
 
== '''Метод численного интегрирования Рунге-Кутты''' ==
Для нашего уравнения алгоритм будет выглядеть следующим образом:<br />
+
Рассмотри задачу Коши для системы обыкновенных дифференциальных уравнений первого порядка.
Вычисление нового значения проходит в четыре стадии:<br />
+
<math>\dot{y} = f(x, y), y(x_0)=y_0</math>
<math>kv_1 = dt(-x(t))</math><br />
+
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:
<math>kv_2 = dt(-x(t)+\frac{kv_1}{2})</math><br />
+
<math>y_n+1 = y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4)</math>
<math>kv_3 = dt(-x(t)+\frac{kv_2}{2})</math><br />
+
=='''Основные уравнения'''==
<math>kv_4 = dt(-x(t)+kv_3)</math><br />
+
<div style="font-size: 16px;">1)''Расчет статических координат:''</div>
<br />
 
<math>kr_1 = dt\dot{x}(t)</math><br />
 
<math>kr_2 = dt(\dot{x}(t)+\frac{kr_1}{2})</math><br />
 
<math>kr_3 = dt(\dot{x}(t)+\frac{kr_2}{2})</math><br />
 
<math>kr_4 = dt(\dot{x}(t)+kv_3)</math><br />
 
где <math>dt</math> - шаг интегрирования.<br />  
 
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:<br />
 
<math>\dot{x}(t+dt) = \dot{x}(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 />
 
  
=='''Метод численного интегрирования leapfrog'''==
+
<math>{y}_{i}=i{l}_{0}+\sum^{i}_{k=1} {\Delta l_k}</math>
Для уравнения второй степени скорость и перемещение находятся следующим образом:<br />
+
<br/>
<math>\dot{x}(t+dt) = \dot{x}(t)-x(t)dt</math><br />
+
<br/>
<math>x(t+dt) = x(t)+\dot{x}(t+dt)dt</math><br />
+
<math>\Delta{l_k} = \frac{(n-k+1)mg}{C} </math>
 +
<br/>
 +
<br/>
 +
где  <math>{n}</math> — количество грузиков ; <math>{i}</math> — текущий грузик ; <math>{l_0}</math> — длина не растянутой пружины; <math>\Delta{l_k}</math> — статическое удлинение пружины.
  
                            '''Метод Рунге-Кутта'''                                                           '''Метод leapfrog'''
+
<div style="font-size: 16px;">2) ''Уравнение движения грузиков при отсутствии верхней пружины:''</div>
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Pogodina/Integrate/particles2.html |width=1300|height=800 |border=0 }}
+
<math>\ddot y_i = - \frac{C}{m} ({y}_{i+1} - 2{y}_{i}+{y}_{i-1}) + g </math> 
 +
<br/>
 +
<br/>
 +
при <math>i = n </math> :
 +
<br/>
 +
<math> \ddot y_n = - \frac{C}{m}(y_n - {y}_{n-1} - l_0) + g</math>
 +
<br/>
 +
<br/>'''Программа (лучше всего смотреть ее в Mozilla Firefox)'''
 +
<br/>
 +
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Alexandrov/Spring_illusion.html |width=800|height=800 |border=0 }}
 
<br />
 
<br />
 
<br />
 
<br />
Скачать программу [[Медиа:Particles1.rar|Particles1.rar]].
+
Скачать программу [[Медиа:Spring_illusion.rar|Spring_illusion.rar]].
 
<br />
 
<br />
 
<br />
 
<br />
 
<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">
Файл '''"Particles1.js"'''
+
Файл '''"Spring_illusin.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
<!DOCTYPE html>
+
window.addEventListener("load", Main_Spring, true);
<html>
+
function Main_Spring() {
<head>
+
 
    <meta charset="UTF-8" />
+
// *** Некие исходные данные ***
    <title> Particle</title>
+
 
    <script src="Particles2.js"></script>
+
var canvas = spring_canvas;
<!--    <script src="jquery.min.js"></script>
+
canvas.onselectstart = function () {return false;}; // запрет выделения canvas
    <script src="jquery.flot.js"></script> -->
+
var ctx = canvas.getContext("2d"); // на ctx происходит рисование
</head>
+
var w = canvas.width; // ширина окна в расчетных координатах
<body>
+
var h = canvas.height; // высота окна в расчетных координатах
<br>
+
 
<table><tr valign="top">
+
var Pi = 3.1415926; // число "пи"
<td>
+
var g = 9.8; // гравитационная постоянная
    <canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
+
 
<canvas id="canvasGraph1" width="600" height="600" style="border:1px solid #000000;"></canvas>
+
var T0 = 0.01; // масштаб времени (период колебаний исходной системы)
</td>
+
 
<!-- <td>
+
var m0 = 0.15; // масштаб массы маятника
<input type="button" id="drop_spring" value="Drop Spring"/><br>
+
var C0 = 1; // масштаб жесткости пружины
<br/>
+
 
<input type="button" id="new_static" value="New Static"/><br>
+
var count = true; // проводить ли расчет системы
<br>
+
var v = 0; // скорость тела
    <input type="range" id="slider_m" min="0.1" max="1.5" step=0.1 style="width: 150px;" />
+
var t = 0;
    Масса грузиков = <input type="number" id="number_m" min="0.1" max="1.5" step=0.1 style="width: 50px;" /><br>
+
 
+
// параметры полученные из размеров холста
<input type="range" id="slider_spf" min="1" max="15" step=1 style="width: 150px;" />
+
var rw = canvas.width / 4;
    Скорость протекания процесса = <input type="number" id="number_spf" min="1" max="15" step=1 style="width: 50px;" /><br> -->
+
var rh = canvas.height / 100;
 
<input type="range" id="slider_n" min="1" max="100" step=1 style="width: 150px;" />
 
    Количество частиц = <input type="number" id="number_n" min="1" max="100" step=1 style="width: 50px;" /><br>
 
<br>
 
<input type="range" id="slider_dt" min="0.0001" max="0.01" step=0.0001 style="width: 150px;" />
 
    dt = <input type="number" id="number_dt" min="0.0001" max="0.01" step=0.0001 style="width: 50px;" /><br>
 
<br>
 
<script
 
type="text/javascript"> app = new MainParticle(document.getElementById('canvasGraph'),document.getElementById('canvasGraph1'));
 
</script>
 
<!-- График перемещений последнего грузика:
 
    <div id="vGraph1" style="width:400px; height:200px; clear:both;"></div> -->
 
 
  
</tr></table>
+
// параметры грузиков
</body>
+
var x0 = 0;
</html>
+
var y0 = 0;
function MainParticle(canvas_gr, canvas_gr1) {
+
var vy0 = 0;
    // Предварительные установки
+
var rad0 = 7;
var context_gr  = canvas_gr.getContext("2d"); // на context происходит рисование
+
var sTime = 0;
var context_gr1  = canvas_gr1.getContext("2d"); // на context происходит рисование
+
// параметры пружины
  //  Задание констант
+
var Lp = 30; //длина пружины
    const Pi = 3.1415926;                   // число "пи"
 
    const T0 = 1;                           // масштаб времени (период колебаний исходной системы)
 
    const a0 = 1;                           // масштаб расстояния (диаметр шара)
 
  
    const k0 = 2 * Pi / T0;                // масштаб частоты
 
  
    // *** Задание физических параметров ***
+
// *** Задание вычислительных параметров ***
  
    const Ny = 5;                           // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
+
var fps = 60; // frames per second - число кадров в секунду (качечтво отображения)
 +
var spf = 5; // steps per frame  - число шагов интегрирования между кадрами
 +
var dt = 50 * T0 / fps; // шаг интегрирования (качество расчета)
 +
var steps = 0; // количество шагов интегрирования
  
var vx0 = 1 * a0 / T0;
 
  
+
// *** Задание физических параметров ***
+
var m = 1 * m0; // масса грузика
+
var C = 1 * C0; // жесткость пружины
+
var L0 = 0; // изначальное удлинение пружины
    // *** Задание вычислительных параметров ***
+
var n = 5; // количество тел
 +
var circle; // круглые тела
  
    const fps = 50;                        // frames per second - число кадров в секунду (качеcтво отображения)
+
// *** Установка слайдеров для переменных величин ***
    const spf = 100;                        // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
+
slider_m.value = (m / m0).toFixed(1);
    var dt  = 0.2 * T0 / fps;  
+
number_m.value = (m / m0).toFixed(1);
var n = 40; // шаг интегрирования
+
slider_spf.value = (spf).toFixed(1);
 +
number_spf.value = (spf).toFixed(1);
 
slider_n.value = parseInt(n);
 
slider_n.value = parseInt(n);
 
number_n.value = parseInt(n);
 
number_n.value = parseInt(n);
slider_dt.value = dt;
+
 
number_dt.value = dt;
+
function setM(new_m) {
+
m = new_m * m0;
        function setN(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 j = 0; j < n; j++) {
+
function setSpf(new_spf) {
c = [];
+
spf = new_spf;
d = [];
 
c.x = w / 3 / n * i;
 
c.vx = 2 * vx0 / n * j;
 
d.x = w / 3 / n * i;
 
d.vx = 2 * vx0 / n * j;
 
b[i][j] = c;
 
a[i][j] = d;
 
}
 
 
}
 
}
context_gr.clearRect(0, 0, w * scale, h * scale);
+
function setN(new_n) {
context_gr1.clearRect(0, 0, w * scale, h * scale);
+
n = new_n;
        }
+
StaticStart();
 
function setdt(new_dt) {
 
dt = new_dt;
 
for (var i = 0; i< n; i++) {
 
for (var j = 0; j < n; j++) {
 
c = [];
 
d = [];
 
c.x = w / 3 / n * i;
 
c.vx = 2 * vx0 / n * j;
 
d.x = w / 3 / n * i;
 
d.vx = 2 * vx0 / n * j;
 
b[i][j] = c;
 
a[i][j] = d;
 
}
 
 
}
 
}
context_gr.clearRect(0, 0, w * scale, h * scale);
+
 
context_gr1.clearRect(0, 0, w * scale, h * scale);
+
slider_m.oninput = function () {
        }
+
number_m.value = slider_m.value;
+
setM(slider_m.value);
 +
};
 +
number_m.oninput = function () {
 +
slider_m.value = number_m.value;
 +
setM(number_m.value);
 +
};
 +
 
 +
 
 +
slider_spf.oninput = function () {
 +
number_spf.value = slider_spf.value;
 +
setSpf(slider_spf.value);
 +
};
 +
number_spf.oninput = function () {
 +
slider_spf.value = number_spf.value;
 +
setSpf(number_spf.value);
 +
};
 +
 
 
slider_n.oninput = function () {
 
slider_n.oninput = function () {
 
number_n.value = slider_n.value;
 
number_n.value = slider_n.value;
 
setN(slider_n.value);
 
setN(slider_n.value);
        };
+
};
 
 
number_n.oninput = function () {
 
number_n.oninput = function () {
 
slider_n.value = number_n.value;
 
slider_n.value = number_n.value;
 
setN(number_n.value);
 
setN(number_n.value);
        };
+
};
 +
 
 +
// *** Условие падения тела ***
 +
var spring_dropped = false;
 +
drop_spring.onclick = function () {
 +
spring_dropped = true;
 +
};
 +
 
 +
// *** Пересчет статических координат
 +
new_static.onclick = function () {
 +
StaticStart()
 +
};
 +
 
 +
// *** Создание массива элементов ***
 +
function StaticStart() {
 +
spring_dropped = false;
 +
circle = [];
 +
for (var i = 0; i < n; i++) {
 +
var circ = {};
 +
circ.x = x0;
 +
circ.y = y0;
 +
circ.vy = vy0;
 +
circ.rad = rad0;
 +
circ.L = L0;
  
slider_dt.oninput = function () {
+
var rgb = HSVtoRGB(i / n * 2, 1, 1);
number_dt.value = slider_dt.value;
 
setdt(slider_dt.value);
 
        };
 
 
number_dt.oninput = function () {
 
slider_dt.value = number_dt.value;
 
setdt(number_dt.value);
 
        };
 
  
+
circ.fill = "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", 1)";
+
circle[i] = circ;
// Задание констант для рисования
+
}
const scale = canvas_gr.height / Ny / a0; // масштабный коэффициент для перехода от расчетных к экранным координатам
+
for (var i = 0; i < n; i++) {
+
if (i == 0) {
var w = canvas_gr.width / scale;           // ширина окна в расчетных координатах
+
circle[i].x = w / 2;
    var h = canvas_gr.height / scale;         // высота окна в расчетных координатах
+
circle[i].y0 = Lp + (n - i) * m * g / C;
+
circle[i].y = circle[i].y0;
 +
 
 +
} else {
 +
circle[i].x = w / 2;
 +
circle[i].y0 = circle[i - 1].y0 + Lp + (n - i) * m * g / C;
 +
circle[i].y = circle[i].y0;
 +
console.log(circle[i].y0);
  
    // -------------------------------        Выполнение программы              ------------------------------------------
+
}
// Добавление шара
 
var b = [];
 
var a = [];
 
for (var z = 0; z < n; z++) {
 
b[z] = [];
 
a[z] = [];
 
}
 
for (var i = 0; i< n; i++) {
 
for (var j = 0; j < n; j++) {
 
c = [];
 
d = [];
 
c.x = w / 3 / n * i;
 
c.vx = 2 * vx0 / n * j;
 
d.x = w / 3 / n * i;
 
d.vx = 2 * vx0 / n * j;
 
b[i][j] = c;
 
a[i][j] = d;
 
 
}
 
}
 
}
 
}
 
 
// Основной цикл программы
+
// *** функция разукрашивания объектов
setInterval(control, 1500 / fps); // функция control вызывается с периодом, определяемым вторым параметром
+
function HSVtoRGB(h, s, v) {             
+
    var r, g, b, i, f, p, q, t;
// ---------------------------------------------------------------------------------------------------------------------
+
    i = Math.floor(h * 6);
// ---------------------------------          Определение всех функций              -----------------------------------
+
    f = h * 6 - i;
// ---------------------------------------------------------------------------------------------------------------------
+
    p = v * (1 - s);
+
    q = v * (1 - f * s);
// основная функция, вызываемая в программе
+
    t = v * (1 - (1 - f) * s);
function control()
+
    switch (i % 6) {
{
+
        case 0: r = v, g = t, b = p; break;
         physics(); // делаем spf шагов интегрирование
+
        case 1: r = q, g = v, b = p; break;
draw_gr(); // рисуем график
+
        case 2: r = p, g = v, b = t; break;
 +
        case 3: r = p, g = q, b = v; break;
 +
         case 4: r = t, g = p, b = v; break;
 +
        case 5: r = v, g = p, b = q; break;
 
     }
 
     }
 +
    return {
 +
        r: Math.floor(r * 255),
 +
        g: Math.floor(g * 255),
 +
        b: Math.floor(b * 255)
 +
    };
 +
}
  
+
    // график
     // Функция, делающая spf шагов интегрирования
+
     var vGraph1 = new TM_graph(                  // определить график
    function physics() {                   // то, что происходит каждый шаг времен
+
        "#vGraph1",                              // на html-элементе #vGraph
for (var s = 1; s <= spf; s++) {
+
        250,                                   // сколько шагов по оси "x" отображается
for (var k = 0; k < n; k++) {
+
        0, 100, 5);                            // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
for (var p = 0; p < n; p++) {
+
 
 +
// *** Функция обеспечивающая "жизнь" пружин ***
 +
function control() {
 +
calculate();
 +
draw();
 +
requestAnimationFrame(control);
 +
}
 +
StaticStart();
 +
control();
 +
 
 +
 
 +
 
 +
// *** Функция расчетов координат ***
 +
function calculate() {
 +
 
 +
for (var s = 1; s <= spf; s++) {
 +
var k = n;
 +
for (var i = 1; i < n; i++) {
 +
if (spring_dropped)
 +
circle[0].L = 0;
 +
else
 +
circle[0].L = circle[0].y - Lp;
 +
circle[i].L = circle[i].y - circle[i - 1].y - Lp;
 +
}
 +
 
 +
for (var i = 0; i < n; i++) {
 +
if (i == n - 1)
 +
circle[i].vy += ((-1) * C * (circle[i].L) / m + g) * dt;
 +
else
 +
circle[i].vy += ((-1) * C * (circle[i].L - circle[i + 1].L) / m + g) * dt;
 +
 
 
k1v = dt*(-( b[k][p].x));
+
circle[i].y += circle[i].vy * dt;
k2v = dt*(-( b[k][p].x)  + k1v/2);
+
 
k3v = dt*(-( b[k][p].x)  + k2v/2);
 
k4v = dt*(-( b[k][p].x) + k3v);
 
 
 
k1r = dt* b[k][p].vx;
 
k2r = dt*(b[k][p].vx + k1r/2);
 
k3r = dt*(b[k][p].vx + k2r/2);
 
k4r = dt*(b[k][p].vx + k3r);
 
 
 
b[k][p].vx += (k1v + 2*k2v + 2*k3v + k4v)/6;
 
b[k][p].x  += (k1r + 2*k2r + 2*k3r + k4r)/6;
 
 
 
a[k][p].vx = a[k][p].vx - a[k][p].x * dt;         
 
a[k][p].x = a[k][p].x + a[k][p].vx * dt;
 
        }
 
}
 
}
 
 
}
 
}
+
steps++;
  
 +
if (spring_dropped)
 +
{ sTime ++;
 +
if (sTime % 50 == 0) vGraph1.graphIter(sTime/50, (circle[n-1].y-circle[n-1].y0)) ;
 +
};
 +
}
 +
}
 +
 +
 +
// *** Функция рисования объектов ***
 +
function draw() {
 +
ctx.clearRect(0, 0, w, h);
 +
 +
// Рисование закрепления
 +
ctx.lineWidth = 6;
 +
ctx.strokeStyle = "#7394cb";
 +
ctx.beginPath();
 +
ctx.moveTo(200, 0);
 +
ctx.lineTo(300, 0);
 +
ctx.stroke();
 +
 +
for (var i = 0; i < n; i++) {
 +
 +
// Рисование пружинок
 +
if (i == 0) {
 +
if (!spring_dropped)
 +
draw_spring(0, circle[i].y, w / 2, 10, 40);
 +
} else
 +
draw_spring(circle[i - 1].y, circle[i].y, w / 2, 10, 40);
 +
 +
 +
}
 +
for (var i = 0; i < n; i++) {
 
 
+
// Рисование грузиков
 +
ctx.lineWidth = 6;
 +
ctx.strokeStyle = "#8B008B";
 +
ctx.beginPath();
 +
ctx.moveTo(circle[i].x-20, circle[i].y);
 +
ctx.lineTo(circle[i].x+20, circle[i].y);
 +
ctx.stroke();
 +
}
 +
 
 +
}
  
// Определение функции, рисующей график
+
// *** Функция рисования пружины ***
context_gr.fillStyle = "#3070d0"; // цвет
+
function draw_spring(x_start, x_end, y, n, h) {
context_gr.strokeStyle = "#ff0000";
+
ctx.lineWidth = 1;
context_gr1.fillStyle = "#3070d0"; // цвет
+
 
context_gr1.strokeStyle = "#ff0000";
+
var L = x_end - x_start;
function draw_gr()  
+
for (var i = 0; i < n; i++) {
{
+
var rgb = HSVtoRGB(i / n * 0.5, 1, 1);
context_gr.clearRect(0, 0, w * scale, h * scale);
+
ctx.strokeStyle = "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", 1)";
context_gr.beginPath();
+
 
context_gr.strokeStyle = "#000000";
+
var x_st = x_start + L / n * i;
+
var x_end = x_start + L / n * (i + 1);
context_gr1.clearRect(0, 0, w * scale, h * scale);
+
var l = x_end - x_st;
context_gr1.beginPath();
+
ctx.beginPath();
context_gr1.strokeStyle = "#000000";
+
ctx.bezierCurveTo(y, x_st, y + h, x_st + l / 4, y, x_st + l / 2);
+
ctx.bezierCurveTo(y, x_st + l / 2, y - h, x_st + 3 * l / 4, y, x_st + l);
// ось
+
ctx.stroke();
context_gr.moveTo(w/2*scale, (h)*scale);
+
}
context_gr.lineTo(w/2*scale, -h*scale);
+
}
context_gr1.moveTo(w/2*scale, (h)*scale);
 
context_gr1.lineTo(w/2*scale, -h*scale);
 
 
// ось
 
context_gr.moveTo(0, (h/2)*scale);
 
context_gr.lineTo((w)*scale, (h/2)*scale);
 
context_gr1.moveTo(0, (h/2)*scale);
 
context_gr1.lineTo((w)*scale, (h/2)*scale);
 
 
        context_gr.closePath();
 
context_gr.stroke();
 
        context_gr1.closePath();
 
context_gr1.stroke();
 
 
// график
 
for (var l = 0; l< n; l++) {
 
for (var m = 0; m < n; m++) {
 
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.fill();
 
context_gr.closePath();
 
 
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.fill();
 
context_gr1.closePath();
 
 
}
 
}
 
 
}
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Строка 305: Строка 317:
 
</div>
 
</div>
  
=='''Выводы'''==
+
=='''Физическое объяснение'''==
Мы наблюдаем симплектический характер метода Липфрога: сохраняет энергию(слегка измененную). Метод Рунге-Кутты напротив не соханяет энергию системы.
+
Мы наблюдаем иллюзию "зависания" нижнего грузика потому, что до него должна дойти волна возмущений верхней пружины, прежде чем он придет в движение.
  
 
=='''Ссылки'''==
 
=='''Ссылки'''==
*[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:

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