Динамика ротора с многошариковым автобалансировочным устройством Бакалаврская работа
Санкт-Петербургский государственный университет
Механика и математическое моделирование
Теоретическая механика
Динамика ротора с многошариковым автобалансировочным устройством
Бакалаврская работа
Научный руководитель:
Ассистент, к. ф.м.-н.
Рецензент:
Доцент, к. ф.м.-н.
Санкт-Петербург
2017
SAINT-PETERSBURG STATE UNIVERSITY
Mechanics and Mathematical modeling
Theoretical Mechanics
Maksimov Anton Sergeevich
Dynamics of rotor with multiball autobalancer
Bachelor’s Thesis
Scientific supervisor:
Assistant, PhD A. S. Kovachev
Reviewer:
Аssociate professor, PhD V. kov
Saint-Petersburg
2017
Оглавление
Введение. Механическая модель ротора с многополостным многошариковым АБУ. Вывод уравнений движения ротора с АБУ. Модель соударения шариков АБУ. Алгоритм численного интегрирования с учетом соударений шариков в АБУ Примеры расчетов движения ротора с многополостным АБУ1). Автобалансировка ротора с трехполостным АБУ с 9 шариками при отсутствии соударений
2) Автобалансировка однополостного АБУ с 2 шариками при наличии соударения
3) Автобалансировка двуполостного АБУ с 8 шариками при наличии соударения
Вывод. Список литературы. Приложение 1. Код программы.Введение
Современные технические средства позволят довести конструкционную и технологическую составляющие дисбаланса ротора до допустимого минимума. Однако изменение величины дисбаланса может происходить во время эксплуатации роторной машины, и для того, чтобы заняться балансировкой придется остановить механизм, зачастую это невозможно или нежелательно. В таких случаях используются автоматические балансировочные устройства (АБУ). Они находят применение во многих механизмах с быстровращающимися элементами, например CD, DVD приводы, HDD накопители, электродвигатели, различные центрифуги. В промышленной, транспортной, бытовой и прецизионной технике все шире применяются шаровые автобалансирующие устройства, предназначенные для полной балансировки высокооборотных роторов с переменным дисбалансом.
Исследованиям данных машин посвящены многие работы, как отечественных [1-3], так и зарубежных ученых[4-6]. В большинстве работ авторы пренебрегают возможными столкновениями балансировочных шариков АБУ. И если в исследовании стационарных режимов [8] это справедливо, то при исследовании влияния динамического дисбаланса на амплитуду прецессионных колебаний [6] возникает вопрос, сохранятся ли полученные результаты, если учесть взаимодействие шаров АБУ.
Целью данной работы является разработка алгоритма построения движения простейшей модели ротора (модель Джеффкотта [4]) с многополостным, многошариковым автобалансировочным устройством принимая во внимание взаимодействие шаров АБУ между собой. Сделать вывод о влиянии столкновения шариков на прецессионные колебания ротора.
Механическая и математическая модель ротора с АБУ
|
|
Рис. 1 |
Рассматривается модель статически неуравновешенного ротора, представляющего собой жесткий диск радиуса R со смещенным центром тяжести (точка G) , симметрично закрепленный посередине невесомого изотропного упругого вала. Вал вращается вертикально в шарнирных опорах O1 ,O2 . Диск оснащен многополостным, многошариковым автобалансировочным устройством (АБУ), представляющим обойму, содержащую несколько кольцеобразных полостей, заполненных вязкой жидкостью, в которых могут свободно передвигаться балансировочные шарики. Геометрический центр АБУ совпадает с геометрическим центром диска (точка С). Полагаем, что движения диска происходить в горизонтальной плоскости, перпендикулярной оси вала.
Введем неподвижную систему координат OXYZ следующим образом: начало координат O находится в середине отрезка O1O2; ось OZ направленна вертикально вверх и проходит через точки O1 ,O2 ; оси OX и OY взаимоперпендикулярны и лежат в горизонтальной плоскости. (Рис. 1)

