当时间限制非常大时,我在使用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。
答案 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
我得到了
然后用这个值小于0:
t0 = 1500000
t_end = 440000000
我明白了: