繁体   English   中英

将微分与时间相关的参数进行积分

[英]Integrating differential with time-dependent arguments

我一直在尝试从微分方程中获得实际的(起始数据值+ Integral(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是时间序列数据的timeEndtimeEnd是我要集成到的数据行(如果以1的时间步长收集数据,则5的时间结束将是数据的第5行), variables保存第五行数据,包括x变量。

因此,由于变量t不在方程的这个特定示例的计算中使用,因此我正在努力获得一些合理的结果。 我认为我的整个数学可能是错误的。

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

我的问题是我不明白是否应该根据时间更改所有变量,并假设要从0集成到5,我需要从数据中获取0-5个数据行。

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

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

如果性能不是最重要的,则可以使用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创建值数组的更有效方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM