Сравнение методов Рунге-Кутта и Липфрога
Материал из Department of Theoretical and Applied Mechanics
Версия от 11:21, 22 декабря 2015; 192.168.144.21 (обсуждение) (Новая страница: «Виртуальная лаборатория>Сравнение методов Рунге-Кутта и Липфрога <HR> Сравнение мето…»)
Виртуальная лаборатория>Сравнение методов Рунге-Кутта и Липфрога
Сравнение методов численного интегрирования: Рунге-Кутта и Липфрога
В данном примере интегрируется уравнение грузика на пружинке:
методом Рунге-Кутта и Липфрога. Строится фазовая плоскость для каждого из методов.
Скачать New1.rar.
Текст программы на языке JavaScript (разработчик Погодина Валерия, код основан на программе Цветков Денис):
Файл "Integral3"
1 window.addEventListener("load", Main_Integrate, true);
2 function Main_Integrate() {
3
4 // Предварительные установки
5
6 var context = Integrate_canvas.getContext("2d"); // на context происходит рисование
7 var context1 = Integrate_canvas1.getContext("2d"); // на context происходит рисование
8 var T0 = 1; // масштаб времени (период колебаний исходной системы)
9 var time = 0;
10
11 // *** Задание вычислительных параметров ***
12
13 //const fps = 5500; // frames per second - число кадров в секунду (качеcтво отображения)
14 //const spf = 260; // steps per frame - число шагов интегрирования между кадрами (скорость расчета)
15 //const dt = 0.1 * T0 / fps; // шаг интегрирования
16
17 const fps = 550; // frames per second - число кадров в секунду (качеcтво отображения)
18 const spf = 5; // steps per frame - число шагов интегрирования между кадрами (скорость расчета)
19 const dt = 1 * T0; // шаг интегрирования
20 var n = 10;
21
22 Text_n.value = n;
23 Slider_n.min = 1;
24 Slider_n.max = 100;
25 Slider_n.step = 1;
26 Slider_n.value = Text_n.value;
27
28 // Добавление шара
29 var particles = [];
30 var particles1 = [];
31 for (var i=0; i<n; i++) {
32 particles[i] = [];
33 particles1[i] = [];
34 }
35 for (var i = 0; i < n; i++) {
36 for (var j = 0; j < n; j++) {
37 var b = [];
38 var a = [];
39 b.x = 0.3 / n * i;
40 b.vx =j * 0.3 / n;
41 a.x = 0.3 / n * i;
42 a.vx =j * 0.3 / n;
43 particles[i][j] = b;
44 particles1[i][j] = a;
45 }
46 }
47
48 this.set_n = function(input)
49 {
50 n = Number(input);
51 Text_n.value = n;
52 Slider_n.value = Text_n.value; //записываем значение начального смещения
53 for (var i=0; i<n; i++) {
54 particles[i] = [];
55 particles1[i] = [];
56 }
57 for (var i = 0; i < n; i++) {
58 for (var j = 0; j < n; j++) {
59 var b = [];
60 var a = [];
61 b.x = 0.3 / n * i;
62 b.vx = j * 0.3 / n;
63 a.x = 0.3 / n * i;
64 a.vx = j * 0.3 / n;
65 particles[i][j] = b;
66 particles1[i][j] = a;
67 }
68 } ;
69 context.clearRect(0, 0, 300, 300);
70 context1.clearRect(0, 0, 300, 300);
71 }
72
73
74 setInterval(control1, 1500 / fps);
75
76 function control1() {
77 physics1();
78 draw();
79 }
80
81 function physics1() { // то, что происходит каждый шаг времени
82 for (var s = 1; s <= spf; s++) {
83 for (i = 0; i < n; i++) {
84 for (j = 0; j < n; j++) {
85 runge();
86 leapfrog();
87 }
88 }
89 }
90 }
91
92 function leapfrog(){
93 particles1[i][j].vx = particles1[i][j].vx - particles1[i][j].x * dt;
94 particles1[i][j].x = particles1[i][j].x + particles1[i][j].vx * dt;
95 console.log(particles1[0][0].x);
96 }
97
98 function runge() {
99 var k1, k2, k3, k4;
100 k1 = - (particles[i][j].x);
101 k2 = - (particles[i][j].x + k1 * dt / 2);
102 k3 = - (particles[i][j].x + k2 * dt / 2);
103 k4 = - (particles[i][j].x + k3 * dt);
104 particles[i][j].vx = particles[i][j].vx + dt / 6 * (k1 + 2 * k2 + 2 * k3 + k4);
105 k1 = (particles[i][j].vx);
106 k2 = (particles[i][j].vx + k1 * dt / 2);
107 k3 = (particles[i][j].vx + k2 * dt / 2);
108 k4 = (particles[i][j].vx + k3 * dt);
109 particles[i][j].x = particles[i][j].x + dt / 6 * (k1 + 2 * k2 + 2 * k3 + k4);
110 console.log(particles[0][0].x);
111 }
112
113 function draw() {
114 context.clearRect(0, 0, 600, 600);
115 context.fillStyle="#000000";
116 context.beginPath();
117 context.moveTo(0, 300);
118 context.lineTo(600, 300);
119 context.stroke();
120 context.beginPath();
121 context.moveTo(300, 0);
122 context.lineTo(300, 600);
123 context.stroke();
124 context1.clearRect(0, 0, 600, 600);
125 context1.fillStyle="#000000";
126 context1.beginPath();
127 context1.moveTo(0, 300);
128 context1.lineTo(600, 300);
129 context1.stroke();
130 context1.beginPath();
131 context1.moveTo(300, 0);
132 context1.lineTo(300, 600);
133 context1.stroke();
134 for (var i = 0; i < n; i++) {
135 for (var j = 0; j < n; j++) {
136 context.beginPath();
137 context.arc(particles[i][j].x * 300 + 300, 300 - particles[i][j].vx * 300, 1, 0, 2 * Math.PI, false); //рисуем шар
138 context.fill();
139 context.closePath();
140
141 context1.beginPath();
142 context1.arc(particles1[i][j].x * 300 + 300, 300 - particles1[i][j].vx * 300, 1, 0, 2 * Math.PI, false); //рисуем шар
143 context1.fill();
144 context1.closePath();
145 }
146 }
147 }
148 }
Файл "Chain_v3_release.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8"/>
5 <title> Integrate </title>
6 <script src="Integral3.js"></script>
7 </head>
8 <body>
9 <canvas id="Integrate_canvas" width="600" height="600" style="border:1px solid #000000;"></canvas>
10 <canvas id="Integrate_canvas1" width="600" height="600" style="border:1px solid #000000;"></canvas>
11 <div>
12 <!-- n-->
13 <div>
14 n =
15 <input id="Text_n" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
16 if (!this.checkValidity()) return;
17 app.set_n(this.value);
18 document.getElementById('Slider_n').value = this.value;
19 ">
20 <input type = "range" id="Slider_n" style="width: 100px;" oninput="app.set_n(this.value); document.getElementById('Text_n').value = this.value;">
21 </I></font>
22 </div>
23 </div>
24 <script type="text/javascript"> app = new Main_Integrate(document.getElementById('Integrate_canvas'),document.getElementById('Integrate_canvas1'));</script>
25 </body>
26 </html>