Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
solar_system_n_(20)_planets_an_time
uses GraphABC; const n = 20; // количество планет t = 0.00001;// шаг по времени type velocity = record // скорость i-го тела в начале, в конце и в середине интервала x: array [1..n, 1..3] of real; y: array [1..n, 1..3] of real; end; acceleration = record // ускорение i-го тела x: array [1..n] of real; y: array [1..n] of real; end; var x: array [1..n] of real; // x-координата i-го тела y: array [1..n] of real; // y-координата i-го тела r: array [1..n, 1..n] of real; // расстояние между i-ым и j-ым телами m: array [1..n] of real;// масса i-го тела var v: velocity; a: acceleration; flag: integer;// определяет через сколько интервалов t выводить изображение var i, j: integer; begin flag := 0; // вводим начальные условия для первого тела m[1] := 3; x[1] := 0; y[1] := 0; v.x[1, 1] := 0.0; v.y[1, 1] := 0.0; v.x[1, 2] := 0.0; v.y[1, 2] := 0; v.x[1, 3] := 0.0; v.y[1, 3] := 0.5 * (v.y[1, 1] + v.y[1, 2]); // вводим начальные условия для второго тела m[2] := 0.000001; x[2] := 0.5; y[2] := 0; v.x[2, 1] := 0.0; v.y[2, 1] := 0.0; v.x[2, 2] := 0; v.y[2, 2] := 6; v.x[2, 3] := 0.0; v.y[2, 3] := 0.5 * (v.y[2, 1] + v.y[2, 2]); // вводим начальные условия для третьего тела m[3] := 0.000001; x[3] := 1; y[3] := 0; v.x[3, 1] := 0.0; v.y[3, 1] := 0.0; v.x[3, 2] := 0; v.y[3, 2] := 4; v.x[3, 3] := 0.0; v.y[3, 3] := 0.5 * (v.y[3, 1] + v.y[3, 2]); // вводим начальные условия для четвёртого тела m[4] := 0.000001; x[4] := -2; y[4] := 0; v.x[4, 1] := 0.0; v.y[4, 1] := 0.0; v.x[4, 2] := 0; v.y[4, 2] := -2; v.x[4, 3] := 0.0; v.y[4, 3] := 0.5 * (v.y[4, 1] + v.y[4, 2]); // вводим начальные условия для пятого тела m[5] := 0.000001; x[5] := 4; y[5] := 0; v.x[5, 1] := 0.0; v.y[5, 1] := 0.0; v.x[5, 2] := 0; v.y[5, 2] := 1; v.x[5, 3] := 0.0; v.y[5, 3] := 0.5 * (v.y[5, 1] + v.y[5, 2]); // вводим начальные условия для шестого тела m[6] := 0.01; x[6] := -4; y[6] := 0; v.x[6, 1] := 0.0; v.y[6, 1] := 0.0; v.x[6, 2] := 0; v.y[6, 2] := -1.5; v.x[6, 3] := 0.0; v.y[6, 3] := 0.5 * (v.y[6, 1] + v.y[6, 2]); // вводим начальные условия для остальных n тел for i := 7 to n do begin m[i] := 0.000001; x[i] := -4 + random; y[i] := 0; v.x[i, 1] := 0.0; v.y[i, 1] := 0.0; v.x[i, 2] := 0; v.y[i, 2] := -1 - random(2); v.x[i, 3] := 0.0; v.y[i, 3] := 0.5 * (v.y[i, 1] + v.y[i, 2]); end; // вводим начальные условия для первого тела m[1] := 3; x[1] := 0; y[1] := 0; v.x[1, 1] := 0.0; v.y[1, 1] := 0.0; v.x[1, 2] := 0.0; v.y[1, 2] := 0; v.x[1, 3] := 0.0; v.y[1, 3] := 0.5 * (v.y[1, 1] + v.y[1, 2]); for i := 1 to n do begin a.x[i] := 0; a.y[i] := 0; end; // задаём начальные расстояния между телами for i := 1 to n do for j := 1 to n do if i <> j then begin r[i, j] := -sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j])) ** 3; a.x[i] := a.x[i] + m[j] * (x[i] - x[j]) / r[i, j]; a.y[i] := a.y[i] + m[j] * (y[i] - y[j]) / r[i, j]; end; SetWindowTop(10); SetWindowLeft(10); SetWindowSize(1000, 1000); while x[1] < 10000 do begin for i := 1 to n do begin x[i] := x[i] + t * v.x[i, 3]; y[i] := y[i] + t * v.y[i, 3]; v.x[i, 1] := v.x[i, 1] + t * a.x[i]; v.y[i, 1] := v.y[i, 1] + t * a.y[i]; v.x[i, 2] := v.x[i, 2] + (t + t ) * a.x[i]; v.y[i, 2] := v.y[i, 2] + (t + t ) * a.y[i]; v.x[i, 3] := 0.5 * (v.x[i, 1] + v.x[i, 2] ); v.y[i, 3] := 0.5 * (v.y[i, 1] + v.y[i, 2] ); end; for i := 1 to n do begin a.x[i] := 0; a.y[i] := 0; for j := 1 to n do if i <> j then begin r[i, j] := -sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j])) ** 3; a.x[i] := a.x[i] + m[j] * (x[i] - x[j]) / r[i, j]; a.y[i] := a.y[i] + m[j] * (y[i] - y[j]) / r[i, j]; end; end; if flag mod 500 = 0 then // рисуем через 100 временных циклов циклов begin ClearWindow; LockDrawing; line(100, 500, 800, 500); line(500, 100, 500, 800); for i := 1 to n do begin if m[i] < 0.01 then circle(round(500 + 100 * x[i]), round(500 + 100 * y[i]), round( 2 ) ) else if m[i] < 0.1 then circle(round(500 + 100 * x[i]), round(500 + 100 * y[i]), round( 4 ) ) else circle(round(500 + 100 * x[i]), round(500 + 100 * y[i]), round( m[i] * 10 ) ); end; for i := 1 to n - 1 do for j := i + 1 to n do begin //line(round(500 + 100 * x[i]), round(500 + 100 * y[i]), round(500 + 100 * x[j]), round(500 + 100 * y[j])); end; // circle(round(500 + 100 * (m[1]*x[1]+m[2]*x[2]+m[3]*x[3])/(m[1]+m[2]+m[3])), round(500 + 100 * (m[1]*y[1]+m[2]*y[2]+m[3]*y[3])/(m[1]+m[2]+m[3])), round( 3 ) ); Redraw; if random(101) = 5 then begin // m[1] := 1.05 * m[1]; // m[2] := 0.95 * m[2]; end; end; if flag < 1000 then flag := flag + 1 else flag := 0; end; end.
run
|
edit
|
history
|
help
0
Prosti brojevi praktikum nizovi
practica 2 ejercicio 4
a 3 .a
Lab1SumWithRepeat
Задача №1516. Проверка на простоту (цикл while)
P170808D
test08
test01
Banyaknya huruf vokal
zad27-optimal