【发布时间】:2022-01-06 08:33:35
【问题描述】:
我想使用一个切换函数来集成一个简单的 ODE。切换函数将确保对于某些 t 值的梯度为零,并使梯度对于任何其他 t 值都是一个数值常数。
我可以通过使用虚拟状态获得所需的结果,但是当我对单个状态重复计算时,solve_ivp 的输出是不同的。我想了解为什么会这样。
这是重现结果的代码:
#==============================================================================
# import modules
#==============================================================================
from scipy.integrate import solve_ivp
from matplotlib import pyplot as plt
import numpy as np
#==============================================================================
# user defined functions
#==============================================================================
def ode_multi(t, y):
dy1_dt = 0 if t < 3 else 1
dy2_dt = 0 if t < 4 else 1
dy3_dt = dy1_dt - dy2_dt
return [dy1_dt, dy2_dt, dy3_dt]
def ode_single(t, y):
dy1_dt = 0 if t < 3 else 1
dy2_dt = 0 if t < 4 else 1
dy3_dt = dy1_dt - dy2_dt
return [dy3_dt]
#==============================================================================
# solve ode
#==============================================================================
sol_multi = solve_ivp(ode_multi, [0,6], [0,0,0], method='LSODA', t_eval = np.linspace(0,6,100))
sol_single = solve_ivp(ode_single, [0,6], [0], method='LSODA', t_eval = np.linspace(0,6,100))
plt.figure(1)
plt.plot(sol_multi.t, sol_multi.y[0], label='dy1_dt')
plt.plot(sol_multi.t, sol_multi.y[1], label='dy2_dt')
plt.plot(sol_multi.t, sol_multi.y[2], label='dy3_dt')
plt.legend(); plt.grid()
plt.figure(2)
plt.plot(sol_single.t, sol_single.y[0], label='dy3_dt')
plt.legend(); plt.grid()
我尝试在切换函数中使用 numpy.heaviside 而不是 if 语句,以确保渐变是可微的。输出是一样的,所以我在代码示例中使用了 if 语句来简化解释。
感谢您的意见!
【问题讨论】: