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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Виртуальная лаборатория>Сравнение методов Рунге-Кутта и Липфрога

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

В данном примере интегрируется уравнение грузика на пружинке: [math]\ddot{x} = -cx[/math] методом Рунге-Кутта и Липфрога. Строится фазовая плоскость для каждого из методов.

                       Метод Рунге-Кутта                                                                  Метод Липфрога

Скачать Integrate1.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>