在“ while”循环内仅获取并存储一些特定值

时间:2019-02-04 18:40:25

标签: python loops

我正在解决使时间和空间离散化的某些偏微分方程,为了避免复杂性,我避免了这种事情,只是考虑我使用称为“计算”的函数以迭代方式解决了问题。关键是我想获取(并存储在名为“ Cn”的某个矩阵中)“ while”循环的“ y”给定的某些值,但又不及时获取迭代的所有值。

准确地说:我正在“ while”循环进行时间演化,花费了一些时间。我正在使用dt = 0.001从t = 1到t = 100运行它。我的解“ y”是在每次陡峭时计算的。关键是我想在时间“ t”的某些特定值上存储“ y”,而不是在每次循环陡峭时都存储,例如,我想在t = 1.0,2.0,3.0,处存储值。 ..,100.0,使用我在while循环内计算的值。但是我不想在t = 1.001,1.002,1.003等处存储“ y”的值

我向您展示我的代码

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 :(得分:1)

您可以使用modulo operator。当一个数除以另一个时,此运算符显示余数。例如:

=SUMPRODUCT(($G$1:$G$6=T1)*LEFT($O$1:$O$6,SEARCH("p",$O$1:$O$6)-1))

我们可以将其与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 作为条件。

答案 1 :(得分:0)

将此添加到您要保存while的{​​{1}}循环中:

y

因此,仅当if int(t % 1) == 0: Cn[ite,:] = y y整除时,即t1时,t才会保存

同样,如果您还有其他条件想要只保存1.000, 2.000...,则只需以一种可以计算的方式检查该条件即可。如果不是,则静态ylist也是可行的选择。