Как записать каждый n-й расчет в массив внутри цикла for?(Python) - PullRequest
0 голосов
/ 20 октября 2018

Я запускаю симуляцию на python, которая включает в себя множество циклов.Поскольку мой ноутбук имеет ограниченную вычислительную мощность, я хочу записывать только каждый n-й результат в массив, в котором хранятся мои данные.Я посмотрел в Интернете о нарезке массивов, но смог найти способ сделать это только после того, как полноразмерный массив уже был создан.Цикл for приведен ниже:

    def Simulate(time, steps):

            history_x = np.zeros(2000000)
            history_y = np.zeros(2000000)

            for i in range(2000000):
                    #calculate positions
                    a_x = ((-6.67e-11)*(mE)/((x**2 + y**2)))
                    a_y = ((-6.67e-11)*(mE)/((x**2 + y**2)))
                    v_x = v_x + (delta_t)*a_x
                    v_y = v_y + (delta_t)*a_y
                    y = y + (delta_t)*v_y + ((delta_t)**2)*a_y*0.5
                    x = x + (delta_t)*v_x + ((delta_t)**2)*(a_x)*0.5

                    rocket_history_x[i] = x
                    rocket_history_y[i] = y

(x, y, v_x, v_y и mE все определены до цикла в моем коде, не хочу загромождать этот пост)

По сути, математика не важна, но я хочу, чтобы history_x и history_y сохраняли только каждый n-й расчет x и y.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Исходя из моего комментария выше, полный код будет выглядеть следующим образом.Здесь вы инициализируете два пустых списка вместо создания массива длиной 2000000. Затем вы просто сохраняете каждое n-е значение на основе условия if, заключая оператор append в операторы if.

def Simulate(time, steps):
    history_x, history_y = [[] for _ in range(2)] # initialize lists
    n = 10000
    for i in range(2000000):
        #calculate positions
        a_x = ((-6.67e-11)*(mE)/((x**2 + y**2)))
        a_y = ((-6.67e-11)*(mE)/((x**2 + y**2)))
        v_x = v_x + (delta_t)*a_x
        v_y = v_y + (delta_t)*a_y
        y = y + (delta_t)*v_y + ((delta_t)**2)*a_y*0.5
        x = x + (delta_t)*v_x + ((delta_t)**2)*(a_x)*0.5
        if i% n == 0: # Check for the step
            rocket_history_x.append(x) # store x here
            rocket_history_y.append(y) # store y here
0 голосов
/ 20 октября 2018

Вы можете сделать проверку, такую ​​как:

if i%n == 0:
...