from math import *

test=True

G=6.67e-11 #Постоянная
#Луна
M=7.3477e22
R=1737e3
def integrate_kolenka(m1,h1,v1,dm,t1,U,*,N=100000,M=7.3477e22,R=1737e3):
    #                                             Параметры Луны по умолчанию вобью
    #dm - масса топлив
    #t1 - время сгорания
    #U - скорость истечения газов

    h=h1
    v=v1
    for c in range(N):
        t=t1*c/N
        dt=t1/N
        ev=U*dm/(m1*t1-t*dm)-G*M/(R+h)**2
        eh=v
        v+=ev*dt
        h+=eh*dt
        #if (c==0):
        #    print(f'{ev=} {dt=}')
        if h<0: #Если ракета не взлетает
            h=0
            if (v>1):#Если слишком жёсткое падение
                print(f"Ракета упала со скоростью {abs(v):.2f}")
            v=max(v,0)
    v2=v
    h2=h
    return h2,v2,m1-dm

if test:
    print("-----------------------------")
    #Проверим интегратор в невесомости с помощью формулы Цилковского про дельту
    m=10000
    v1=0
    h1=0
    h2,v2,m2=integrate_kolenka(m,h1,v1,dm=7000,t1=20,U=800,M=0)
    v_c2=800*log(10000/3000)
    print(f'{h2=:.1f} {v2=:.3f} {m2=:.1f}     Цикловкский: v={v_c2:.3f}')
    
    h3,v3,m3=integrate_kolenka(m2,h2,v2,dm=2000,t1=20,U=1200,M=0)
    v_c3=v_c2+1200*log(3000/1000)
    print(f'{h3=:.1f} {v3=:.3f} {m3=:.1f}     Цикловкский: v={v_c3:.3f}')
    
    # Выводит это:
    # h2=7744.0 v2=963.172 m2=3000.0     Цикловкский: v=963.178
    # h3=37824.0 v3=2281.498 m3=1000.0     Цикловкский: v=2281.513
    # Что меня вполне устраивает







def max_h(h,v):
    e=v**2/2 #Энергия кинетическая
    e_h_max= G*M*(1/R)
    if e>e_h_max:
        # 2*e=v**2
        v=((e-e_h_max)*2)**0.5
        return f"Улетит на бесконечность со скорость {v:.1f}"
    else:
        if (v):
            h_max=(R+h)/((2*G*M/((R+h)*v**2))-1)
            return f"Улетит на высоту {h_max:.1f}"
        else:
            return f"Будет падать с высоты {h:.1f}"


if test:
    print("-----------------------------")
    #Проверю формулу
    for v in [1,10,100,1000,2350,2400,6000]:
        #2380 - вторая космическая на луне
        g=M*G/R/R #Ускорение свободного падения на луне
        h_max=v*v/(2*g) #Высота при постоянно g
        print(f'{v=:.1f}   {max_h(0,v)}   по формуле: {h_max:.1f}')
    print(f'Остаток скорости при 6000:  {(6000**2-2380**2)**0.5:.1f}')
    
    """   Вывод
    v=1.0   Улетит на высоту 0.3   по формуле: 0.3
    v=10.0   Улетит на высоту 30.8   по формуле: 30.8
    v=100.0   Улетит на высоту 3083.6   по формуле: 3078.2
    v=1000.0   Улетит на высоту 374114.3   по формуле: 307816.9
    v=2350.0   Улетит на высоту 79629015.7   по формуле: 1699918.6
    v=2400.0   Улетит на бесконечность со скорость 342.1   по формуле: 1773025.1
    v=6000.0   Улетит на бесконечность со скорость 5509.7   по формуле: 11081406.6
    Остаток скорости при 6000:  5507.8"""
    
    # Вроде верно, на низких высотах совпадает, при приближении ко второй космической
    #  высота сильно отклоняется, а потом уходит на бесконечность



if test:
    print("-----------------------------")
    #Проверим мою гипотезу, что время сгорания существенно для итогового результата
    m=10000
    v1=0
    h1=0
    for t in [1,10,100,980,1000,1020,10000]:
        h2,v2,m2=integrate_kolenka(m,h1,v1,dm=7000,t1=t,U=800)
        print(f'Сгорание за {t:5} секунд:   {h2= :7.1f}   {v2= :7.3f}  {m2= :7.1f}      {max_h(h2,v2)}')
    
    
    """ У меня выводит такое
    Сгорание за     1 секунд:   h2=   386.4   v2= 961.548  m2=  3000.0      Улетит на высоту 340533.2
    Сгорание за    10 секунд:   h2=  3790.9   v2= 946.950  m2=  3000.0      Улетит на высоту 329742.9
    Сгорание за   100 секунд:   h2= 30637.5   v2= 802.396  m2=  3000.0      Улетит на высоту 232197.6
    Сгорание за   980 секунд:   h2=   226.5   v2=   9.633  m2=  3000.0      Улетит на высоту 28.6
    Сгорание за  1000 секунд:   h2=   153.8   v2=   7.391  m2=  3000.0      Улетит на высоту 16.8
    Сгорание за  1020 секунд:   h2=    98.9   v2=   5.470  m2=  3000.0      Улетит на высоту 9.2
    Сгорание за 10000 секунд:   h2=     0.0   v2=   0.000  m2=  3000.0      Будет падать с высоты 0.0"""
    
    #При сгорании за 1-10 секунд ничего не меняется, при 100 скорость меньше, но успевает набраться высота
    #При сгорании за 1000 секунд едва отрывается (это случайно получилось,
    #                                             что при таких параметрах оно едва-едва отрывается)
    #При сгорании за 10000 секунд не взлетает

