我一直试图从微分方程中得到一个实际的(起始数据值+积分(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()。
答案 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创建值数组。