我正在解决使时间和空间离散化的某些偏微分方程,为了避免复杂性,我避免了这种事情,只是考虑我使用称为“计算”的函数以迭代方式解决了问题。关键是我想获取(并存储在名为“ 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
有人知道该怎么做吗?我当时想也许可以通过两个循环来解决此问题,但是我想知道是否有可能使用更有效的方法。谢谢! (我希望我的问题很清楚,否则请告诉我)
答案 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
整除时,即t
是1
时,t
才会保存
同样,如果您还有其他条件想要只保存1.000, 2.000...
,则只需以一种可以计算的方式检查该条件即可。如果不是,则静态y
或list
也是可行的选择。