使用odeint求解ODE时输出每步dt=0.01s的执行时间
解决方案:记录微分方程组每个时间步的执行时间
嘿,我来帮你搞定这个需求!原来的odeint是一次性完成所有时间点的积分计算,没办法直接获取每个时间步长(dt=0.01秒)对应的求解耗时。所以咱们换用scipy.integrate.ode类来实现步进式求解,这样就能精准捕捉每个t+dt步骤的执行时间了。
核心思路
- 使用
ode类初始化求解器,绑定你的微分方程模型 - 从初始时间开始,每次手动推进一个dt步长
- 每一步推进前后记录时间,计算并打印该步的执行耗时
- 同步保存每一步的状态结果,方便后续分析或绘图
完整代码实现
import numpy as np from scipy.integrate import ode import matplotlib.pyplot as plt import time from datetime import timedelta # 定义微分方程模型函数 def model(t, z): dxdt = z[1] dydt = -1.2*(z[0]+z[1]) + 0.2314*z[0] + 0.6918*z[1] - 0.6245*abs(z[0])*z[1] + 0.0095*abs(z[1])*z[1] + 0.0214*z[0]*z[0]*z[0] return [dxdt, dydt] # 初始化参数 dt = 0.01 # 时间步长 t_start = 0.0 # 初始时间 t_end = 10.0 # 总模拟时间(可根据需求调整) z0 = [0.1, 0.0] # 初始状态(可根据需求调整) # 初始化求解器 solver = ode(model) solver.set_integrator('dopri5') # 选择积分器,dopri5是odeint默认的龙格-库塔方法 solver.set_initial_value(z0, t_start) # 保存结果的数组 t_values = [t_start] z_values = [z0] execution_times = [] # 步进求解并记录时间 while solver.successful() and solver.t < t_end: # 记录当前步的开始时间 step_start_time = time.perf_counter() # 推进一个时间步长 solver.integrate(solver.t + dt) # 计算当前步的执行时间 step_elapsed_time = time.perf_counter() - step_start_time execution_times.append(step_elapsed_time) # 保存时间和状态 t_values.append(solver.t) z_values.append(solver.y) # 打印当前步的信息:时间点和执行时间 print(f"时间点 t = {solver.t:.2f} 秒,该步执行时间 = {step_elapsed_time:.6f} 秒") # 可选:将结果转换为numpy数组方便处理 t_values = np.array(t_values) z_values = np.array(z_values) execution_times = np.array(execution_times) # 可选:绘制状态变量随时间变化的曲线 plt.figure(figsize=(12, 6)) plt.subplot(2,1,1) plt.plot(t_values, z_values[:,0], label='x(t)') plt.plot(t_values, z_values[:,1], label='y(t)') plt.xlabel('时间 (秒)') plt.ylabel('状态值') plt.legend() plt.title('微分方程组状态变化') plt.subplot(2,1,2) plt.plot(t_values[1:], execution_times, label='每步执行时间') plt.xlabel('时间 (秒)') plt.ylabel('执行时间 (秒)') plt.legend() plt.title('每个时间步的求解执行时间') plt.tight_layout() plt.show()
关键细节说明
- 用
time.perf_counter()替代time.clock():time.clock()在Python 3.3+已被废弃,perf_counter()是更精准的性能计时函数 - 选择
dopri5积分器:这是odeint默认使用的积分器,保证和原代码的求解精度一致 - 每一步的执行时间是从开始推进到完成该步积分的耗时,完全对应你需要的
t+dt时间点的求解时间
内容的提问来源于stack exchange,提问作者user3397
相关产品推荐
相关产品推荐

