我正在使用scipy.solve_ivp求解ode,我明确地定义了时间输出。我将数据和时间数组保存在文件中,然后在另一个程序中打开它以进行分析。因为我只保存部分数据以节省磁盘空间,所以我整个时间都重新创建了分析代码。这样做,使用相同的表达式,我最终会以时间步骤略有不同。这是由于浮点错误,其他一些伪像还是我重现时间数组的方式?

问题描述 投票:0回答:0
WHORE是一个函数,在下一个时间步骤(

omega_z = 422500*2*np.pi n_dt = 1000 # Resolution (number of time-steps for one omega_z period) dt = 2*math.pi/(n_dt*omega_z) # Time-step duration i_init = 2000 # number of periods n_init = n_dt*i_init # Number of time-steps in total time_simu = np.linspace(0,n_init*dt,n_init) sol = solve_ivp(derivs, t_span = [time_simu[0], time_simu[-1]], y0 = [2e-6,0], method='RK45', t_eval=time_simu, rtol = 1e-6) np.savez(filename, time_simu = time_simu[limits[0]:limits[1]], r_z = sol.y[0][limits[0]:limits[1]], v_z = sol.y[1][limits[0]:limits[1]])

)的情况下,在下一个时间步骤中计算

derivs

r_z

的衍生物。然后,我使用
v_z

保存
y0
,在某个地方定义了两个限制之间。请注意,我仅向您展示程序的一部分,下一步是在其他情况下求解其他41个其他时间段,这将使GB数据成为GB数据,因此我在

sol

循环中如此
np.savez
 +
solve_ivp()
。因此,时间数组从SIMU时间的0到末尾都不完整。
分析程序
i打开数据,检索
savez()
for
r_z
。我需要“填补时间阵列的空白”,以便相对于某些频率参考跟踪
v_z
time_simu
的相位。我重新创建时间阵列

r_z

TimeStep比较

然后,如果我比较了从数据阵列(
v_z
)获得的时间步骤与从分析代码(
omega_z = 422500*2*math.pi dt = 2*math.pi/(n_dt*omega_z) n_dt = 1000 i_init = 2000 n_init = n_dt*i_init time_secular = np.linspace(0,n_init*dt,n_init) # time_simu is the time imported from the data array
)获得的时间不同。
time_simu
输出
time_secular
discussion

所以差异是
2.8820544184511335e-19

,这太多了,无法成为linspace,a +或-1的缺失点,在i_init,linspace或其他任何时候。我以相同的顺序进行操作,以避免不同的浮点错误,但也许我缺少一些东西。

print(time_simu[2] - time_simu[1]) print(time_secular[2] - time_secular[1])

不能成为原因,因为它仅输出

2.366865088469783e-09
2.3668650887579883e-09
#          ^^^^^^^
2.8820544184511335e-19
,但是时间我直接将其从数组中保存。可以是
solve_ivp

Bro差异(2.8820544184511335E-19)仅仅是浮点算术的结果,而不是因为
x

v
甚至
np.savez

。即使您在代码的不同部分中使用相同的表达式,浮点表示的有限精度(以及执行除法和乘法之类的操作方式)也可以引入此类微小差异。

python arrays floating-point
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.