scipy.integrate.odeint每个时间步都会更新初始条件

时间:2018-10-23 23:10:12

标签: python scipy integration odeint

我正在使用scipy.integrate.odeint来解决给定系统的运动方程,并使用脚本从中选择与该特定问题最相关的部分:

# Equations of Motion function to integrate 
def solveEquationsofMotion(y0, t, nRigidBodies, nCoordinates, nConstraintsByType, dataConst, Phi, dPhidq, niu, gamma, massMatrix, gVector, alpha, beta, sda_Parameters):
    ...
    Some calculations 

    matA = numpy.array
    ...

    dydt = np.hstack((qp,qpp))
    return dydt

#Integrator results 
solution = odeint(solveEquationsofMotion, y0, time_span,args=(nRigidBodies, nCoordinates, nConstraintsByType, dataConst, Phi, dPhidq, niu, gamma, massMatrix, gVector, alpha, beta), full_output=0)

,效果很好。

但是,现在我需要在每个时间步中将部分积分结果( solution 变量)乘以matA变量,以再次用作下一个时间步的初始条件。

我已经查看了scipy.integrate.odeint文档,但没有看到任何相关信息。 任何帮助将不胜感激。

亲切问候

伊沃(Ivo)

1 个答案:

答案 0 :(得分:2)

如果必须在每个步骤中更改解决方案,则使用逐步集成器ode更为合乎逻辑。无论如何,它都应该在循环中使用,因此最好同时更改条件。这是一个求解y' = -sqrt(t)*y(向量值)的示例,其中y在每一步之后都乘以matA

t变量中的步骤由数组t确定。主要步骤是y[k, :] = r.integrate(t[k]),它获取解的下一个值,然后用r.set_initial_value(matA.dot(y[k, :]), t[k])更改初始条件。

import numpy as np
from scipy.integrate import ode
def f(t, y):
    return -np.sqrt(t)*y 

matA = np.array([[0, 1], [-1, 0]])
t = np.linspace(0, 10, 20)
y_0 = [2, 3]
y = np.zeros((len(t), len(y_0)))
y[0, :] = y_0
r = ode(f)
r.set_initial_value(y[0], t[0])

for k in range(1, len(t)):
    y[k, :] = r.integrate(t[k])
    r.set_initial_value(matA.dot(y[k, :]), t[k])

如此获得的y的值既不是单调的也不是正的,因为ODE的实际解将是-这表明与matA相乘会产生影响。

[[ 2.00000000e+00  3.00000000e+00]
 [ 1.55052494e+00  2.32578740e+00]
 [ 1.46027833e+00 -9.73518889e-01]
 [-5.32831945e-01 -7.99247918e-01]
 [-3.91483887e-01  2.60989258e-01]
 [ 1.16154133e-01  1.74231200e-01]
 [ 7.11807536e-02 -4.74538357e-02]
 [-1.79307961e-02 -2.68961942e-02]
 [-9.45453427e-03  6.30302285e-03]
 [ 2.07088441e-03  3.10632661e-03]
 [ 9.57623940e-04 -6.38415960e-04]
 [-1.85274552e-04 -2.77911827e-04]
 [-7.61389508e-05  5.07593005e-05]
 [ 1.31604315e-05  1.97406472e-05]
 [ 4.85413044e-06 -3.23608696e-06]
 [-7.56142819e-07 -1.13421423e-06]
 [-2.52269779e-07  1.68179853e-07]
 [ 3.56625306e-08  5.34937959e-08]
 [ 1.08295735e-08 -7.21971567e-09]
 [-1.39690370e-09 -2.09535555e-09]]