Возьмите и сохраните только некоторые конкретные значения внутри цикла while - PullRequest
0 голосов
/ 04 февраля 2019

Я решаю какое-то уравнение в частных производных, дискретизирующее время и пространство, чтобы избежать сложности, я избегаю этой вещи и просто считаю, что решаю проблему итеративным образом, используя функцию, которую я назвал «вычислением».Дело в том, что я хочу взять (и сохранить в некоторой матрице, называемой «Cn») некоторые значения, заданные «y» цикла «while», но без принятия всех значений итерации во времени.

Чтобы быть точным: я делаю цикл "в то время как" для эволюции времени, занимая некоторое время крутой DT.Я бегу от t = 1 до t = 100, используя dt = 0.001.Мое решение "у" рассчитывается для каждого крутого раза.Дело в том, что я хочу хранить «y» при некоторых конкретных значениях времени «t», а не при каждом крутом времени цикла, то есть, например, я хочу хранить значения при t = 1.0,2.0,3.0 ,..., 100.0 используя значения, которые я вычисляю внутри цикла while.Но я не хочу хранить значения "y" при t = 1.001,1.002,1.003 и т. Д.

Я покажу вам код, который я сделал

import numpy as np
import math
from matplotlib import pyplot as plt
import matplotlib.animation as animation



# grid in 1D
xmin = 0.0
xmax = 100.0
Nx = 120
dx = (xmax-xmin)/Nx
x = np.linspace(xmin,xmax,Nx)
# timing of the numerical simulation
t_initial = 1.0
t_final = 100.0
t = t_initial
dt = 10**(-2)
#initial profile
y = np.exp(-0.5*x**2)
#number of time points to store the numerical solution
dt_solution = 1.0 #time steep to save the numerical data inside the loop while
Nt = int((t_final-t_initial)/dt_solution)




def computation(t,y):
    return np.log(t)+y




Cn = np.zeros((Nt, len(x))) # holds the numerical solution
Cn[0,:] = y #we put the initial y
ite = 0
while t<t_final:


    t += dt #WE MAKE THE TIME STEEP
    ite +=1

    y = computation(t,y)

    #Cn[ite,:] = y #I WANT TO SAVE THE VECTOR Y FOR THE TIMES t THAT I AM INTERESTD, NOT THE ONES GIVEN INSIDE THE LOOP WHILE

Кто-то знает, каксделай это?Я думал, может быть, решить эту проблему с помощью двух циклов, но я хотел бы знать, возможно ли использовать более эффективный способ.Спасибо!(Я надеюсь, что мой вопрос ясен, если нет, пожалуйста, скажите мне)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать оператор по модулю .Этот оператор показывает остаток, когда одно число делится на другое.Например:

10%2 = 0 # 10 is exactly divisible by 2  
11%2 = 1 # 11 is divisible by 2 with remainder 1

Мы можем использовать это с условием if в цикле while.

#...

t = 0
dt=0.001 #timestep for iteration

# set the condition threshold
threshold = dt/10
# choose the step you want to save values at
store_step = 0.1

while t<100:
    t += dt
    y = computation(t,y)
    if (t%store_step<threshold) or (t%store_step>(store_step-threshold)):
       # store y values
       Cn[ite,:] = y

Примечание Если ваш временной шаг является целым числом, выможет использовать: if (t%1==0) как ваше состояние.

0 голосов
/ 04 февраля 2019

Добавьте это в ваш цикл while, в который вы хотите сохранить y:

if int(t % 1) == 0:
    Cn[ite,:] = y

Так что это сохраняет y, только когда t делится на 1, то есть t равно 1.000, 2.000...

Аналогично, если у вас есть другие условия, в которых вы хотите сохранить только y, просто проверьте это условие таким образом, чтобы его можно было вычислить.Если нет, то статический list или set также является приемлемым вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...