首页 文章

具有分段函数的python odeint

提问于
浏览
0

当时间限制非常大时,我在使用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 回答

  • 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

相关问题