Рис. 2
Обойма АБУ содержит N не пересекающихся полостей (Рис. 2), равномерно распределенных между минимальным (0 < Rmin) и максимальным (Rmax < R) радиусом, i-ая полость имеет радиус ri и в ней находятся ni шариков плотности с, массы m и радиуса rb. Для балансировки ротора с эксцентриситетом s = ||CG|| необходимо, чтобы балансировочный коэффициент у, введенный в работе [работа 2006 года], удовлетворял следующему условию:
![]()
Отсюда можно рассчитать геометрические параметры АБУ:
![]()
![]()

При этом должны выполняться следующий условия:
![]()
![]()
Первое условие означает что полости в обойме АБУ не накладываются друг на друга. Второе условие гарантирует наличие зазора между шариками в каждой полости.
Вывод уравнений движения ротора с АБУ.
Введем следующие обозначения:
X, Y положение центра ротора (точка C);
и – угол поворота вала, отсчитывается от оси OX против часовой стрелки;
шi, j – угол отклонения j-го шарика в i-ой полости АБУ относительно оси, проходящей через точки C и G;
M – масса диска;
m – масса одного шарика АБУ;
k – коэффициент упругости вала;
c, d, f – коэффициенты диссипации, учитывающие потерю энергии, для поперечного смещения диска, для поворота вала, для движения шарика в АБУ;
Mвр – внешний вращающий момент, приложенный к валу;
Jc – момент инерции диска; ![]()
– радиус инерции диска.
Для получения уравнения движения системы воспользуемся метод Лагранжа. Выражения для кинетической, потенциальной энергии и диссипативной функции Релея имеют вид:

![]()

В которых:
![]()

Запишем Уравнения Лагранжа второго рода, относительно обобщенных координат X, Y, и, шi, j :
(1) 

Введем безразмерные координаты и время: ![]()
. Тогда система (1) перепишется в виде:
(2) 

Где введены безразмерные параметры:

Модель соударения шариков АБУ
a) |
|
б) |
|
в) |
|
Рис. 3 |
В качестве модели взаимодействия шариков АБУ между собой возьмем модель абсолютно упругого удара. Рассмотрим ее на примере одновременного соударения трех шаров одинаковой массы и радиуса, движущихся по кольцеобразной полости. Примем допущение, что радиусы шариков много меньше радиуса окружности, по которой они движутся. В момент времени, предшествующий удару, скорости шариков ш1, ш3 направлены как показано на Рис. 3,a, скорость шарика ш2 равна 0. Непосредственно в момент удара скорости всех шариков равны 0 (Рис.3 б). После удара, согласно закону сохранения количества движения и принятому допущению о размерах шаров, скорость шарика ш1 станет равна скорости шарика ш3 до удара, для и наоборот, а скорость шарика ш2 не изменится (Рис.3 в). Аналогично рассматриваем соударение для произвольного числа шаров.
Алгоритм построения движения ротора с учетом взаимодействия шариков АБУ
е – точность вычислений;![]()
– начальные значения;
Для того, чтобы воспользоваться методом интегрирования Рунге-Кутта приведем систему (2) к системе дифференциальных уравнений первого порядка. Для этого сделаем замену:
![]()
С учетом введенных обозначений получаем систему N+6 дифференциальных уравнений.

Эта система линейна относительно производных и автономна, значит ее можно привести к виду:
![]()
Где z – вектор состояния:
![]()
![]()
Обозначим за K(z, h) функцию приращения вектора состояния за один шаг h по времени:
![]()
Схема алгоритма построения движения ротора с АБУ

Вычисления m-го вектора состояния
![]()
Проверка точности вычислений.
В случае если, ||zm-1 – zm|| > е, то уменьшаем шаг в два раза и повторяем пункт I Если же было найдено 10 значений zm-10…zm без изменения шага h, то увеличиваем его в два раза.
Расстояние между шариками АБУ.
Введем функцию минимального расстояния между шарами АБУ на m-м шаге интегрирования:

Если выполнено условие ![]()
, то произошел удар на промежутке между zm-1 и zm состоянием системы и надо перейти к пункту IV, иначе возвращаемся к пункту I.
Поиск точки столкновения
Если д(zm-1 , h) отрицательно, то ищем he такое, чтобы: |д(zm-1 , he)| < е. Как далее будет показано, ![]()
всегда положительна.
Так как ![]()
, и функция ![]()
непрерывна по ![]()
, то зафиксируем ![]()
и введем функцию ![]()
. Теперь можно воспользоваться численными методами для нахождения корня he уравнения:
(3) 

Например можно воспользоваться методом хорд, описанным в [].
При нахождения корня he по этому методу попутно получаем h1 , h2:
![]()
Обработка данных после нахождения точки столкновения
Имеем: h1 , he, h2 из предыдущего пункта, zm-1 – предыдущее состояние системы.
Вычисляем по методу Рунге-Кутта следующие три вектора состояния, соответственно: до удара, во время удара, после удара:

Здесь ![]()
полностью соответствует вектору zm+1 , только у него изменены скорости шариков, участвующих в столкновении согласно введённой модели соударения шаров для движения после удара. После вычисления ![]()
меняем скорости соответствующих шариков на ноль в векторе zm+1 .
На данном этапе возможны случаи, при которых ![]()
, тогда координаты шаров, участвующих в соударении и соседних к ним, вернем к значениям, соответствующим состоянию zm так, чтобы расстояния между всеми шарами были положительны.
Теперь меняем шаг итерации h на (he - h1) , это значительно ускоряет вычисления, в случае когда шарики в АБУ начинают тереться друг о друга (когда скорости сталкивающихся шаров близки). После чего возвращаемся к пункту I
Примеры расчетов движения ротора с многополостным АБУ
1). Автобалансировка ротора с трехполостным АБУ с 9 шариками при отсутствии соударений.
Рассмотрим ротор с трехполостным АБУ при следующих параметрах:
Параметры системы: M=1; Jc=0.01; с = 7800; c=20; d=0.5; f=0.02; Mвр = 500; k=0.00002; Щ = 447; Rmax=0.1; Rmin=0.01; N=3; n1=2; n2=3; n3=4; у=2.
Все начальные скорости равны нулю, начальное положение как на Рис. 4
| |
a). |
|
б). |
|
в). |
|
г). |
|
Рис. 5 a). График движения шариков в первой полости; б). График движения шариков во второй полости; в). График движения шариков в третьей полости; г). График амплитуды прецессионных колебаний. |
Из графиков видно, что результаты расчетов, полученные по модели учитывающей взаимодействия шариков, при отсутствии соударений, полностью согласуется с результатами расчетов по модели не учитывающей взаимодействия.
2) Автобалансировка однополостного АБУ с 2 шариками при наличии соударения
Рассмотрим ротор с двухшариковым АБУ при следующих параметрах:
M=1; Jc=0.01; с = 7800; c=20; d=0.5; f=0.02; Mвр = 500; k=0.00002; Щ = 447; Rmax=0.1; Rmin=0.01; N=1; n1=2; у=2.
Все начальные скорости равны нулю, начальное положение как на Рис. 6

Рис.6 Начальное положение
а) |
|
б) |
|
Рис. 7 Графики движения шариков | |
| |
|
|
Рис.8 Амплитуда прецессионного движения ротора. |
По графикам (Рис. 7, 8) видно, что взаимодействие шариков между собой влияет на траектории движения шариков в АБУ и на амплитуду прецессионного колебания ротора.
3) Автобалансировка двуполостного АБУ с 8 шариками при наличии соударения
Рассмотрим ротор с двуполостным АБУ при следующих параметрах:
M=1; Jc=0.01; с = 7800; c=20; d=0.5; f=0.02; Mвр = 500; k=0.00002; Щ = 447; Rmax=0.1; Rmin=0.01; N=2; n1=6; n2=2; у=2.
Все начальные скорости равны нулю, начальное положение как на Рис. 9

