1 / 4
Feb 2015

Fajnie, że ta słabość wyszła w praktyce i popieram zmianę testów. Trochę się zapomniałem wczoraj (i dzisiaj też przy pierwszych submitach), ale teraz wydaje mi się, że zrobiłem zadanie poprawnie. Mam tylko drobną uwagę: można by dopisać, że tablica na wejściu jest kwadratowa, bo przy prosotkątnej sytuacja się komplikuje i jeśli dałbyś teraz na wejściu taką, to mój program się wysypie, a nawet jakbym go poprawił, to nie wiem za bardzo co wypisać, bo wektor będzie rozwiązaniem? Skoro tak, to może być on pionowy lub poziomy - jakie elementy najpierw? Jak widać dużo dodatkowej roboty i jest to trochę odstraszające (przynajmniej byłoby dla mnie).

  • created

    Feb '15
  • last reply

    Jul '22
  • 3

    replies

  • 571

    views

  • 4

    users

  • 2

    likes

  • 1

    link

Ok, to przenoszę pytanie na forum.

Czy to są wartości z chwili t=280? Myślałem, że wtedy masa rakiety do dokładnie 40. I odłamki dzielą się na 100 * 0.4.
Dlaczego m1 miałoby być wtedy niezerowe, albo ujemne, co by świadczyło, że rakieta spala więcej niż ma paliwa?

Tak, to są wartości między etapem spadku a eksplozji. Kod poniżej obejmuje dwa pierwsze etapy (wznoszenie i opadanie). W każdym kroku albo (1) silnik jest włączony zużywając 0.01 masy paliwa albo (2) jest wyłączony nie zużywając paliwa. Błędy zmiennoprzecinkowe dają niedokładne wartości. m1 to masa paliwa, m0 to całkowita masa rakiety. n* to tymczasowe zmienne.

Czy to co piszę ma sens?

[bbone=python,2381]
for t in arange(t0, t2, step):
if m1 > 0:
nm0 = m0 - step
nm1 = m1 - step
f = grav + Fa*v + thrust
else:
nm0 = m0
nm1 = m1
f = grav + Fa*v

nv = v + f*(step/m0)
np = p + v*step

p,v,m0,m1 = np,nv,nm0,nm1[/bbone]
7 years later

Dla wszystkich, którzy spróbują kiedyś w przyszłości rozwiązać to trudne, ale ciekawe zadanie, zostawiam kilka uwag, które (mam nadzieję) trochę to ułatwią:

  • "pozioma pozycja odłamków"
    Pozioma pozycja odłamków oznacza pozycję na osi OX, czyli współrzędne x.

  • "Pozioma pozycja odłamka jest zaokrąglana do liczby całkowitej przed porównaniem z wysokością terenu."
    Tutaj brakuje kluczowego słowa: najbliższej. Rzutowanie należy wykonać metodą round, a nie po prostu rzutować na liczbę całkowitą.
    Powyższa procedura obowiązuje za każdym razem, jeśli musimy porównać współrzędną x z powierzchnią ziemi. Obliczając obszar pokryty odłamkami musimy zaokrąglić (round) współrzędne x odłamków, a dopiero potem szukać, które odcinki terenu są w ich obszarze.

  • "Jednocześnie oddziałuje też siła grawitacji Fg."
    Pomimo, że w danych przykładowych siła Fg ma wartość 9.81, to jest to cały czas siła działająca na obiekt, a nie przyśpieszenie. Jest to istotne we wzorach, które należy zastosować.

  • W treści zadania brakuje obrazka, który zawierał potrzebne wzory. Jedyny istotny wzór, który trzeba znać i zastosować, to F = m*a

Dodatkowe uwagi:

  • testuj swój program na ideone. Dzięki temu łatwiej wyłapać runtime errory
  • jeśli Twój program wykonuje się około 2 sekund na danych przykładowych, a po wysłaniu dostajesz TLE, to wyślij go jeszcze raz. W zależności od klastra jaki zostanie przydzielony, program działa szybciej lub wolniej.
  • nie bez powodu jesteśmy zachęceni, żeby korzystać z NumPy :wink:

Powodzenia

Edit. Poniżej symulacja Symulacji