【发布时间】:2018-04-22 09:48:58
【问题描述】:
当时间限制非常大时,我在使用 odeint 解决分段 odes 时遇到了一些麻烦。我在这里包含了一个极简主义的例子:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
t0 = 1.5e+21
t_end = 4.4e+23
t= np.linspace(t0,t_end,10000)
def DMonly(y,tt):
return 1. if tt>=(t0+t_end)/2. else 0.
plt.semilogx(t,odeint(DMonly,0.,t),marker='.')
plt.show()
前半部分的解决方案应该是 y=0,然后在后半部分线性增加,但我总是得到 y=0,就像在这个 plot 中一样。
如果我遇到完全相同的问题,但现在 t0 和 t_end 的值不同:
t2= np.linspace(1.,100.,10000)
def DMonly2(y,tt):
return 1. if tt>=(1.+100.)/2. else 0.
plt.plot(t2,odeint(DMonly2,0.,t2),marker='.')
plt.xlabel('t')
plt.ylabel('y(t)')
plt.show()
现在解决方案的表现与plot 一样。
【问题讨论】:
-
也许可以尝试将
t0和t_end的大值直接放入测试中,看看是这些值造成问题还是其他原因? (就像你在第二个例子中所做的那样)