You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:47:12