微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.integrate.ode 放弃整合

如何解决scipy.integrate.ode 放弃整合

我在使用 scipy.integrate.ode 时遇到了一个奇怪的问题。这是一个最小的工作示例:

import sys
import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from scipy.integrate import ode,complex_ode

def fun(t):
    return np.exp( -t**2 / 2. )

def ode_fun(t,y):
    a,b = y
    f = fun(t)
    c = np.conjugate(b)
    dt_a = -2j*f*c + 2j*f*b
    dt_b = 1j*f*a
    return [dt_a,dt_b]

t_range = np.linspace(-10.,10.,10000)

init_cond = [-1,0]
trajectory = np.empty((len(t_range),len(init_cond)),dtype=np.complex128)

### setup ###
r = ode(ode_fun).set_integrator('zvode',method='adams',with_jacobian=False)
r.set_initial_value(init_cond,t_range[0])
dt = t_range[1] - t_range[0]

### integration ###
for i,t_i in enumerate(t_range):
    trajectory[i,:] = r.integrate(r.t+dt)

a_traj    = trajectory[:,0]
b_traj    = trajectory[:,1]
fun_traj  = fun(t_range)

### plot ###
plt.figure(figsize=(10,5))
plt.subplot(121,title='ODE solution')
plt.plot(t_range,np.real(a_traj))
plt.subplot(122,title='Input')
plt.plot(t_range,fun_traj)
plt.show()

代码工作正常,输出图为(ODE 明确依赖于输入变量,右侧面板显示输入,左侧面板显示一个变量的 ode 解)。

enter image description here

所以原则上我的代码是有效的。奇怪的是,如果我简单地替换积分范围

t_range = np.linspace(-10.,10000)

t_range = np.linspace(-20.,20.,10000)

我得到输出

enter image description here

所以不知何故,积分器只是放弃了积分,并将我的解决方案保留为常数。 为什么会这样?我该如何解决

我测试过的一些事情:这显然不是解决问题,集成步骤已经很小了。相反,似乎集成器在几步之后甚至不再打扰调用 ode 函数。我已经通过在 ode_fun() 中包含一个打印语句来测试这一点。

我目前的怀疑是积分器认为我的函数在最初的几个积分步骤中没有显着变化后是恒定的。我可能需要在某处设置一些容忍度吗?

感谢任何帮助!

解决方法

“我目前的怀疑是积分器在前几个积分步骤中没有显着变化后决定我的函数是恒定的。”您的怀疑是正确的。 ODE 求解器通常具有内部步长,该步长可根据求解器计算的误差估计进行自适应调整。这些步长与请求输出的时间无关;使用在内部步骤计算的点处的解插值来计算请求时间的输出。

当您在 t = -20 处启动求解器时,显然输入变化如此缓慢,以至于求解器的内部步长变得足够大,以至于当求解器接近 t = 0 时,求解器会直接跳过输入脉冲。

您可以使用 max_step 方法的选项 set_integrator 限制内部步长。如果我将 max_step 设置为 2.0(例如),

r = ode(ode_fun).set_integrator('zvode',method='adams',with_jacobian=False,max_step=2.0)

我得到了你期望的输出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。