integrate.odeint给出了两个截然不同的答案

时间:2012-10-07 16:28:09

标签: python scipy ode

我有以下python MWE(代码在下面解释)

#!/usr/bin/python
from scipy import integrate
from math import *
import numpy
import matplotlib.pyplot as plt

def base_equations(y,t,center):
    return [5*exp(-(t-center)**2/3),-5*exp(-(t-center)**2/3)]

def eqexec1(y,t):
    return base_equations(y,t,30)

def eqexec2(y,t):
    return base_equations(y,t,60)

inits=[0.5, 0.5]

trange=numpy.arange(0,100,0.1)
print trange

y1=integrate.odeint(eqexec1,inits, trange, full_output=0, printmessg=1)
y2=integrate.odeint(eqexec2,inits, trange, full_output=0, printmessg=1)
plt.plot(trange,y1,trange,y2)
plt.legend(["y1a","y1b","y2a","y2b"])
plt.xlabel("Time")
plt.show()

正如您所看到的,我正在整合一组方程(base_equations),这些方程本质上是高斯脉冲。我使用odeint来数字地求解脉冲的两个中心点(30和60)的这些方程。

对于第一个中心点(t = 30),等式y1产生预期行为:脉冲可见。

对于第二个中心点(t = 60),等式y2产生意外行为:根本看不到脉冲!

工作与不工作之间的切换发生在47到48之间。

图形输出如下。预期的输出是线y2a和y2b将在60左右显示出显着的变化,但它们没有。

Image showing a single Gaussian pulse when there should be two.

有关可能发生的事情的任何想法?

1 个答案:

答案 0 :(得分:3)

积分器在导数消失的初始区域增加其步长,并且步长变得非常大,以至于它超过了从未看到它的高斯峰值。

您可以告诉集成商不要过多地增加步长:

y2 = integrate.odeint(eqexec2,inits, trange, full_output=0, printmessg=1,hmax=1.0)