将差异与时间相关的参数集成在一起

时间:2015-01-22 23:45:51

标签: python math numpy scipy time-series

我一直试图从微分方程中得到一个实际的(起始数据值+积分(0-t)结果)值。等式的论证都是时间依赖的。以下是这样一个等式的例子:

dx/dt = a + sin(b) + ln(c) + 5*x 

我尝试使用以下代码将等式与scipy.integrate.ode进行整合:

startValue = 3.5
timeEnd = 4
variables = { 'a': 3.24, 
              'b': 4.56, 
              'c': 2.1, 
              'x': 3.77 }
def computeValue(startValue, timeEnd, variables):

    r = integrate.ode(computeDifferential).set_integrator('vode', method='bdf')
    r.set_initial_value(startValue)
    r.set_f_params(variables)

    tStart = 0.0
    tStep = 1
    tFinal = timeEnd 
    numSteps = int(numpy.floor((tFinal - tStart)/tStep)) + 1
    t = numpy.zeros((numSteps, ))

    k = 1
    results = numpy.empty((numSteps, ))
    while r.successful() and k < numSteps:
        r.integrate(r.t + tStep)
        t[k] = r.t
        results[k] = r.y[0]
        k += 1

    return results

def computeDifferential(t, x, args):
    return args['a'] + sin(args['b']) + ln(args['c']) + 5*x

其中startValue是时间序列数据的起始值,timeEnd是我想要整合的数据行(如果数据以1的时间步长收集,那么5的时间结束将是第5行数据),variables包含第五行数据,包括x变量。

因为变量t没有用于计算这个特定的方程例子,我正在努力获得一些明智的结果。我认为我的整个数学可能都是错误的。

我想要实现的是从0到t的整合(其中t是行偏移,假设我的数据的时间步长为1)dx / dt

我的问题是我无法理解我是否应该根据时间更改所有变量并假设从0到5的积分我将需要来自我的数据的0-5个数据行。

我意识到这个问题可能有很多不清楚的地方,但我会在问题出现时尽力清理。

编辑1:所以微分方程可能不同,所以我要寻找的解决方案应该是通用的,因此函数computeDifferential()。

1 个答案:

答案 0 :(得分:0)

如果性能不是最重要的,你可以使用Euler forward的实现来计算积分。

steps = 10;
tMin = 0;
tMax = 5;
dt = (tMax-tMin)/steps
timeValues = [dt*i for i in range(steps)]
aValues = [aFunc(t) for t in timeValues]
bValues = [bFunc(t) for t in timeValues]
cValues = [cFunc(t) for t in timeValues]
xValues = [xFunc(t) for t in timeValues]

sinValues = [math.sin(b) for b in bValues]
lnValues = [math.log(c) for c in cValues]
xMultiValues = [5*x for x in xValues]

aIntegral = sum([aVal*dt for aVal in aValues])
sinIntegral = sum([bVal*dt for bVal in sinValues])
lnIntegral = sum([cVal*dt for cVal in lnValues])
xIntegral = sum([xVal*dt for xVal in xMultiValues])

totIntegral = aIntegral + sinIntegral + lnIntegral + xIntegral

当然,有更好的数字整合方法,例如使用Runge-Kutta 4或其他方法>1。我也相当确定有更有效的方法来使用numpy创建值数组。