【问题标题】:python odeint with a piecewise function具有分段函数的python odeint
【发布时间】: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 一样。

【问题讨论】:

  • 也许可以尝试将 t0t_end 的大值直接放入测试中,看看是这些值造成问题还是其他原因? (就像你在第二个例子中所做的那样)

标签: python odeint


【解决方案1】:

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

对于 Python 版本,我阅读了这个 link,它很好地解释了 Python 处理数字的方法。但是是否存在您的某个库不支持这些大数字的情况?

更新:也请看一下这个answer,尤其是Dietrich 在关于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

我明白了:

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2016-05-08
    • 2017-10-06
    • 2020-02-04
    • 2017-11-18
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多