具有分段函数的python odeint

时间:2017-11-09 11:54:28

标签: python odeint

当时间限制非常大时,我在使用odeint解决分段颂歌时遇到了一些麻烦。我在这里列出了一个极简主义的例子:

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

1 个答案:

答案 0 :(得分:1)

我只是想提出一个问题,是否有可能其中一个库不支持大数字。

对于Python版本,我读了这个link,这解释了处理数字的Python非常好。但是有没有一个库不支持那些大数字?

更新:请看一下这个answer,尤其是迪特里希在Sympy的答案中提到的,也许这可以帮助更好;)

对不起......我不是数学方面的专家,但是从我做过的测试中我找到了这个,

这个号码

t0 = 1.5e+21
t_end = 4.4e+23

符合此条件

t0 = 1500000000000000000000
t_end = 440000000000000000000000

使用这样的值运行:

t0 = 15000000
t_end = 4400000000
我得到了 enter image description here

然后用这个值小于0:

t0 = 1500000
t_end = 440000000

我明白了:

enter image description here