Рис. 9 Начальное положение

Рис.10 Движение шариков в первой полости.

Рис. 11 Амплитуда прецессионных колебаний.
Табл.1 | |
По модели при учете взаимодействия шариков | По модели без учета взаимодействия шариков |
|
|
Как видно взаимодействие шариков между собой влияет не только на траектории движения шариков и амплитуду колебаний, но и на конечное положение шаров внутри АБУ после стабилизации ротора
Вывод
В ходе работы был построен алгоритм численного интегрирования системы, описывающей динамику ротора, оснащённого многополостным, многошариковым автобалансировочным устройством с учетом взаимодействия шариков между собой. Получены численные и графические результаты, анализ которых дает возможность утверждать, что взаимодействие шариков между собой внутри АБУ слабо влияет на прецессионные колебания ротора, и при этом не увеличивает время автобалансировки.
Список литературы
1). Bykov V. G. Kovachev A. S. Dynamics of a rotor with an eccentric ball auto-balancing device. // Vestnik St. Petersburg University: Mathematics 2014.Vol 47(4) P. 173–180
2). Dimentberg F. M. Shatalov K. T. Gusarov A. A. Oscillation of machines. Moscow: Mechanical engineering. 1964 year.[In Russian]
3). Dimentberg F. M. Bending vibrations of rotating shafts. Moscow. Acad. 1959.[In Russian]
4). Genta G. Dynamics of Rotating Systems. Springer Science 2005
5).J Chung, I Jang Dynamic response and stability analysis of an automatic ball balancer for a flexible rotor. // Journal of Sound and Vibration, 2003. Vol. 1(259) P. 31-43
6). L. Sperling, B. Ryzhik, H. Duckstein Single-Plane Auto-Balancing of Rigid Rotors// Techniche mechanic, band 24, Heft 1,(2004), 1-24
7) D. J. Rodrigues a, A. R. Champneys a,, M. I. Friswell b, R. E. Wilson, Experimental investigation of a single-plane automatic balancing mechanism for a rigid rotor// Journal of Sound and Vibration 330 (2011) 385–403
8). CТАЦИОНАРНЫЕ РЕЖИМЫ ДВИЖЕНИЯ НЕУРАВНОВЕШЕННОГО РОТОРА C АВТОБАЛАНСИРОВОЧНЫМ МЕХАНИЗМОМ // Вестник СПбГУ. Сер. 1, 2006, вып. 2
Приложение 1. Код программы
Rotor parameters
(*Disk parameters*)
M=1; (*Disk weight*)
h=0.002; (*Disk thicness*)
с0=7800; (*Disk density*)
Rd=Sqrt[M/(Pi с0 h)]; (*Disk radius*)
Jc = M Rd^2/2; (*Disk moment of inertia*)
radI=Sqrt[Jc/M]; (*Disk radius of inertia*)
(*MBA parameters*)
n2 = 1; (*Amount of MBA radius*)
n = {8}; (*Amount of ball on each radius*)
N0=
;
Rmax=0.1; (*MBA maximum radius*)
Rmin=0.05; (*MBA minimum radius*)
r=Table[Rmin+(Rmax-Rmin)i/n2,{i,1,n2}]; (*List of MBA radius*)
s=0.005;
у=2;
с0b=7800; (*Ball density*)
m=у M s/
; (*Ball weight*)
radball = (3 m/(4 Pi с0b))^(1/3); (*Ball radius*)
For[j=1,j<=n2,j++,
If[2Pi/ArcSin[radball/r[[j]]]<n[[j]],
Print["---------------------------------- ALARM--------------------------------------------"];
Print["With ball radius = ",radball," you can't place ",n[j]," balls on radius №",j," = ",r[[j]]];
]
];
If[2radball>(Rmax-Rmin)/n2,
Print["---------------------------------- ALARM--------------------------------------------"];
Print["With ball radius = ",radball," you can't place ",n2," bag in autobalancer"];
];
c=20; (*внешнее сопротивление поперечному движению ротора*)
b=0.01; (* внутреннее трение в вале*)
d=0.5; (*внешнее сопротивление вращательному движению *)
f=0.02; (*сопротивление движению шариков*)
Mv=500; (*внешний вращающий момент, приложен к диску*)
k=2 10^5; (*коэф упругости вала*)
Щ=Sqrt[k/M];
(*Безразмерные параметры*)
ϵ=s/radI; м=m/M; с=Table[r[[i]]/radI,{i,1,n2}]; д=c/(M Щ); в=b/(M Щ); г=d/(M radI^2 Щ); ч=f/(m radI^2 Щ); к=Mv/(M radI^2 Щ^2); сball=radball/radI;
Equations of the system
(*Уравнения ротора*)
urn1 := (1+м
)x''[t]+(д+в)x'[t]+в и'[t]y[t]+x[t]-ϵ(и'[t]^2 Cos[и[t]]+и''[t]Sin[и[t]])-м
;
urn2 := (1+м
)y''[t]+(д+в)y'[t]-в и'[t]x[t]+y[t]-ϵ(и'[t]^2 Sin[и[t]]-и''[t]Cos[и[t]])-м
;
urn3 := и''[t]+г и'[t]+в(x'[t]y[t]-x[t]y'[t]+и'[t](x[t]^2+y[t]^2))-к-ϵ(x''[t] Sin[и[t]]-y''[t]Cos[и'[t]])-м ч
;
(*Уравнения шаров АБУ*)
urnbi_,j_:=ч шi, j'[t]+с[[i]](шi, j''[t]+и''[t])-с[[i]](x''[t]Sin[и[t]+шi, j[t]]-y''[t]Cos[и[t]+шi, j[t]]);
(*List of system coordinates*)
variables={x[t],y[t],и[t]};
variables2={};
For[j=1,j<=n2,j++,
variables2 = Join[variables2,Table[шj, i[t],{i, n[[j]]}]];
];
variables=Join[variables2,D[variables2,t],variables, D[variables, t]];
(*List of system equations*)
urn={urn1==0,urn2==0,urn3==0};
For[j=1,j<=n2,j++,
urn = Join[urn, Table[urnbj, i==0,{i, n[[j]]}]];
];
A={};
G1={};
G2={};
G3={};
G4={};
Clear[i, j];
For[i=1,i<=n2,i++,
G1=Join[G1,Table[Coefficient[urn1,шi, j''[t]],{j, n[[i]]}]];
G2=Join[G2,Table[Coefficient[urn2,шi, j''[t]],{j, n[[i]]}]];
G3=Join[G3,Table[Coefficient[urn3,шi, j''[t]],{j, n[[i]]}]];
];
G1=Join[G1,{Coefficient[urn1,x''[t]],Coefficient[urn1,y''[t]],Coefficient[urn1,и''[t]]}];
G2=Join[G2,{Coefficient[urn2,x''[t]],Coefficient[urn2,y''[t]],Coefficient[urn2,и''[t]]}];
G3=Join[G3,{Coefficient[urn3,x''[t]],Coefficient[urn3,y''[t]],Coefficient[urn3,и''[t]]}];
A=Join[{G1},{G2},{G3}];
For[i=1,i<=n2,i++,
For[j=1,j<=n[[i]],j++,
G4={};
For[num=1,num<=n2,num++,
G4=Join[G4,Table[Coefficient[urnbi, j,шnum, num2''[t]],{num2,n[[num]]}]];
];
G4=Join[G4,{Coefficient[urnbi, j,x''[t]],Coefficient[urnbi, j,y''[t]],Coefficient[urnbi, j,и''[t]]}];
A=Join[A,{G4}];
];
];
B={{urn1},{urn2},{urn3}};
For[i=1,i<=n2,i++, B=Join[B, Table[{urnbi, j},{j, n[[i]]}]]];
variab=Join[D[variables[[1;;Sum[n[[i]],{i, n2}]]],{t,2}],D[variables[[-3;;-1]],t]];
B=-Simplify[Expand[B-A. variab]];
nv=Length[variables];
function[cord_]:=Module[{urnl=A, urnr=B, sol, out, p,i, t1},
t1=SessionTime[];
For[i=1,i<=nv, i++,
urnl=urnl/.variables[[i]]->cord[[i]];
urnr=urnr/.variables[[i]]->cord[[i]];
];
sol=Transpose[LinearSolve[urnl, urnr]][[1]];
out=Join[Table[cord[[i+N0]],{i, N0}],Delete[sol,{{-1},{-2},{-3}}],{cord[[-3]],cord[[-2]],cord[[-1]]},{sol[[-3]],sol[[-2]],sol[[-1]]}];
(*Print["out = ",out];*)
tfunc=Join[tfunc,{SessionTime[]-t1}];
out
];
Initial Conditions
primarydisk={0,0,0,0,0,0};
primaryball={};
(*Ball initial position*)
For[i=1,i<=n2,i++,
For[j=1,j<=n[[i]],j++,
primaryball=Join[primaryball,{2 Pi j/n[[i]] }];
]
];
(*Ball initial speed*)
primaryball=Join[primaryball, Table[0,{i, Sum[n[[j]],{j, n2}]}]];
primary=Transpose[{Join[primaryball, primarydisk]}];
coord=primary;
Solution Constructor
Time=0.5*Щ;
coord=primary;
time={0};
step=0.1;
null=10^-5;
tk={};
tfunc={};
tdist={};
tspeed={};
tall={};
thit2={};
k5[time_,step_,y0_]:=Module[{k1,k2,k3,k4,t1},
t1=SessionTime[];
k1=step function[y0];
k2=step function[y0+k1/2];
k3=step function[y0+k2/2];
k4=step function[y0+k3];
tk=Join[tk,{SessionTime[]-t1}];
(k1+2 k2+2k3+k4)/6
];
distance[y_]:=Module[{dist, asin, i,j, p,nu, t1},
t1=SessionTime[];
dist={};
For[i=1,i<=n2,i++,
If[n[[i]]==1,
dist=Join[dist,{{
,100 null}}];
,
asin=2ArcSin[сball/с[[i]]];
nu=
;
dist=Join[dist, Table[{j+nu, y[[j+1+nu]]-y[[j+nu]]-asin},{j,1,n[[i]]-1}]];
dist=Join[dist,{{nu+n[[i]],y[[1+nu]]+2 Pi-y[[nu+n[[i]]]]-asin}}];
];
];
tdist=Join[tdist,{SessionTime[]-t1}];
dist
];
spdist[y_]:=Module[{sp, i,j, p,nu, t1},
t1=SessionTime[];
sp={};
For[i=1,i<=n2,i++,
If[n[[i]]==1,
sp=Join[sp,{{
,0}}];
,
nu=
;
sp=Join[sp, Table[{j+nu, Abs[y[[j+1+nu]]-y[[j+nu]]]},{j,1,n[[i]]-1}]];
sp=Join[sp,{{nu+n[[i]],Abs[y[[1+nu]]-y[[nu+n[[i]]]]]}}];
];
];
tspeed=Join[tspeed,{SessionTime[]-t1}];
sp
];
hit1[y_]:=Module[{dist=Abs[y],i},
For[i=1,i<=Length[dist],i++,
If[dist[[i,2]]>null, dist[[i,2]]=0,dist[[i,2]]=1]
];
dist
];
hit2[y_]:=Module[{hit, u=y, i,j, p,T, b,flag, k,t1},
t1=SessionTime[];
hit={{}};
For[i=1,i<=n2,i++,
If[n[[i]]!=1,
p=y[[1+
;;
,All]];
T=Table[If[ Mod[k, n[[i]]]==j-1,1,0],{k, n[[i]]},{j, n[[i]]}];
While[p[[1,2]]!=0,
p=T. p;
];
b={};
flag=False;
For[j=1,j<=n[[i]],j++,
If[p[[j,2]]==1,
b=Join[b,{p[[j,1]]}];
flag=True;
,
If[flag,
b=Join[b,{Mod[b[[-1]]+1-
,n[[i]],1]+
}];
hit=Join[hit,{b}];
b={};
flag=False;
];
];
];
If[flag,
b=Join[b,{Mod[b[[-1]]+1-
,n[[i]],1]+
}];
hit=Join[hit,{b}];
b={};
flag=False;
];
];
];
hit=Delete[hit,1];
thit2=Join[thit2,{SessionTime[]-t1}];
hit
];
tstart=SessionTime[];
Print["Session Time = ",Dynamic[SessionTime[]-tstart, UpdateInterval->2]];
Print["Iteration time = ", Dynamic[time[[-1]],UpdateInterval->5]];
Print["pop = ", Dynamic[pop, UpdateInterval->5]];
Print["step = ", Dynamic[step, UpdateInterval->5]];
Print["posmin = ", Dynamic[posmin, UpdateInterval->5]];
Print["spmin = ", Dynamic[spmin, UpdateInterval->5]];
Print["h1 = ", Dynamic[h1,UpdateInterval->5]];
Print["h2 = ", Dynamic[h2,UpdateInterval->5]];
Print["he = ", Dynamic[he, UpdateInterval->5]];
Print["e = ", Dynamic[e, UpdateInterval->5]];
(*Print["min1 = ", Dynamic[Min[distance[yhit1[[1;;N0]]]],UpdateInterval5]];
Print["min3 = ", Dynamic[Min[distance[yhit3[[1;;N0]]]],UpdateInterval5]];*)
pop=0;
pop2=0;
nstep=1;
root={};
While[time[[-1]]<=Time,
t2=SessionTime[];
ynext=coord[[All,-1]]+k5[time[[-1]],step, coord[[All,-1]]];
(*Print["ynext= ",ynext];
Print["step= ",step];*)
flag1=True;
While[flag1,
y1=coord[[All,-1]]+k5[time[[-1]],step/2,coord[[All,-1]]];
y2 =y1+k5[time[[-1]],step/2,y1];
If[Norm[ynext-y2](*+Norm[distance[ynext[[1;;N0]]][[All,2]]-distance[y2[[1;;N0]]][[All,2]]]+Norm[spdist[ynext[[1+N0;;2N0]]][[All,2]]-spdist[y2[[1+N0;;2N0]]][[All,2]]]*)<null,
flag1=False;
,
ynext=y1;
step=step/2;
nstep=0;
];
];
(*Print["disnatce1 ",distance[coord[[All,-1]]+k5[time[[-1]],step, coord[[All,-1]]]]];*)
dball=distance[ynext[[1;;N0]]];
e=Min[dball[[All,2]]];
If[e<0,
h1=0;
h2=step;
yhit2=ynext;
While[(Abs[e]>=null),
yhit1=coord[[All,-1]]+k5[time[[-1]],h1,coord[[All,-1]]];
yhit3=coord[[All,-1]]+k5[time[[-1]],h2,coord[[All,-1]]];
pop++;
hx=h1-(h2-h1)Min[distance[yhit1[[1;;N0]]][[All,2]]]/(Min[distance[yhit3[[1;;N0]]][[All,2]]]-Min[distance[yhit1[[1;;N0]]][[All,2]]]);
he=hx-h1;
yhit2=coord[[All,-1]]+k5[time[[-1]],h1+he, coord[[All,-1]]];
dball=distance[yhit2[[1;;N0]]];
e=Min[dball[[All,2]]];
posmin=Position[dball[[All,2]],e][[1,1]];
spmin=spdist[yhit2[[1+N0;;2N0]]][[posmin,2]];
If[e>0,
h1=h1+he;
,
h2=h1+he;
];
];
If[e>0,
h1=h1-he;
,
h2=h1-he;
];
h1ball=hit1[dball];
h2ball=hit2[h1ball];
(*yhit1 - точка перед соударением, но очень близкая к нему. Скорости как до соударения*)
yhit1=coord[[All,-1]]+k5[time[[-1]],h1,coord[[All,-1]]];
If[Min[distance[yhit2[[1;;
]]][[All,2]]]<=0,
For[i=1,i<=Length[h2ball],i++,
For[j=1,j<=Length[h2ball[[i]]],j++,
yhit2[[h2ball[[i, j]]]]=yhit1[[h2ball[[i, j]]]];
];
];
];
If[Min[distance[yhit2[[1;;N0]]][[All,2]]]<=0,
For[i=1,i<=N0,i++,
yhit2[[i]]=yhit1[[i]];
];
];
newy=yhit2;
For[i=1,i<=Length[h2ball],i++,
For[j=1,j<=Length[h2ball[[i]]],j++,
newy[[h2ball[[i, j]]+N0]]=yhit2[[h2ball[[i,-j]]+N0]];
];
];
(*yhit3 - точка после соударения, но очень близкая к нему. В ней уже измененные скорости.*)
yhit3=newy+k5[time[[-1]],he, newy];
If[Min[distance[yhit3[[1;;
]]][[All,2]]]<=0,
For[i=1,i<=Length[h2ball],i++,
For[j=1,j<=Length[h2ball[[i]]],j++,
yhit3[[h2ball[[i, j]]]]=newy[[h2ball[[i, j]]]];
];
];
];
If[Min[distance[yhit3[[1;;N0]]][[All,2]]]<=0,
For[i=1,i<=N0,i++,
yhit3[[i]]=newy[[i]];
];
];
(* yhit2 - точка в момент соударения. Скорости соударяющихся шаров равны нулю.*)
For[i=1,i<=Length[h2ball],i++,
For[j=1,j<=Length[h2ball[[i]]],j++,
yhit2[[h2ball[[i, j]]+Sum[n[[k]],{k,1,n2}]]]=0;
(*Print[h2ball[[i, j]]+Sum[n[[k]],{k,1,n2}]];*)
];
];
If[h1!=0,
coord=Join[coord, Transpose[{yhit1}],2];
time=Join[time,{time[[-1]]+h1}];
];
coord=Join[coord, Transpose[{yhit2}],2];
time=Join[time,{time[[-1]]+he}];
root=Join[root,{time[[-1]]}];
coord=Join[coord, Transpose[{yhit3}],2];
time=Join[time,{time[[-1]]+he}];
step=h1+he;
,
coord=Join[coord, Transpose[{ynext}],2];
time=Join[time,{time[[-1]]+step}];
If[(nstep==10),step=2 step;pop2++; nstep=0; , nstep++];
(*Print[time];*)
];
tall=Join[tall,{SessionTime[]-t2}];
];
Print["Work Time1 = ", SessionTime[]-tstart]
f1={};
f2={};
f3={};
For[i=1,i<=Length[time],i++,
f1=Join[f1,{{{time[[i]]},coord[[-6,i]],coord[[-3,i]]}}];
f2=Join[f2,{{{time[[i]]},coord[[-5,i]],coord[[-2,i]]}}];
f3=Join[f3,{{{time[[i]]},coord[[-4,i]],coord[[-1,i]]}}];
];
Solution={{x->Interpolation[f1],y->Interpolation[f2],и->Interpolation[f3]}};
f4={};
N0=
;
For[j=1,j<=n2,j++,
N1=
;
For[j2=1,j2<=n[[j]],j2++,
f4={};
For[i=1,i<=Length[time],i++,
f4=Join[f4,{{{time[[i]]},coord[[j2+N1,i]],coord[[j2+N1+N0,i]]}}];
];
Solution={Join[Solution[[1]],{шj, j2->Interpolation[f4]}]};
];
];
Print["Hit Number = ",Length[root]];
Solution=Solution[[1]]
Print["Work Time2 = ", SessionTime[]-tstart]



















